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

📄 tetramod.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 5 页
字号:
		   (ix,iy+1) (ix+1,iy+1)				________			|\     |			| \  1 |			|  \   |			|   \  | 			| 0  \ |			|     \|			--------  		    (ix,iy) (ix+1,iy) 	    **********************************************************/	    for (ixhz=0;ixhz<nxhz-1;ixhz++) {		   for (iyhz=0;iyhz<nyhz-1;iyhz++) {		 	  tm_normal(xhz[ihz][iyhz][ixhz],xhz[ihz][iyhz][ixhz+1],			        xhz[ihz][iyhz+1][ixhz],			        yhz[ihz][iyhz][ixhz],yhz[ihz][iyhz][ixhz+1],       		                yhz[ihz][iyhz+1][ixhz],		                zhz[ihz][iyhz][ixhz],zhz[ihz][iyhz][ixhz+1],       		          	zhz[ihz][iyhz+1][ixhz],n1ll[iyhz]+ixhz,				n2ll[iyhz]+ixhz,n3ll[iyhz]+ixhz);			  tm_normal(xhz[ihz][iyhz][ixhz+1],xhz[ihz][iyhz+1][ixhz+1],				xhz[ihz][iyhz+1][ixhz],			       	yhz[ihz][iyhz][ixhz+1],yhz[ihz][iyhz+1][ixhz+1],				yhz[ihz][iyhz+1][ixhz],			        zhz[ihz][iyhz][ixhz+1],zhz[ihz][iyhz+1][ixhz+1],				zhz[ihz][iyhz+1][ixhz],n1ur[iyhz]+ixhz,                                n2ur[iyhz]+ixhz,n3ur[iyhz]+ixhz);	       	   }       	    }	    /****************************************	    Using linear interpolate the normals:	    Four corners first; four edges second;	    interior last	    ****************************************/	    n1hz[ihz][0][0]=n1ll[0][0];	    n2hz[ihz][0][0]=n2ll[0][0];	    n3hz[ihz][0][0]=n3ll[0][0];	    n1hz[ihz][0][nxhz-1]=n1ur[0][nxhz-2];	    n2hz[ihz][0][nxhz-1]=n2ur[0][nxhz-2];	    n3hz[ihz][0][nxhz-1]=n3ur[0][nxhz-2];	    n1hz[ihz][nyhz-1][0]=n1ll[nyhz-2][0];	    n2hz[ihz][nyhz-1][0]=n2ll[nyhz-2][0];	    n3hz[ihz][nyhz-1][0]=n3ll[nyhz-2][0];	    n1hz[ihz][nyhz-1][nxhz-1]=n1ur[nyhz-2][nxhz-2];	    n2hz[ihz][nyhz-1][nxhz-1]=n2ur[nyhz-2][nxhz-2];	    n3hz[ihz][nyhz-1][nxhz-1]=n3ur[nyhz-2][nxhz-2];                   for (ixhz=1;ixhz<nxhz-1;ixhz++) {	       	  n1hz[ihz][0][ixhz]=n1ll[0][ixhz-1]	      		+n1ur[0][ixhz-1]+n1ll[0][ixhz];	       	  n2hz[ihz][0][ixhz]=n2ll[0][ixhz-1]		        +n2ur[0][ixhz-1]+n2ll[0][ixhz];       		  n3hz[ihz][0][ixhz]=n3ll[0][ixhz-1]		        +n3ur[0][ixhz-1]+n1ll[0][ixhz];       		  n1hz[ihz][nyhz-1][ixhz]=n1ur[nyhz-2][ixhz-1]                        +n1ll[nyhz-2][ixhz]+n1ur[nyhz-2][ixhz]; 		  n2hz[ihz][nyhz-1][ixhz]=n2ur[nyhz-2][ixhz-1]                        +n2ll[nyhz-2][ixhz]+n2ur[nyhz-2][ixhz];  		  n3hz[ihz][nyhz-1][ixhz]=n3ur[nyhz-2][ixhz-1]                        +n3ll[nyhz-2][ixhz]+n3ur[nyhz-2][ixhz];  	    }	    for (iyhz=1;iyhz<nyhz-1;iyhz++) {	       	  n1hz[ihz][iyhz][0]=n1ll[iyhz-1][0]                        +n1ur[iyhz-1][0]+n1ll[iyhz][0];	          n2hz[ihz][iyhz][0]=n2ll[iyhz-1][0]                        +n2ur[iyhz-1][0]+n2ll[iyhz][0];		  n3hz[ihz][iyhz][0]=n3ll[iyhz-1][0]                        +n3ur[iyhz-1][0]+n3ll[iyhz][0];                  n1hz[ihz][iyhz][nxhz-1]=n1ur[iyhz-1][nxhz-2]                        +n1ll[iyhz][nxhz-2]+n1ur[iyhz][nxhz-2];		  n2hz[ihz][iyhz][nxhz-1]=n2ur[iyhz-1][nxhz-2]                        +n2ll[iyhz][nxhz-2]+n2ur[iyhz][nxhz-2];	          n3hz[ihz][iyhz][nxhz-1]=n3ur[iyhz-1][nxhz-2]                        +n3ll[iyhz][nxhz-2]+n3ur[iyhz][nxhz-2];            }		            for (iyhz=1;iyhz<nyhz-1;iyhz++) {	     	  for (ixhz=1;ixhz<nxhz-1;ixhz++) {	       	        n1hz[ihz][iyhz][ixhz]		              =n1ll[iyhz][ixhz-1]			      +n1ur[iyhz][ixhz-1]		     	      +n1ll[iyhz][ixhz]	       		      +n1ur[iyhz-1][ixhz]	       		      +n1ll[iyhz-1][ixhz]	       		      +n1ur[iyhz-1][ixhz-1];	       	        n2hz[ihz][iyhz][ixhz]                              =n2ll[iyhz][ixhz-1]                              +n2ur[iyhz][ixhz-1]                              +n2ll[iyhz][ixhz]                              +n2ur[iyhz-1][ixhz]                              +n2ll[iyhz-1][ixhz]                              +n2ur[iyhz-1][ixhz-1];		        n3hz[ihz][iyhz][ixhz]                              =n3ll[iyhz][ixhz-1]                              +n3ur[iyhz][ixhz-1]                              +n3ll[iyhz][ixhz]                              +n3ur[iyhz-1][ixhz]                              +n3ll[iyhz-1][ixhz]                              +n3ur[iyhz-1][ixhz-1];		 }	  }	  for (iyhz=0;iyhz<nyhz;iyhz++) 		 for (ixhz=0;ixhz<nxhz;ixhz++) 	            	tm_normalize(&n1hz[ihz][iyhz][ixhz],		              &n2hz[ihz][iyhz][ixhz],		       	      &n3hz[ihz][iyhz][ixhz]);      }      /******************************************      Write model parameters to hzfile      ******************************************/      fwrite(&nhz,sizeof(int),1,hzfp);      fwrite(&nxhz,sizeof(int),1,hzfp);      fwrite(&nyhz,sizeof(int),1,hzfp);      fwrite(&xmin,sizeof(float),1,hzfp);      fwrite(&xmax,sizeof(float),1,hzfp);      fwrite(&ymin,sizeof(float),1,hzfp);      fwrite(&ymax,sizeof(float),1,hzfp);      fwrite(&zmin,sizeof(float),1,hzfp);      fwrite(&zmax,sizeof(float),1,hzfp);            /**********************************************************      Output the horizon information to file hzfile:      **********************************************************/	      for (ihz=0;ihz<nhz;ihz++) {       	    if (fwrite(xhz[ihz][0],sizeof(float),nxhz*nyhz,hzfp)!=nxhz*nyhz)		  err("Can not write xhz to hzfp");		    if (fwrite(yhz[ihz][0],sizeof(float),nxhz*nyhz,hzfp)!=nxhz*nyhz)	          err("Can not write yhz to hzfp");       	    if (fwrite(zhz[ihz][0],sizeof(float),nxhz*nyhz,hzfp)!=nxhz*nyhz)		  err("Can not write zhz to hzfp");	    if (fwrite(v0hz[ihz][0],sizeof(float),nxhz*nyhz,hzfp)!=	          nxhz*nyhz)	          err("Can not write v0hz to hzfp");	    if (fwrite(v1hz[ihz][0],sizeof(float),nxhz*nyhz,hzfp)!=	          nxhz*nyhz)	          err("Can not write v1hz to hzfp");		      }      /**********************************************      For even iyhz: Lower left   Upper right                       2             1__2                       |\            \  |                       | \            \ |                       |__\            \|                       0   1            0      For odd iyhz: Lower left    Upper right                       1  2             2                       |--/            /|                       | /            / |                       |/            /__|                       0             0   1      ***********************************************/       ntrap=(nxhz-1)*(nyhz-1);         /*number of trapzoids per hz*/      nhztrap=nhz*ntrap;               /*total number of trapzoids*/      nhztrap1=(nhz+1)*ntrap;      nfacetx=(nyhz-1)*nxhz;      nhzfacetx=nhz*nfacetx;      nfacety=nyhz*(nxhz-1);      nhzfacety=nhz*nfacety;      nhzpoint=nhz*nxhz*nyhz;      if (verbose) {	    warn("ntrap=%d nhztrap=%d nhztrap1=%d",ntrap,nhztrap,nhztrap1);	    warn("nfacetx=%d nhzfacetx=%d",nfacetx,nhzfacetx);	    warn("nfacety=%d nfacety=%d",nfacety,nhzfacety);      }      npoint=2*nhzpoint;      point=(struct POINT *)malloc(npoint*sizeof(struct POINT));      if (verbose) fprintf(stderr,"npoint=%d\n",npoint);      nfacet=2*nhztrap1+             /*facet on horizons: if1 and if2*/            6*nhztrap+               /*slant: if3 if4 if5 if6 if7 and if8*/            2*nhzfacetx+             /*normal to x*/            2*nhzfacety;             /*normal to y*/      facet=(struct FACET *)malloc(nfacet*sizeof(struct FACET));      if (verbose) fprintf(stderr,"nfacet=%d\n",nfacet);      ntetra=6*nhztrap;      tetra=(struct TETRA *)malloc(ntetra*sizeof(struct TETRA));      if (verbose) fprintf(stderr,"ntetra=%d\n",ntetra);      /*Assign the control point information*/      for (ihz=0;ihz<nhz;ihz++) {	    fprintf(stderr,"processing: ihz=%d\n",ihz);            ihz0=MIN(nhz-1,ihz+1);            for (iyhz=0;iyhz<nyhz;iyhz++) {                  for (ixhz=0;ixhz<nxhz;ixhz++) {                        ip=ihz*nxhz*nyhz+iyhz*nxhz+ixhz;                        point[ip].x[0]=xhz[ihz][iyhz][ixhz];		        point[ip].x[1]=yhz[ihz][iyhz][ixhz];		        point[ip].x[2]=zhz[ihz][iyhz][ixhz];		        point[ip].s=1.0/v0hz[ihz][iyhz][ixhz]/v0hz[ihz][iyhz][ixhz];                        point[ip].n[0]=n1hz[ihz][iyhz][ixhz];                        point[ip].n[1]=n2hz[ihz][iyhz][ixhz];			point[ip].n[2]=n3hz[ihz][iyhz][ixhz];                        ip+=nhzpoint;                        point[ip].x[0]=xhz[ihz0][iyhz][ixhz];		        point[ip].x[1]=yhz[ihz0][iyhz][ixhz];		        point[ip].x[2]=zhz[ihz+1][iyhz][ixhz];		        point[ip].s=1.0/v1hz[ihz][iyhz][ixhz]/v1hz[ihz][iyhz][ixhz];                        if (ihz==nhz-1) {			      point[ip].n[0]=0.0;                              point[ip].n[1]=0.0;			      point[ip].n[2]=1.0;                        } else {			      point[ip].n[0]=n1hz[ihz+1][iyhz][ixhz];                              point[ip].n[1]=n2hz[ihz+1][iyhz][ixhz];			      point[ip].n[2]=n3hz[ihz+1][iyhz][ixhz];                        }                  }            }      }      for (ihz=0;ihz<nhz;ihz++) {            ihz0=MIN(nhz-1,ihz+1);            /*For each trapzoid*/            for (iyhz=0;iyhz<nyhz-1;iyhz++) {	          for (ixhz=0;ixhz<nxhz-1;ixhz++) {                        if1=ihz*ntrap+iyhz*(nxhz-1)+ixhz; /*left facet on hz*/                        iwh=nhztrap1;                        if2=iwh+if1;                      /*right facet on hz*/                        iwh=nhztrap1*2;                        if3=iwh+if1;                      /*upper diagonal facet*/                        iwh=nhztrap1*2+nhztrap;                        if4=iwh+if1;                      /*lower diagonal facet*/                        iwh=nhztrap1*2+nhztrap*2;                        if5=iwh+if1;                      /*left slant1 facet*/		        iwh=nhztrap1*2+nhztrap*3;		        if6=iwh+if1;                      /*right slant1 facet*/		        iwh=nhztrap1*2+nhztrap*4;                        if7=iwh+if1;                      /*left slant2 facet*/		        iwh=nhztrap1*2+nhztrap*5;		        if8=iwh+if1;                      /*right slant2 facet*/		        iwh=nhztrap1*2+nhztrap*6;                        if9=iwh+ihz*nfacetx+iyhz*nxhz+ixhz;/*upper facet facing x*/                        if10=nhzfacetx+if9;               /*lower facet facing x*/		        iwh=nhztrap1*2+nhztrap*6+nhzfacetx*2;                        if11=iwh+ihz*nfacety+iyhz*(nxhz-1)+ixhz;/*upper facet facing y*/                        if12=nhzfacety+if11;              /*lower facet facing y*/                        it1=ihz*ntrap+iyhz*(nxhz-1)+ixhz; /*left top tetra*/                        it2=nhztrap+it1;                  /*left middle tetra*/                        it3=nhztrap*2+it1;                /*left bottom tetra*/                        it4=nhztrap*3+it1;                /*right top tetra*/                        it5=nhztrap*4+it1;                /*right middle tetra*/                        it6=nhztrap*5+it1;                /*right bottom tetra*/                        i000=ihz*nxhz*nyhz+iyhz*nxhz+ixhz;/*upper 4 control point*/                        i010=i000+nxhz;                        i100=i000+1;                        i110=i000+nxhz+1;                        i001=nhzpoint+i000;    /*lower 4 control point*/                        i011=nhzpoint+i010;                        i101=nhzpoint+i100;                        i111=nhzpoint+i110;                           		        tetra[it1].ireg=ihz;		        tetra[it2].ireg=ihz;		        tetra[it3].ireg=ihz;		        tetra[it4].ireg=ihz;		        tetra[it5].ireg=ihz;		        tetra[it6].ireg=ihz;                        /*normals to other facet will be calculated later*/                        if (iyhz%2==0) {                              tetra[it1].ip[0]=i000;     /*left top tetra*/                              tetra[it1].ip[1]=i010;                              tetra[it1].ip[2]=i100;                              tetra[it1].ip[3]=i101;                              tetra[it2].ip[0]=i000;     /*left middle tetra*/                              tetra[it2].ip[1]=i010;                              tetra[it2].ip[2]=i001;                              tetra[it2].ip[3]=i101;                              tetra[it3].ip[0]=i001;     /*left bottom tetra*/                              tetra[it3].ip[1]=i011;                              tetra[it3].ip[2]=i101;                              tetra[it3].ip[3]=i010;                              tetra[it4].ip[0]=i010;     /*right top tetra*/                              tetra[it4].ip[1]=i110;                              tetra[it4].ip[2]=i100;                              tetra[it4].ip[3]=i101;                              tetra[it5].ip[0]=i010;     /*right middle tetra*/                              tetra[it5].ip[1]=i011;                              tetra[it5].ip[2]=i101;                              tetra[it5].ip[3]=i110;                              tetra[it6].ip[0]=i011;     /*right bottom tetra*/                              tetra[it6].ip[1]=i101;                              tetra[it6].ip[2]=i111;                              tetra[it6].ip[3]=i110;                              tetra[it1].ifacet[0]=if1;  /*upper left tetra*/                              tetra[it1].ifacet[1]=if3;                              tetra[it1].ifacet[2]=if11;                                      tetra[it1].ifacet[3]=if5;                              tetra[it2].ifacet[0]=if5;  /*middle left tetra*/                              tetra[it2].ifacet[1]=if9;                              tetra[it2].ifacet[2]=if12;                                      tetra[it2].ifacet[3]=if7;                              tetra[it3].ifacet[0]=if7;  /*lower left tetra*/                              tetra[it3].ifacet[1]=if10;                              tetra[it3].ifacet[2]=if4;                                      tetra[it3].ifacet[3]=if1+ntrap;                              tetra[it4].ifacet[0]=if2;  /*upper right tetra*/                              tetra[it4].ifacet[1]=if3;                              tetra[it4].ifacet[2]=if9+1;                                      tetra[it4].ifacet[3]=if6;                              tetra[it5].ifacet[0]=if6;  /*middle right tetra*/

⌨️ 快捷键说明

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