#include #include #include #define NX 62 #define NY 100 #define NZ 14 // #define NX 40 // #define NY 40 // #define NZ 40 #define NFREQS 3 #define NSTEPS 5000 #define NPML 7 main() { // VARIABLES int ia,ja,ka,ib,jb,kb,ic,jc,kc; int i,j,k,m,n; float ddx,dt,T,pi,e0,muz,ra_x,ra_y,courant; float t0,spread,pulse,f_peak; ia = 0; ja = 14; ka = 7; ib = NX - ia - 1; jb = NY - ja - 1; kb = NZ - ka - 1; ic = NX/2; jc = NY/2; kc = NZ/2; courant = 0.5; muz = 4*pi*1.e-7; ddx = 0.01; dt = ddx/6e8; e0 = 8.854e-12; pi = 3.14159; t0 = 20.0; spread = 6.0; T = 0; f_peak = .05; // FIELDS float gax[NX][NY][NZ], gay[NX][NY][NZ], gaz[NX][NY][NZ]; float gbx[NX][NY][NZ], gby[NX][NY][NZ], gbz[NX][NY][NZ]; float dx[NX][NY][NZ], dy[NX][NY][NZ], dz[NX][NY][NZ]; float ex[NX][NY][NZ], ey[NX][NY][NZ], ez[NX][NY][NZ]; float hx[NX][NY][NZ], hy[NX][NY][NZ], hz[NX][NY][NZ]; float ix[NX][NY][NZ], iy[NX][NY][NZ], iz[NX][NY][NZ]; float curl_h, curl_e; // TF/SF BUFFERS float idxl[ia][NY][NZ], idxh[ia][NY][NZ], ihxl[ia][NY][NZ], ihxh[ia][NY][NZ]; float idyl[NX][ja][NZ], idyh[NX][ja][NZ], ihyl[NX][ja][NZ], ihyh[NX][ja][NZ]; float idzl[NX][NY][ka], idzh[NX][NY][ka], ihzl[NX][NY][ka], ihzh[NX][NY][ka]; int ixh, jyh, kzh; float xn,xxn; // PML PARAMETERS float gi1[NX],gi2[NX],gi3[NX],fi1[NX],fi2[NX],fi3[NX]; float gj1[NY],gj2[NY],gj3[NY],fj1[NY],fj2[NY],fj3[NY]; float gk1[NZ],gk2[NZ],gk3[NZ],fk1[NZ],fk2[NZ],fk3[NZ]; // WAVE PROPOGATION BUFFERS float ez_inc[NY], hx_inc[NY]; // FOURIER TRANSFORM ARRAYS float freq[NFREQS], arg[NFREQS]; float real_pt[NFREQS][NX][NY],imag_pt[NFREQS][NX][NY]; float ampl[NX][NY], phase[NX][NY]; float real_in[NFREQS], imag_in[NFREQS], ampl_in[NFREQS], phase_in[NFREQS]; // DIELECTRIC SPHERE PARAMETERS float dist, xdist, ydist, zdist; float radius, epsilon, sigma, epsilon_free, sigma_free, eps, cond, e_sub; // FILE I/0 FILE *fp, *fp2, *shape_file, *source_file, *fopen(); int pixel, shape[NX*NY*NZ]; //source[NX*NY*NZ]; unsigned long it; char line[10]; int use_shape = 1; ra_y = 0.6625; ra_x = 0.6812; e_sub = 2.2; int i_patch_st, i_patch_end, j_patch_st, j_patch_end, j_ref, kstart, kend, k_ref, istart, iend, ktop; float feed[NX][NZ], i_ref; int j_feed; // ******************************* // ******* IMPORT GEOMETRY ******* // ******************************* shape_file = fopen("shape.dat","r"); while (fgets(line,10, shape_file) != NULL) { sscanf(line,"%d", &pixel); if (pixel < 256) { shape[it] = pixel; it++; } } fclose(shape_file); // source_file = fopen("source.dat","r"); // while (fgets(line,10, source_file) != NULL) { // sscanf(line,"%d", &pixel); // if (pixel < 256) { // source[it] = pixel; // it++; // } // } // fclose(source_file); for (k=0; k < NZ; k++) { for (j=0; j < NY; j++) { for (i=0; i < NX; i++) { ex[i][j][k] = 0.0; ey[i][j][k] = 0.0; ez[i][j][k] = 0.0; dx[i][j][k] = 0.0; dy[i][j][k] = 0.0; dz[i][j][k] = 0.0; hx[i][j][k] = 0.0; hy[i][j][k] = 0.0; hz[i][j][k] = 0.0; gax[i][j][k] = 1.0; gay[i][j][k] = 1.0; gaz[i][j][k] = 1.0; gbx[i][j][k] = 0.0; gby[i][j][k] = 0.0; gbz[i][j][k] = 0.0; feed[i][k] = 0.0; } } } freq[0] = 10.e6; freq[1] = 100.e6; freq[2] = 433.e6; for (n=0; n < NFREQS; n++) { arg[n] = 2*pi*freq[n]*dt; real_in[n] = 0.; imag_in[n] = 0.; for (j=0; j < NY; j++) { for (i = 0; i < NX; i++) { real_pt[n][i][j] = 0.; imag_pt[n][i][j] = 0.; } } } if (use_shape == 1) { // patch_antenna kstart = 0; kend = 2; istart = 20; iend = 24; // id_cap // kstart = 13; // kend =21; // istart = 15; // iend = 24; // kstart = 2; // kend = 2; // istart = 24; // iend = 34; j_feed = ja; it = 0; for (k=0; k < NZ; k++) { for (j=NY-1; j >= 0; j--) { for (i=0; i < NX; i++) { gax[i][j][k] = 1.-shape[it]/255.; gay[i][j][k] = 1.-shape[it]/255.; gaz[i][j][k] = 1.-shape[it]/255.; if (i <= iend && i >= istart) { if (k <= kend && k >= kstart) { feed[i][k] = 1.0; } } it++; // printf("%d\t%d\t%d\t%d\t%f\n",i,j,k,shape[it],gax[i][j][k]); } } } // for (j=1; j < NY-1; j++) { // for (i=1; i < NX-1; i++) { // gaz[i][j][0] = 116./255.; // } // } // printf("%d\t%d\t%d\t%d\t%d\n",j_feed,istart,iend,kstart,kend); // it = 0; // for (k=0; k < NZ; k++) { // for (j=NY-1; j >= 0; j--) { // for (i=0; i < NX; i++) { // if (shape[it] == 0) { // if (k <= 2) { // gax[i][j][k] = 1./e_sub; // gay[i][j][k] = 1./e_sub; // gaz[i][j][k] = 1./e_sub; // } else { // gax[i][j][k] = 1.; // gay[i][j][k] = 1.; // gaz[i][j][k] = 1.; // } // } else if (shape[it] == 127) { // gax[i][j][k] = 1./e_sub; // gay[i][j][k] = 1./e_sub; // gaz[i][j][k] = 1./e_sub; // feed[i][k] = 1.; // j_feed = j; // // if (k > kend) { // // kend = k; // // } else if (k < kstart) { // // kstart =k; // // } // // if (i > iend) { // // iend = i; // // } else if (i < istart) { // // istart = i; // // } // printf("%d\t%d\t%d\n",i,j,k); // } else if (shape[it] == 255) { // gax[i][j][k] = 0.; // gay[i][j][k] = 0.; // } // // printf("%d\t%d\t%d\t%lu\t%d\n",i,j,k,it,shape[it]); // it++; // } // } // } // printf("%d\t%d\t%d\t%d\t%d\n",j_feed,istart,iend,kstart,kend); } else if (use_shape == 2) { // dipole antenna for (k=kc-10; k < kc+10; k++) { gaz[ic][jc][k] = 0.0; } gaz[ic][jc][kc] = 1.0; } else if (use_shape == 3) { // dialectric sphere epsilon = 30.; sigma = 0.3; radius = 10.; epsilon_free = 1.; sigma_free = 0.; for (i=ia; i < ib; i++) { xdist = ic-i-0.5; for (j=ja; j < jb; j++) { ydist = jc-j; for (k=ka; k < kb; k++) { eps=epsilon_free; cond=sigma_free; zdist = kc-k; dist = sqrt(pow(xdist,2.) + pow(ydist,2.) + pow(zdist,2.)); if (dist <= radius) { eps = epsilon; cond = sigma; } gax[i][j][k] = 1./(eps + (cond*dt/e0)); gbx[i][j][k] = cond*dt/e0; } } } for (i=ia; i < ib; i++) { xdist = ic-i; for (j=ja; j < jb; j++) { ydist = jc-j-0.5; for (k=ka; k < kb; k++) { eps=epsilon_free; cond=sigma_free; zdist = kc-k; dist = sqrt(pow(xdist,2.) + pow(ydist,2.) + pow(zdist,2.)); if (dist <= radius) { eps = epsilon; cond = sigma; } gay[i][j][k] = 1./(eps + (cond*dt/e0)); gby[i][j][k] = cond*dt/e0; } } } for (i=ia; i < ib; i++) { xdist = ic-i; for (j=ja; j < jb; j++) { ydist = jc-j; for (k=ka; k < kb; k++) { eps=epsilon_free; cond=sigma_free; zdist = kc-k-0.5; dist = sqrt(pow(xdist,2.) + pow(ydist,2.) + pow(zdist,2.)); if (dist <= radius) { eps = epsilon; cond = sigma; } gaz[i][j][k] = 1./(eps + (cond*dt/e0)); gbz[i][j][k] = cond*dt/e0; } } } } else if (use_shape == 4) { kstart = 0; kend = 2; ktop = 2; istart = ia+9; iend = istart+6; i_ref = istart + (iend-istart)/2.; i_patch_st = ia+10;//ia+5; i_patch_end = i_patch_st + 31; j_patch_end = jb-5; j_patch_st = j_patch_end - 39; j_ref = j_patch_st - 30; k_ref = ktop-1; j_feed = ja; // patch antenna for (j=0; j < NY; j++) { for (i=0; i < NX; i++) { for (k=0; k <= ktop; k++) { gax[i][j][k] = 1./e_sub; gay[i][j][k] = 1./e_sub; gaz[i][j][k] = 1./e_sub; } } } for (j=1; j < NY-1; j++) { for (i=1; i < NX-1; i++) { gax[i][j][0] = 0.; gay[i][j][0] = 0.; } } for (i=istart; i <= iend; i++) { for (k=0; k <= ktop; k++) { feed[i][k] = 1.; } } // printf("feed"); for (j=1; j <= j_patch_st; j++) { for (i=istart; i <= iend-1; i++) { gax[i][j][ktop+1] = 0.; gay[i][j][ktop+1] = 0.; // printf("%d\t%d\n",i,j); } } // printf("patch"); for (j=j_patch_st; j <= j_patch_end; j++) { for (i=ia+1; i <= ib-1; i++) { gax[i][j][ktop+1] = 0.; gay[i][j][ktop+1] = 0.; // printf("%d\t%d\n",i,j); } } } // *********************************************** // ********** INITIALIZE TF/SF VARIABLES ********* // *********************************************** for (i=0; i < ia; i++) { for (j=0; j < NY; j++) { for (k=0; k < NZ; k++) { idxl[i][j][k] = 0.0; idxh[i][j][k] = 0.0; ihxl[i][j][k] = 0.0; ihxh[i][j][k] = 0.0; } } } for (i=0; i < NX; i++) { for (j=0; j < ja; j++) { for (k=0; k < NZ; k++) { idyl[i][j][k] = 0.0; idyh[i][j][k] = 0.0; ihyl[i][j][k] = 0.0; ihyh[i][j][k] = 0.0; } } } for (i=0; i < NX; i++) { for (j=0; j < NY; j++) { for (k=0; k < ka; k++) { idzl[i][j][k] = 0.0; idzh[i][j][k] = 0.0; ihzl[i][j][k] = 0.0; ihzh[i][j][k] = 0.0; } } } // *********************************************** // ********** INITIALIZE PML PARAMETERS ********** // *********************************************** for (i=0; i < NX; i++) { gi1[i] = 0.0; gi2[i] = 1.0; gi3[i] = 1.0; fi1[i] = 0.0; fi2[i] = 1.0; fi3[i] = 1.0; } for (j=0; j < NY; j++) { gj1[j] = 0.0; gj2[j] = 1.0; gj3[j] = 1.0; fj1[j] = 0.0; fj2[j] = 1.0; fj3[j] = 1.0; } for (k=0; k < NZ; k++) { gk1[k] = 0.0; gk2[k] = 1.0; gk3[k] = 1.0; fk1[k] = 0.0; fk2[k] = 1.0; fk3[k] = 1.0; } // X for (i=0; i < NPML; i++) { xxn = (NPML-i)/NPML; // goes from 1 to 0 xn = 0.33*pow(xxn,3.0); fi1[i] = xn; fi1[NX-i-1] = xn; gi2[i] = 1.0/(1.0+xn); gi2[NX-i-1] = 1.0/(1.0+xn); gi3[i] = (1.0-xn)/(1.0+xn); gi3[NX-i-1] = (1.0-xn)/(1.0+xn); xxn = (NPML-i-0.5)/NPML; xn = 0.33*pow(xxn,3.0); gi1[i] = xn; gi1[NX-i-2] = xn; fi2[i] = 1.0/(1.0+xn); fi2[NX-i-2] = 1.0/(1.0+xn); fi3[i] = (1.0-xn)/(1.0+xn); fi3[NX-i-2] = (1.0-xn)/(1.0+xn); } // Y for (j=0; j < NPML; j++) { xxn = (NPML-j)/NPML; // goes from 1 to 0 xn = 0.33*pow(xxn,3.0); fj1[j] = xn; fj1[NY-j-1] = xn; gj2[j] = 1.0/(1.0+xn); gj2[NY-j-1] = 1.0/(1.0+xn); gj3[j] = (1.0-xn)/(1.0+xn); gj3[NY-j-1] = (1.0-xn)/(1.0+xn); xxn = (NPML-j-0.5)/NPML; xn = 0.33*pow(xxn,3.0); gj1[j] = xn; gj1[NY-j-2] = xn; fj2[j] = 1.0/(1.0+xn); fj2[NY-j-2] = 1.0/(1.0+xn); fj3[j] = (1.0-xn)/(1.0+xn); fj3[NY-j-2] = (1.0-xn)/(1.0+xn); } // Z for (k=0; k < NPML; k++) { xxn = (NPML-k)/NPML; // goes from 1 to 0 xn = 0.33*pow(xxn,3.0); // fk1[k] = xn; fk1[NZ-k-1] = xn; // gk2[k] = 1.0/(1.0+xn); gk2[NZ-k-1] = 1.0/(1.0+xn); // gk3[k] = (1.0-xn)/(1.0+xn); gk3[NZ-k-1] = (1.0-xn)/(1.0+xn); xxn = (NPML-k-0.5)/NPML; xn = 0.33*pow(xxn,3.0); // gk1[k] = xn; gk1[NZ-k-2] = xn; // fk2[k] = 1.0/(1.0+xn); fk2[NZ-k-2] = 1.0/(1.0+xn); // fk3[k] = (1.0-xn)/(1.0+xn); fk3[NZ-k-2] = (1.0-xn)/(1.0+xn); } // *********************************************** // ************ OPEN DATA OUTPUT FILES *********** // *********************************************** fp = fopen("data.dat","w"); fp2 = fopen("ampl.dat","w"); fprintf(fp,"%d\t%d\t%d\t%d\n ",NX,NY,NZ,NSTEPS); // *********************************************** // ****************** MAIN LOOP ****************** // *********************************************** for (n=1; n < NSTEPS; n++) { printf("step: %d\n",n); // PROPOGATE PULSE IN E-FIELD for (j=1; j < NY; j++) { ez_inc[j] = gj3[j]*ez_inc[j] + gj2[j]*(0.5*ra_y/e_sub)*(hx_inc[j-1] - hx_inc[j]); // printf("%d\t%f\n",j,ez_inc[j]); } // FOURIER TRANSFORM INPUT WAVEFORM for (m=0; m < NFREQS; m++) { real_in[m] = real_in[m] + cos(arg[m]*T)*ez_inc[ja-1]; imag_in[m] = imag_in[m] - sin(arg[m]*T)*ez_inc[ja-1]; } // GENEREATE PULSE // pulse = 2.*sin(n/10); // HARMONIC // pulse = 2.*(1-2*pow(pi,2)*pow(0.5*n/f_peak-t0,2))*exp(-pow(pi,2)*pow(0.5*n/f_peak-t0,2.)); pulse = 2.*exp(-0.5*pow((t0-n)/spread,2.0)); // GAUSSIAN PULSE // pulse = (1-exp(-0.5*pow((n)/spread,2.0)))*2.;//.*sin(n/10); // GAUSSIAN TURN-0N ez_inc[j_feed-2] = pulse; // *********** DX *********** // SCATTERED FIELD for (i=1; i < ia; i++) { for (j=1; j