extrabem.c

来自「cfd求解器使用与gmsh网格的求解」· C语言 代码 · 共 352 行

C
352
字号
#include <stdio.h>#include <math.h>#include "fakecomplex.h"/*  Routine de Benoit. Modifiee par Christophe.  Extrapole differentes grandeurs sur une sphere, a partir du champ   electrique et de sa derivee exterieure sur des patches rectangulaires   (formant une boite).*/#define pi    3.14159265359#define mu0   4.e-7*pi#define eps0  8.85434e-12#define Nmax  100000void green(double k,double x,double y,double z,complex *c){  double r;     r=sqrt(x*x+y*y+z*z);  *c=Cdiv(fltoco(cos(k*r),-sin(k*r)),fltoco(4*pi*r,0.0));}void dgreen(double k,double x,double y,double z,complex *c){  complex  c1, c2, c3;  double   r;    r=sqrt(x*x+y*y+z*z);  c1=fltoco(cos(k*r),-sin(k*r));  c2 = Cdiv(fltoco(1,k*r),fltoco(r*r,0.0));  c3=Cprod(c1,c2);  c[0]=Cprod(c3,fltoco(x/(4*pi*r),0.0));  c[1]=Cprod(c3,fltoco(y/(4*pi*r),0.0));  c[2]=Cprod(c3,fltoco(z/(4*pi*r),0.0));}void cal_integralterm(double x, double y, double z, double k, 		      double nx, double ny, double nz,		      double exr, double eyr, double ezr, 		      double exi, double eyi, double ezi,		      double dexr, double deyr, double dezr, 		      double dexi, double deyi, double dezi,		      complex ep[3]){  complex g, dg[3], nve[3], npe, nvedg[3], nvde[3] ;  green(k,x,y,z,&g);  dgreen(k,x,y,z,&(dg[0]));    /* (n x de) G */  nvde[0] = Csub(Cprod(fltoco(ny,0),fltoco(dezr,dezi)),		 Cprod(fltoco(deyr,deyi),fltoco(nz,0)));  nvde[1] = Csub(Cprod(fltoco(nz,0),fltoco(dexr,dexi)),		 Cprod(fltoco(dezr,dezi),fltoco(nx,0)));  nvde[2] = Csub(Cprod(fltoco(nx,0),fltoco(deyr,deyi)),		 Cprod(fltoco(dexr,dexi),fltoco(ny,0)));	  Cisum(&(ep[0]),Cprod(g,nvde[0]));  Cisum(&(ep[1]),Cprod(g,nvde[1]));  Cisum(&(ep[2]),Cprod(g,nvde[2]));    /* n.e dG */  npe.r = npe.i = 0.0;  Cisum(&npe,Cprodr(nx,fltoco(exr,exi)));  Cisum(&npe,Cprodr(ny,fltoco(eyr,eyi)));  Cisum(&npe,Cprodr(nz,fltoco(ezr,ezi)));  Cisum(&(ep[0]),Cprod(npe,dg[0]));  Cisum(&(ep[1]),Cprod(npe,dg[1]));  Cisum(&(ep[2]),Cprod(npe,dg[2]));    /* (n x e)  x dG */  nve[0] = Csub(Cprod(fltoco(ny,0),fltoco(ezr,ezi)),		Cprod(fltoco(eyr,eyi),fltoco(nz,0)));  nve[1] = Csub(Cprod(fltoco(nz,0),fltoco(exr,exi)),		Cprod(fltoco(ezr,ezi),fltoco(nx,0)));  nve[2] = Csub(Cprod(fltoco(nx,0),fltoco(eyr,eyi)),		Cprod(fltoco(exr,exi),fltoco(ny,0)));	  nvedg[0] = Csub(Cprod(nve[1],dg[2]),Cprod(dg[1],nve[2]));  nvedg[1] = Csub(Cprod(nve[2],dg[0]),Cprod(dg[2],nve[0]));  nvedg[2] = Csub(Cprod(nve[0],dg[1]),Cprod(dg[0],nve[1]));	  Cisum(&(ep[0]),nvedg[0]);  Cisum(&(ep[1]),nvedg[1]);  Cisum(&(ep[2]),nvedg[2]);}void main(int argc, char *argv[]){  int      i, l, m, dum, ntheta, nphi, n1, n2, n3;  double   ecarre, ecarre_max ;  double   k, freq, om, theta0, theta1, phi0, phi1, dtheta, dphi ;  double   rp, xc, yc, zc, xp, yp, zp ;  double   x, y, z, npvec, npx, npy, npz, lnpvec;  double   s, xq[Nmax], yq[Nmax], zq[Nmax], nx[Nmax], ny[Nmax], nz[Nmax];  double   exr[Nmax], eyr[Nmax], ezr[Nmax], exi[Nmax], eyi[Nmax], ezi[Nmax];  double   sxr[Nmax], syr[Nmax], szr[Nmax], sxi[Nmax], syi[Nmax], szi[Nmax];  double   dexr[Nmax], deyr[Nmax], dezr[Nmax], dexi[Nmax], deyi[Nmax], dezi[Nmax];  double   ints, spoy, gain, intsphe ;  complex  c1, c2, c3, c4, ep[3], eptot[3], npve[3];    FILE    *pf1, *pf2, *pfs, *pf3;    if(argc!=16){    fprintf(stderr, "Usage: extrabem e de out f surf xc yc zc r\n"	            "       thet0 thet1 n phi0 phi1 n\n");    exit(1);  }    if(!(pf1 = fopen(argv[1],"r"))){    fprintf(stderr, "Unable to open file '%s'\n", argv[1]);    exit(1);  }  if(!(pf2 = fopen(argv[2],"r"))){    fprintf(stderr, "Unable to open file '%s'\n", argv[2]);    exit(1);  }  if(!(pf3 = fopen(argv[3],"w"))){    fprintf(stderr, "Unable to open file '%s'\n", argv[3]);    exit(1);  }  /*  if(!(pfs = fopen(argv[3],"r"))){    fprintf(stderr, "Unable to open file '%s'\n", argv[2]);    exit(1);  }  */  freq       = atof(argv[4]) ;  s          = atof(argv[5]) ;  xc         = atof(argv[6]) ;  yc         = atof(argv[7]) ;  zc         = atof(argv[8]) ;  rp         = atof(argv[9]) ;  theta0     = pi/180. * atof(argv[10]) ;  theta1     = pi/180. * atof(argv[11]) ;  ntheta     = atoi(argv[12]) ;  phi0       = pi/180. * atof(argv[13]) ;  phi1       = pi/180. * atof(argv[14]) ;  nphi       = atoi(argv[15]) ;  if(!ntheta || !nphi){    fprintf(stderr, "Error: ntheta or nphi == 0\n");    exit(1);  }  printf("Freq=%g, SurfPatch=%g, Center=%g,%g,%g, Radius=%g, Theta=[%g,%g], "	 "NbTheta=%d, Phi=[%g,%g], NbPhi=%d\n",	 freq, s, xc, yc, zc, rp, theta0, theta1, ntheta, phi0, phi1, nphi);  om = 2.0*pi*freq;  k = om*sqrt(mu0*eps0);    n1 = 0;  while(fscanf(pf1,"%d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\n",	       &dum, &xq[n1], &yq[n1], &zq[n1], &nx[n1], &ny[n1], &nz[n1],	       &exr[n1], &eyr[n1], &ezr[n1], &exi[n1], &eyi[n1], &ezi[n1]) != EOF){    /*    printf("%d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \n",           dum, xq[n1],yq[n1],zq[n1], nx[n1],ny[n1],nz[n1],	   exr[n1],eyr[n1],ezr[n1],exi[n1],eyi[n1],ezi[n1]) ;	   */    if(n1==Nmax){      fprintf(stderr, "Error: too many patches\n");      exit(1);    }    n1++;  }  n2=0;  while(fscanf(pf2,"%d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",	       &dum, &xq[n2],&yq[n2],&zq[n2], &nx[n2],&ny[n2],&nz[n2],	       &dexr[n2],&deyr[n2],&dezr[n2],&dexi[n2],&deyi[n2],&dezi[n2])!=EOF){    /*    printf("%d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \n",	   dum, xq[n2],yq[n2],zq[n2], nx[n2],ny[n2],nz[n2],	   dexr[n2],deyr[n2],dezr[n2],dexi[n2],deyi[n2],dezi[n2]) ;	   */    n2++;  }  n3=0; ints = 0.0 ;  /*  while(fscanf(pfs,"%d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",	       &dum, &xq[n3],&yq[n3],&zq[n3], &nx[n3],&ny[n3],&nz[n3],	       &sxr[n3],&syr[n3],&szr[n3],&sxi[n3],&syi[n3],&szi[n3])!=EOF){    ints += s * (nx[n3]*sxr[n3]+ny[n3]*syr[n3]+nz[n3]*szr[n3]) ;    n3++;  }  */  if(n1 != n2){    printf("nombre de points different pour e et de : %d != %d\n", n1, n2);    exit(1);  }  else{    printf("nombre de patchs : %d %d %d\n",n1, n2, n3);  }  dtheta = (theta1-theta0) / (double)ntheta ;  dphi   = (phi1-phi0) / (double)nphi ;  ecarre_max = intsphe = 0.0 ;    for(l=0 ; l<ntheta ; l++){        for(m=0 ; m<nphi ; m++){      xp = xc + rp * sin(theta0+(double)l*dtheta) * cos(phi0+(double)m*dphi);      yp = yc + rp * sin(theta0+(double)l*dtheta) * sin(phi0+(double)m*dphi);      zp = zc + rp * cos(theta0+(double)l*dtheta) ;      npx=(xp-xc)/rp;      npy=(yp-yc)/rp;      npz=(zp-zc)/rp;            eptot[0].r = eptot[0].i = 0. ;      eptot[1].r = eptot[1].i = 0. ;       eptot[2].r = eptot[2].i = 0. ;            for(i=0;i<n1;i++){ /* boucle sur les patches */	ep[0].r = ep[0].i = 0. ;	ep[1].r = ep[1].i = 0. ;	ep[2].r = ep[2].i = 0. ;	x = xp - xq[i];	y = yp - yq[i];	z = zp - zq[i];	cal_integralterm(x, y, z, k,			 nx[i],ny[i],nz[i],			 exr[i],eyr[i],ezr[i],exi[i],eyi[i],ezi[i],			 dexr[i],deyr[i],dezr[i],dexi[i],deyi[i],dezi[i],			 ep) ;	/*	switch(symmetry){	case 0 : break ;	case 1 : x = xp - (-xq[i]-2*symdist); nx[i] *= -1 ; break ;	case 2 : y = yp - (-yq[i]-2*symdist); ny[i] *= -1 ; break ;	case 3 : 	  z = zp - (-zq[i]-2*symdist) ; 	  nz[i] *= -1 ; 	  exr[i] *= -1 ; 	  exi[i] *= -1 ;	  	  eyr[i] *= -1 ; 	  eyi[i] *= -1 ;	  	  break ;	default : fprintf(stderr, "Unknown symmetry\n"); exit(1);	}	if(symmetry){	  cal_integralterm(x,y,z,k,			   nx[i],ny[i],nz[i],			   exr[i],eyr[i],ezr[i],exi[i],eyi[i],ezi[i],			   dexr[i],deyr[i],dezr[i],dexi[i],deyi[i],dezi[i],			   ep) ;	}	switch(symmetry){	case 0 : break ;	case 1 : 	  nx[i] *= -1 ; 	  break ;	case 2 : 	  ny[i] *= -1 ; 	  break ;	case 3 : 	  nz[i] *= -1 ; 	  exr[i] *= -1 ; 	  exi[i] *= -1 ;	  	  eyr[i] *= -1 ; 	  eyi[i] *= -1 ;	  	  break ;	default : fprintf(stderr, "Unknown symmetry\n"); exit(1);	}	*/  	/* multiplication par la surface */	Ciprod(&(ep[0]),fltoco(s,0.0));	Ciprod(&(ep[1]),fltoco(s,0.0));	Ciprod(&(ep[2]),fltoco(s,0.0));		/* eptot = sum of ep on all patches */	Cisum(&(eptot[0]),ep[0]);	Cisum(&(eptot[1]),ep[1]);	Cisum(&(eptot[2]),ep[2]);      } /* for i */            fprintf(stderr, "%d %d  \r",l, m);      ecarre = 	eptot[0].r * eptot[0].r +	eptot[0].i * eptot[0].i +	eptot[1].r * eptot[1].r +	eptot[1].i * eptot[1].i +	eptot[2].r * eptot[2].r +	eptot[2].i * eptot[2].i ;      if(ecarre > ecarre_max) ecarre_max = ecarre ;      npve[0] = Csub(Cprod(fltoco(npy,0),eptot[2]),Cprod(eptot[1],fltoco(npz,0)));      npve[1] = Csub(Cprod(fltoco(npz,0),eptot[0]),Cprod(eptot[2],fltoco(npx,0)));      npve[2] = Csub(Cprod(fltoco(npx,0),eptot[1]),Cprod(eptot[0],fltoco(npy,0)));      npvec = 	npve[0].r * npve[0].r +	npve[1].r * npve[1].r +	npve[2].r * npve[2].r +	npve[0].i * npve[0].i +	npve[1].i * npve[1].i +	npve[2].i * npve[2].i ;      /*      spoy = npvec / (120*pi) ;      gain = 4*pi*rp*rp * spoy / (ints/(2*pi*freq*mu0)) ;      */      intsphe += npvec * rp*rp * sin(theta0+(double)l*dtheta) * dtheta * dphi ;#if 0            fprintf(pf3,	      "%12.5e %12.5e %12.5e "	      "%12.5e "	      "%12.5e %12.5e %12.5e %12.5e %12.5e %12.5e "	      "%12.5e %12.5e "	      "%12.5e %12.5e %12.5e\n",	      xp,yp,zp,	      (double)l*dtheta,	      (double)l*dphi,	      eptot[0].r,eptot[1].r,eptot[2].r,eptot[0].i,eptot[1].i,eptot[2].i,	      ecarre,npvec,	      npvec*npx,npvec*npy,npvec*npz);#endif      xp = ecarre * sin(theta0+(double)l*dtheta) * cos(phi0+(double)m*dphi);      yp = ecarre * sin(theta0+(double)l*dtheta) * sin(phi0+(double)m*dphi);      zp = ecarre * cos(theta0+(double)l*dtheta) ;      fprintf(pf3,	      "%12.5e %12.5e %12.5e %12.5e %12.5e %12.5e %12.5e \n",	      (double)l*dtheta,(double)m*dphi,ecarre,xp,yp,zp,	      npvec);      fflush(pf3);    }        if(nphi>1) fprintf(pf3, "\n");      }  printf("\necarre_max max=%g, intsph_e=%g\n", ecarre_max, intsphe);  }

⌨️ 快捷键说明

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