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

📄 extrabem.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -