⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tetramod.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 5 页
字号:
      if (!getparstring("hzfile",&hzfile)) 	       	    err("Must specify hzfile");       if (!getparint("verbose",&verbose)) 	       	    verbose=0;      nficth=countparval("ficth");      ficth=alloc1int(nficth);      getparint("ficth",ficth);      if (nficth==1 && ficth[0]==-1) nficth=0;      if (verbose) {	    fprintf(stderr,"nficth=%d\n",nficth);            for (ifict=0;ifict<nficth;ifict++)                  fprintf(stderr,"ficth[%d]=%d",ifict,ficth[ifict]);      }      if (!getparfloat("blt",&blt)) blt=1.0;      if (verbose)	    warn("hzfile=%s\n",hzfile);      if (!getparfloat("xmin",&xmin)) xmin=0.0;      if (!getparfloat("xmax",&xmax)) xmax=2.0;      if (!getparfloat("ymin",&ymin)) ymin=0.0;      if (!getparfloat("ymax",&ymax)) ymax=2.0;      if (!getparfloat("zmax",&zmax)) zmax=0.0;      if ((hzfp=fopen(hzfile,"w"))==NULL)       	    err("Can not open hzfile");      if (verbose) {       	    warn("nhz=%d",nhz);            warn("xmin=%g\nxmax=%g\nymin=%g\nymax=%g\n",xmin,xmax,ymin,ymax);      }	      z00   =alloc1float(nhz);      z01   =alloc1float(nhz);      z10   =alloc1float(nhz);      z11   =alloc1float(nhz);      v00   =alloc1float(nhz);	      v01   =alloc1float(nhz);      v10   =alloc1float(nhz);      v11   =alloc1float(nhz);      dvdz00=alloc1float(nhz);      dvdz01=alloc1float(nhz);      dvdz10=alloc1float(nhz);      dvdz11=alloc1float(nhz);      iihz=ealloc1int(nhz);      if (!getparfloat("z00",z00))	    for(ihz=0;ihz<nhz;ihz++) 	       	  z00[ihz] = ihz*0.6;      if (!getparfloat("z01",z01))	    for(ihz=0;ihz<nhz;ihz++) 		  z01[ihz] = ihz*0.6;      if (!getparfloat("z10",z10))	    for(ihz=0;ihz<nhz;ihz++) 		  z10[ihz] = ihz*0.6;      if (!getparfloat("z11",z11))	    for(ihz=0;ihz<nhz;ihz++) 	       	  z11[ihz] = ihz*0.6;      if (verbose) {	       	    for (ihz=0;ihz<nhz;ihz++) 	       	  warn("layer %d z: %f %f %f %f",ihz,			z00[ihz],z01[ihz],z10[ihz],z11[ihz]);      }      /************************************************      The default velocity is 2.0,3.0,...,in km/s      ************************************************/      if (!getparfloat("v00",v00))	    for(ihz=0;ihz<nhz;ihz++) v00[ihz] = ihz+1;      if (!getparfloat("v01",v01))	    for(ihz=0;ihz<nhz;ihz++) v01[ihz] = ihz+1;      if (!getparfloat("v10",v10))	    for(ihz=0;ihz<nhz;ihz++) v10[ihz] = ihz+1;      if (!getparfloat("v11",v11))	    for(ihz=0;ihz<nhz;ihz++) v11[ihz] = ihz+1;      if (verbose) 	    for (ihz=0;ihz<nhz;ihz++) 		  warn("layer %d v: %f %f %f %f",ihz,		       v00[ihz],v01[ihz],v10[ihz],v11[ihz]);      if (!getparfloat("dvdz00",dvdz00))	    for(ihz=0;ihz<nhz;ihz++) dvdz00[ihz] = 0.0;      if (!getparfloat("dvdz01",dvdz01))	    for(ihz=0;ihz<nhz;ihz++) dvdz01[ihz] = 0.0;      if (!getparfloat("dvdz10",dvdz10))	    for(ihz=0;ihz<nhz;ihz++) dvdz10[ihz] = 0.0;      if (!getparfloat("dvdz11",dvdz11))	    for(ihz=0;ihz<nhz;ihz++) dvdz11[ihz] = 0.0;      if (verbose) 	    for (ihz=0;ihz<nhz;ihz++) 		  warn("layer %d dvdz: %f %f %f %f",ihz,		       dvdz00[ihz],dvdz01[ihz],dvdz10[ihz],dvdz11[ihz]);      /*************************************************      Get the size of the horizon (in triangles), which is      not necessary to be equal to nx and ny, and these      grids are not uniform       *************************************************/      warn("nxhz=%d",nxhz);      warn("nyhz=%d",nyhz);      if (nxhz<=1) err("nxhz must >1");      if (nyhz<=2) err("nyhz must >2");      if (nyhz/2*2==nyhz) err("nyhz must be an odd number\n");      n1hz=ealloc3float(nxhz,nyhz,nhz);      n2hz=ealloc3float(nxhz,nyhz,nhz);      n3hz=ealloc3float(nxhz,nyhz,nhz);      n1ll=ealloc2float(nxhz-1,nyhz-1);      n1ur=ealloc2float(nxhz-1,nyhz-1);      n2ll=ealloc2float(nxhz-1,nyhz-1);      n2ur=ealloc2float(nxhz-1,nyhz-1);      n3ll=ealloc2float(nxhz-1,nyhz-1);      n3ur=ealloc2float(nxhz-1,nyhz-1);      xhz=ealloc3float(nxhz,nyhz,nhz);      yhz=ealloc3float(nxhz,nyhz,nhz);      zhz=ealloc3float(nxhz,nyhz,nhz+1);      v0hz=ealloc3float(nxhz,nyhz,nhz);      v0hztem=ealloc3float(nxhz,nyhz,nhz);      v1hz=ealloc3float(nxhz,nyhz,nhz);      dvdzhz=ealloc3float(nxhz,nyhz,nhz);      dvdzhztem=ealloc3float(nxhz,nyhz,nhz);      zflat=ealloc3float(nxhz,nyhz,nhz);      /*these dxhz and dyhz will only be used if there is no xhz and yhz       provided*/      dxhz=(xmax-xmin)/(nxhz-1);      dyhz=(ymax-ymin)/(nyhz-1);      for (ihz=0;ihz<nhz;ihz++) {	    sprintf(xfile,"x%dfile",ihz);	    sprintf(yfile,"y%dfile",ihz);	    sprintf(zfile,"z%dfile",ihz);	    sprintf(vfile,"v%dfile",ihz);	    sprintf(dvdzfile,"dvdz%dfile",ihz);	    if (verbose==1) 		  warn("%s %s %s %s %s",xfile,		       	yfile,zfile,vfile,dvdzfile);			    if (getparstring(xfile,&xfile)) {		  if (fread(xhz[ihz][0],sizeof(float),nxhz*nyhz,		       	fopen(xfile,"r"))!=nxhz*nyhz)		       	err("Can not read in %s\n",xfile);		  warn("read in %s",xfile);		  for (iyhz=0;iyhz<nyhz;iyhz++) {		        if (fabs(xhz[ihz][iyhz][0]-xmin)>EPS) 		              err("xhz[%d][%d][0] != xmin, not allowed",ihz,iyhz);		        else			      xhz[ihz][iyhz][0]=xmin;			if (fabs(xhz[ihz][iyhz][nxhz-1]-xmax)>EPS)			      err("xhz[%d][%d][%d]=%e != xmax=%e,not allowed",			      ihz,iyhz,nxhz-1,xhz[ihz][iyhz][nxhz-1],xmax);			else			      xhz[ihz][iyhz][nxhz-1]=xmax;		  }	    } else { 		  warn("Using uniform Cartesian grids for x-horizon%d",ihz);		  for (ixhz=0;ixhz<nxhz;ixhz++)		       	for (iyhz=0;iyhz<nyhz;iyhz++)		       		xhz[ihz][iyhz][ixhz]=xmin+dxhz*ixhz; 	    }	    if (getparstring(yfile,&yfile)) {	       	  if (fread(yhz[ihz][0],sizeof(float),nxhz*nyhz,		       	fopen(yfile,"r"))!=nyhz*nxhz)		       	      err("Can not read in %s\n",yfile);		  warn("read in %s",yfile);		  for (ixhz=0;ixhz<nxhz;ixhz++) {		        if (fabs(yhz[ihz][0][ixhz]-ymin)>EPS) 		      	      err("yhz[%d][0][%d]=%e != ymin=%e,not allowed",ihz,ixhz,			      yhz[ihz][0][ixhz],ymin);			else			      yhz[ihz][0][ixhz]=ymin;			if (fabs(yhz[ihz][nyhz-1][ixhz]-ymax)>EPS)			      err("yhz[%d][%d][%d]=%e!=ymax=%e,not allowed",			           ihz,nyhz-1,ixhz,yhz[ihz][nyhz-1][ixhz],ymax);			else			      yhz[ihz][nyhz-1][ixhz]=ymax;		  }	    } else {		  warn("Using uniform Cartesian grids for y-horizon%d",ihz);		  for (ixhz=0;ixhz<nxhz;ixhz++)		        for (iyhz=0;iyhz<nyhz;iyhz++)		      	      yhz[ihz][iyhz][ixhz]=ymin+iyhz*dyhz;	    }	    if (getparstring(zfile,&zfile)) {		  if (fread(zhz[ihz][0],sizeof(float),nyhz*nxhz,		        fopen(zfile,"r"))!=nyhz*nxhz)		        err("Can not read in %s\n",zfile);		  warn("read in %s",zfile);	    } else {	          warn("Using uniform cartesian grids for z-horizon%d",ihz);	          for (ixhz=0;ixhz<nxhz;ixhz++)	       	        for (iyhz=0;iyhz<nyhz;iyhz++)			      zhz[ihz][iyhz][ixhz]=0;	    }		    if (getparstring(vfile,&vfile)) {       	          if (fread(v0hz[ihz][0],sizeof(float),	       	        nxhz*nyhz,fopen(vfile,"r"))!=		       	      nxhz*nyhz)       			      err("Can not read in %s\n",vfile);  		  warn("read in %s",vfile);	    } else {		  warn("Using default for v-horizon %d",ihz);	          for (ixhz=0;ixhz<nxhz;ixhz++)		        for (iyhz=0;iyhz<nyhz;iyhz++)		       	      v0hz[ihz][iyhz][ixhz]=0;	    }	    if (getparstring(dvdzfile,&dvdzfile)) {	          if (fread(dvdzhz[ihz][0],sizeof(float),nyhz*nxhz,			fopen(dvdzfile,"r"))!=nyhz*nxhz)       		       	      err("Can not read in %s\n",dvdzfile);  		  warn("read in %s",dvdzfile);	    } else {		  warn("Using default for dvdz-horizon %d",ihz);		  for (ixhz=0;ixhz<nxhz;ixhz++)			for (iyhz=0;iyhz<nyhz;iyhz++)			      dvdzhz[ihz][iyhz][ixhz]=0;	    }	    /*************************************************************	    zhz is added to the plane determined by the four corners	    *************************************************************/	    for (ixhz=0;ixhz<nxhz;ixhz++){	          for (iyhz=0;iyhz<nyhz;iyhz++) {		        alpha=(xhz[ihz][iyhz][ixhz]-xmin)/(xmax-xmin);		        fz0=alpha*z01[ihz]+(1-alpha)*z00[ihz];		        fz1=alpha*z11[ihz]+(1-alpha)*z10[ihz];		        beta =(yhz[ihz][iyhz][ixhz]-ymin)/(ymax-ymin);		        zflat[ihz][iyhz][ixhz]=beta*fz1+(1-beta)*fz0;			zhz[ihz][iyhz][ixhz]+=zflat[ihz][iyhz][ixhz];		  }	    }      }      for (iyhz=0;iyhz<nyhz;iyhz++)            for (ixhz=0;ixhz<nxhz;ixhz++)	          zmax=MAX(zmax,zhz[nhz-1][iyhz][ixhz]);      zmax+=blt;      for (iyhz=0;iyhz<nyhz;iyhz++)            for (ixhz=0;ixhz<nxhz;ixhz++)	          zhz[nhz][iyhz][ixhz]=zmax;      for (ihz=0;ihz<nhz;ihz++) {  	    if (nficth!=0 && ihz!=0) {	          for (iiihz=ihz;iiihz>=0;iiihz--) {		        for (ifict=0;ifict<nficth;ifict++)                               if (iiihz==ficth[ifict]) break;                        if (ifict==nficth) break;                  }                  iihz[ihz]=iiihz;                  if (iiihz==nhz) iihz[ihz]=ihz;            } else                  iihz[ihz]=ihz;            /* iihz is the previous non-fictitious horizon */            fprintf(stderr,"iihz[%d]=%d\n",ihz,iihz[ihz]);      }      for (ihz=0;ihz<nhz;ihz++)	    for (ixhz=0;ixhz<nxhz;ixhz++)	          for (iyhz=0;iyhz<nyhz;iyhz++) {                        v0hztem[ihz][iyhz][ixhz]=v0hz[ihz][iyhz][ixhz];			dvdzhztem[ihz][iyhz][ixhz]=dvdzhz[ihz][iyhz][ixhz];	          }      for (ihz=0;ihz<nhz;ihz++){	    /*************************************************************	    v0hz and dvdzhz are added to the velocity plane determined by 	    velocity at the four corners	    *************************************************************/	    for (ixhz=0;ixhz<nxhz;ixhz++){	          for (iyhz=0;iyhz<nyhz;iyhz++){                        iiihz=iihz[ihz];                        if (ihz<nhz-1) {			      if (zhz[ihz][iyhz][ixhz]>zhz[ihz+1][iyhz][ixhz]) { 			            SWAP(zhz[ihz][iyhz][ixhz],zhz[ihz+1][iyhz][ixhz]);                                    iiihz=iihz[ihz+1];			      }                        }	     	      	alpha=(xhz[ihz][iyhz][ixhz]-xmin)/(xmax-xmin);	       	        fv0=alpha*v01[iiihz]+(1-alpha)*v00[iiihz];	       	        fv1=alpha*v11[iiihz]+(1-alpha)*v10[iiihz];	       	        fdvdz0=alpha*dvdz01[iiihz]+(1-alpha)*dvdz00[iiihz];	       	        fdvdz1=alpha*dvdz11[iiihz]+(1-alpha)*dvdz10[iiihz];	       	        beta=(yhz[ihz][iyhz][ixhz]-ymin)/(ymax-ymin);			vtemp=v0hztem[iiihz][iyhz][ixhz]+	       	              beta*fv1+(1-beta)*fv0;	       	        dvdzhz[ihz][iyhz][ixhz]=dvdzhztem[iiihz][iyhz][ixhz]+	       	              beta*fdvdz1+(1-beta)*fdvdz0;			v0hz[ihz][iyhz][ixhz]=vtemp+			      dvdzhz[ihz][iyhz][ixhz]*(zhz[ihz][iyhz][ixhz]-			      zflat[iiihz][iyhz][ixhz]);                        v1hz[ihz][iyhz][ixhz]=vtemp+                              dvdzhz[ihz][iyhz][ixhz]*(                              zhz[ihz+1][iyhz][ixhz]-                              zflat[iiihz][iyhz][ixhz]);                        #ifdef DEBUG                        if (ixhz==0 && iyhz==0) {                              fprintf(stderr,"iiihz=%d v0hz=%f v1hz=%f \n",                              iiihz,v0hz[ihz][iyhz][ixhz],v1hz[ihz][iyhz][ixhz]);                              fprintf(stderr,"vtemp=%f\n",vtemp);                              fprintf(stderr,"zflat=%f zhz=%f\n",                              zflat[iiihz][iyhz][ixhz],zhz[ihz][iyhz][ixhz]);                        }                        #endif		  }	    }	    /**********************************************************	    Output the normals for suwfrayt3d	    All triangles look like:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -