void UpdaterTE::updateFields() { updateH(); if (tfsfCond != NULL) { updateTFSF(); } updateE(); }
void FDTD2D::advanceTo( double time){ // Advance to a given time while( t < time){ //injectHzPointSource(Nx/2,Ny/2); updateH(); correctFieldsH(); advanceTimeStep(); updateE(); correctFieldsE(); advanceTimeStep(); } return; }
int main() { int tstep; char time_str[34]; time_t t0; // Set the parameters int Nx, Ny, Nz, TMAX; Nx = 200; Ny = 200; Nz = 208; TMAX = 100; // Allocate host memory float ***Ex, ***Ey, ***Ez; float ***Hx, ***Hy, ***Hz; float ***CEx, ***CEy, ***CEz; Ex = makeArray(Nx, Ny, Nz); Ey = makeArray(Nx, Ny, Nz); Ez = makeArray(Nx, Ny, Nz); Hx = makeArray(Nx, Ny, Nz); Hy = makeArray(Nx, Ny, Nz); Hz = makeArray(Nx, Ny, Nz); CEx = makeArray(Nx, Ny, Nz); CEy = makeArray(Nx, Ny, Nz); CEz = makeArray(Nx, Ny, Nz); // Geometry set_geometry(Nx, Ny, Nz, CEx, CEy, CEz); // Update on the CPU t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) { updateE(Nx, Ny, Nz, Ex, Ey, Ez, Hx, Hy, Hz, CEx, CEy, CEz); updateSrc(Nx, Ny, Nz, Ex, tstep); updateH(Nx, Ny, Nz, Ex, Ey, Ez, Hx, Hy, Hz); if ( tstep/100*100 == tstep ) { //dumpToH5(Nx, Ny, Nz, Nx/2, 0, 0, Nx/2, Ny-1, Nz-1, Ex, "cpu_png/Ex-%05d.h5", tstep); //exec("h5topng -ZM0.1 -x0 -S4 -c /usr/share/h5utils/colormaps/dkbluered cpu_png/Ex-%05d.h5", tstep); updateTimer(t0, tstep, time_str); printf("tstep=%d\t%s\n", tstep, time_str); } } updateTimer(t0, tstep, time_str); printf("tstep=%d\t%s\n", tstep, time_str); }
int main() { int tstep; char time_str[32]; time_t t0; int i,j,k; // -------------------------------------------------------------------------------- // Set the parameters N3 N; N.x = 300; N.y = 300; //N.z = 304; N.z = 224; int TMAX = 100; float S = 0.5; float dx = 10e-9; float dt = S*dx/light_velocity; printf("N(%d,%d,%d), TMAX=%d\n", N.x, N.y, N.z, TMAX); // -------------------------------------------------------------------------------- // Allocate host memory P3F3 CE; CE.x = makeArray3D( N.x, N.y, N.z, 0 ); CE.y = makeArray3D( N.x, N.y, N.z, 0 ); CE.z = makeArray3D( N.x, N.y, N.z, 0 ); P3F3 CH; CH.x = makeArray3D( N.x, N.y, N.z,0 ); CH.y = makeArray3D( N.x, N.y, N.z,0 ); CH.z = makeArray3D( N.x, N.y, N.z,0 ); P3F3 E; E.x = makeArray3D( N.x, N.y, N.z, 0 ); E.y = makeArray3D( N.x, N.y, N.z, 0 ); E.z = makeArray3D( N.x, N.y, N.z, 0 ); P3F3 H; H.x = makeArray3D( N.x, N.y, N.z, 0 ); H.y = makeArray3D( N.x, N.y, N.z, 1 ); H.z = makeArray3D( N.x, N.y, N.z, 0 ); // -------------------------------------------------------------------------------- // Geometry for (i=0; i<N.x; i++) { for (j=0; j<N.y; j++) { for (k=0; k<N.z; k++) { CE.x[i][j][k] = 0.5; CE.y[i][j][k] = 0.5; CE.z[i][j][k] = 0.5; if ( i == N.x-1 ) { CE.y[i][j][k] = 0; CE.z[i][j][k] = 0; } if ( j == N.y-1 ) { CE.z[i][j][k] = 0; CE.x[i][j][k] = 0; } if ( k == N.z-1 ) { CE.x[i][j][k] = 0; CE.y[i][j][k] = 0; } CH.x[i][j][k] = 0.5; CH.y[i][j][k] = 0.5; CH.z[i][j][k] = 0.5; if ( i == 0 ) { CH.y[i][j][k] = 0; CH.z[i][j][k] = 0; } if ( j == 0 ) { CH.z[i][j][k] = 0; CH.x[i][j][k] = 0; } if ( k == 0 ) { CH.x[i][j][k] = 0; CH.y[i][j][k] = 0; } } } } // -------------------------------------------------------------------------------- // time loop t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) { updateE ( N, E, H, CE ); for ( i=0; i<N.z; i++ ) E.z[N.x/2-10][N.y/2-20][i] += sin(0.1*tstep); updateH ( N, E, H, CH ); /* if ( tstep/50*50 == tstep ) { dumpToH5(N.x, N.y, N.z, 0, 0, N.z/2, N.x-1, N.y-1, N.z/2, E.z, "png/Ez-%05d.h5", tstep); exec("h5topng -ZM0.1 -z0 -S4 -c /usr/share/h5utils/colormaps/dkbluered png/Ez-%05d.h5", tstep); updateTimer(t0, tstep, time_str); printf("tstep=%d\t%s\n", tstep, time_str); } */ } updateTimer(t0, tstep, time_str); printf("tstep=%d\t%s\n", tstep, time_str); }
int main() { Py_Initialize(); // start Python interpreter PyObject* sysPath = PySys_GetObject((char*)"path"); // sysPath has a borrowed reference, no need to decref it PyObject* curDir = PyString_FromString("."); PyList_Append(sysPath, curDir); Py_DECREF(curDir); FILE * fp; time_t current_time; char* c_time_string; int i, j, k, cnt; LUC_sim_pars *simp; LUC_fields *fields; LUC_diel_mat *diel; LUC_abc_fields *abc_fields; LUC_source **src; printf("------------------------------ LUCIFER v0.3 ------------------------------\n\n"); simp = par_config("luc");//<----fix name if(!simp){ printf(C_RED "[ERROR]" C_RES " failed to read configuration file %s\n","luc"); return 0; } printf(C_GREEN "[MSG]" C_RES " configuration file read successfully\n"); fields = allocate_fields(simp); if(!fields){ printf(C_RED "[ERROR]" C_RES " failed to allocate fields (out of memory?)\n"); return 0; } printf(C_GREEN "[MSG]" C_RES " e.m. fields are allocated\n"); diel = allocate_diel(simp); if(!diel){ printf(C_RED "[ERROR]" C_RES " failed to allocate materials (out of memory?)\n"); return 0; } printf(C_GREEN "[MSG]" C_RES " materials and geometry are allocated\n"); abc_fields = allocate_abc(simp); if(!abc_fields){ printf(C_RED "[ERROR]" C_RES " failed to allocate abc fields (out of memory?)\n"); return 0; } printf(C_GREEN "[MSG]" C_RES " fields for ABC are allocated\n"); src = malloc((*simp).n_sources*sizeof(LUC_source**)); if(!src){ printf(C_RED "[ERROR]" C_RES " failed to allocate sources (out of memory?)\n"); return 0; } for(cnt = 0; cnt < (*simp).n_sources; cnt++) if(!source_init((*simp).src_files[cnt], &src[cnt], simp)) printf(C_RED "[ERROR]" C_RES "source_init: failed to allocated source %d\n",cnt); printf(C_GREEN "[MSG]" C_RES " sources are allocated\n"); printf(C_GREEN "[MSG]" C_RES " building geometry...\n"); printf(C_GREEN "[MSG]" C_RES " msgs from " C_BLUE "%s.py" C_RES " begin\n",(*simp).geom_file); build_geometry((*simp).geom_file, simp, diel); printf(C_GREEN "[MSG]" C_RES " msgs from " C_BLUE "%s.py" C_RES " end\n",(*simp).geom_file); printf(C_GREEN "[MSG]" C_RES " geometry done\n\n"); printf(C_GREEN "[MSG]" C_RES " simulated domain: x = %g m; y = %g m; z = %g m;\n",(*simp).size_x*(*simp).cell_size,(*simp).size_y*(*simp).cell_size,(*simp).size_z*(*simp).cell_size); printf(C_GREEN "[MSG]" C_RES " simulated time: %g s\n", (*simp).sim_time); printf(C_GREEN "[MSG]" C_RES " total number of time steps: %d\n", (*simp).max_time); //'data will be saved in: ',data_file // ask if OK //-------------------------------- //---------- START SIM ----------- //-------------------------------- fp = fopen ("test.dat", "w"); write_header(fp, simp); current_time = time(NULL); c_time_string = ctime(¤t_time); printf(C_GREEN "[MSG]" C_RES " simulation started on: %s", c_time_string); for ((*simp).t_step = 0; (*simp).t_step < (*simp).max_time; (*simp).t_step++) { updateH(fields, diel, simp); updateE(fields, diel, simp); // add source for(cnt = 0; cnt < (*simp).n_sources; cnt++) add_source(src[cnt], fields, simp); // apply abc abc(fields, abc_fields, simp); // apply pbc //pbc(pbc_k,pbc_f,pbc_l,pbc_r,pbc_b,pbc_t); write_field_views(fp, fields, simp); printf(C_GREEN "[MSG]" C_RES " completed: %.2f%%\r", ((float)(*simp).t_step/(float)(*simp).max_time)*100); } current_time = time(NULL); c_time_string = ctime(¤t_time); printf(C_GREEN "[MSG]" C_RES " simulation finished on: %s\n", c_time_string); printf("----------------------------------- END ----------------------------------\n"); fclose(fp); Py_Finalize(); return 1; }
int main() { int tstep; char time_str[32]; time_t t0; int i; // -------------------------------------------------------------------------------- // Set the parameters N3 N; N.x = 300; N.y = 300; N.z = 304; int TMAX = 1000; float S = 0.5; float dx = 10e-9; float dt = S*dx/light_velocity; printf("N(%d,%d,%d), TMAX=%d\n", N.x, N.y, N.z, TMAX); // -------------------------------------------------------------------------------- // Allocate host memory P3F3 CE; CE.x = makeArray3D( N.x, N.y, N.z, 0 ); CE.y = makeArray3D( N.x, N.y, N.z, 0 ); CE.z = makeArray3D( N.x, N.y, N.z, 0 ); P3F3 E; E.x = makeArray3D( N.x, N.y, N.z, 0 ); E.y = makeArray3D( N.x, N.y, N.z, 0 ); E.z = makeArray3D( N.x, N.y, N.z, 0 ); P3F3 H; H.x = makeArray3D( N.x, N.y, N.z, 0 ); H.y = makeArray4D( N.x, N.y, N.z, 0 ); H.z = makeArray3D( N.x, N.y, N.z, 0 ); // -------------------------------------------------------------------------------- // Geometry set_geometry( N, CE ); // -------------------------------------------------------------------------------- // time loop int Ntot = (N.x-1)*(N.y-1)*N.z; t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) { updateE ( Ntot, N.y, N.z, E.x[0][0], E.y[0][0], E.z[0][0], H.x[0][0], H.y[0][0], H.z[0][0], CE.x[0][0], CE.y[0][0], CE.z[0][0] ); for ( i=0; i<N.z; i++ ) E.z[N.x/2-10][N.y/2-20][i] += sin(0.1*tstep); updateH ( Ntot, N.y, N.z, E.x[0][0], E.y[0][0], E.z[0][0], H.x[0][0], H.y[0][0], H.z[0][0] ); /* if ( tstep/50*50 == tstep ) { dumpToH5(N.x, N.y, N.z, 0, 0, N.z/2, N.x-1, N.y-1, N.z/2, E.z, "png/Ez-%05d.h5", tstep); exec("h5topng -ZM0.1 -z0 -S4 -c /usr/share/h5utils/colormaps/dkbluered png/Ez-%05d.h5", tstep); updateTimer(t0, tstep, time_str); printf("tstep=%d\t%s\n", tstep, time_str); } */ } updateTimer(t0, tstep, time_str); printf("tstep=%d\t%s\n", tstep, time_str); }
int main() { int i; int tstep; char time_str[32]; time_t t0; // Set the parameters N3 N; N.x = 200; N.y = 200; N.z = 304; int TMAX = 10000; float S = 0.5; float dx = 10e-9; float dt = S*dx/light_velocity; printf("N(%d,%d,%d), TMAX=%d\n", N.x, N.y, N.z, TMAX); printf("NPML=%d\n", Npml); // Allocate host memory P3F3 E, H, CE; E.x = makeArray3D( N.x, N.y, N.z ); E.y = makeArray3D( N.x, N.y, N.z ); E.z = makeArray3D( N.x, N.y, N.z ); H.x = makeArray3D( N.x, N.y, N.z ); H.y = makeArray3D( N.x, N.y, N.z ); H.z = makeArray3D( N.x, N.y, N.z ); CE.x = makeArray3D( N.x, N.y, N.z ); CE.y = makeArray3D( N.x, N.y, N.z ); CE.z = makeArray3D( N.x, N.y, N.z ); // Geometry set_geometry( N, CE ); // CPML int m = 4; // grade_order float sigma_max = (m+1.)/(15*pi*Npml*dx); float alpha = 0.05; float *sigmaE, *bE, *aE; float *sigmaH, *bH, *aH; sigmaE = (float *) calloc (2*Npml, sizeof(float)); sigmaH = (float *) calloc (2*Npml, sizeof(float)); bE = (float *) calloc (2*Npml, sizeof(float)); bH = (float *) calloc (2*Npml, sizeof(float)); aE = (float *) calloc (2*Npml, sizeof(float)); aH = (float *) calloc (2*Npml, sizeof(float)); for (i=0; i<Npml; i++) { sigmaE[i] = pow( (Npml-0.5-i)/Npml, m )*sigma_max; sigmaE[i+Npml] = pow( (0.5+i)/Npml, m )*sigma_max; sigmaH[i] = pow( (float)(Npml-i)/Npml, m )*sigma_max; sigmaH[i+Npml] = pow( (1.+i)/Npml, m )*sigma_max; } for (i=0; i<2*Npml; i++) { bE[i] = exp( -(sigmaE[i] + alpha)*dt/ep0 ); bH[i] = exp( -(sigmaH[i] + alpha)*dt/ep0 ); aE[i] = sigmaE[i]/(sigmaE[i]+alpha)*(bE[i]-1); aH[i] = sigmaH[i]/(sigmaH[i]+alpha)*(bH[i]-1); } free(sigmaE); free(sigmaH); // Allocate host memory for CPML P3F3 psixE, psiyE, psizE; P3F3 psixH, psiyH, psizH; psixE.y = makeArray3D( 2*Npml, N.y, N.z ); psixE.z = makeArray3D( 2*Npml, N.y, N.z ); psiyE.z = makeArray3D( N.x, 2*Npml, N.z ); psiyE.x = makeArray3D( N.x, 2*Npml, N.z ); psizE.x = makeArray3D( N.x, N.y, 2*Npml ); psizE.y = makeArray3D( N.x, N.y, 2*Npml ); psixH.y = makeArray3D( 2*Npml, N.y, N.z ); psixH.z = makeArray3D( 2*Npml, N.y, N.z ); psiyH.z = makeArray3D( N.x, 2*Npml, N.z ); psiyH.x = makeArray3D( N.x, 2*Npml, N.z ); psizH.x = makeArray3D( N.x, N.y, 2*Npml ); psizH.y = makeArray3D( N.x, N.y, 2*Npml ); /* t0 = time(0); int elapsedTime; for ( tstep=1; tstep<=TMAX; tstep++ ) { updateE( N, E, H, CE ); updateCPMLxE( N, E, H, CE, 1, Npml+1, 1, N.y-1, 1, N.z-1, psixE.y, psixE.z, bE, aE, 0 ); updateCPMLxE( N, E, H, CE, N.x-(Npml+1), N.x-1, 1, N.y-1, 1, N.z-1, psixE.y, psixE.z, bE, aE, 1 ); updateCPMLyE( N, E, H, CE, 1, N.x-1, 1, Npml+1, 1, N.z-1, psiyE.z, psiyE.x, bE, aE, 0 ); updateCPMLyE( N, E, H, CE, 1, N.x-1, N.y-(Npml+1), N.y-1, 1, N.z-1, psiyE.z, psiyE.x, bE, aE, 1 ); updateCPMLzE( N, E, H, CE, 1, N.x-1, 1, N.y-1, 1, Npml+1, psizE.x, psizE.y, bE, aE, 0 ); updateCPMLzE( N, E, H, CE, 1, N.x-1, 1, N.y-1, N.z-(Npml+1), N.z-1, psizE.x, psizE.y, bE, aE, 1 ); updateSrc( N, E, tstep ); updateH( N, E, H ); updateCPMLxH( N, E, H, CE, 1, Npml+1, 1, N.y, 1, N.z, psixH.y, psixH.z, bH, aH, 0 ); updateCPMLxH( N, E, H, CE, N.x-Npml, N.x, 1, N.y, 1, N.z, psixH.y, psixH.z, bH, aH, 1 ); updateCPMLyH( N, E, H, CE, 1, N.x, 1, Npml+1, 1, N.z, psiyH.z, psiyH.x, bH, aH, 0 ); updateCPMLyH( N, E, H, CE, 1, N.x, N.y-Npml, N.y, 1, N.z, psiyH.z, psiyH.x, bH, aH, 1 ); updateCPMLzH( N, E, H, CE, 1, N.x, 1, N.y, 1, Npml+1, psizH.x, psizH.y, bH, aH, 0 ); updateCPMLzH( N, E, H, CE, 1, N.x, 1, N.y, N.z-Npml, N.z, psizH.x, psizH.y, bH, aH, 1 ); if ( tstep/50*50 == tstep ) { dumpToH5(N.x, N.y, N.z, N.x/2, 0, 0, N.x/2, N.y-1, N.z-1, E.x, "cpu_png/Ex-%05d.h5", tstep); exec("h5topng -ZM0.1 -x0 -S4 -c /usr/share/h5utils/colormaps/dkbluered cpu_png/Ex-%05d.h5", tstep); //dumpToH5(N.x, N.y, N.z, 0, 0, N.z/2, N.x-1, N.y-1, N.z/2, E.z, "cpu_png/Ez-%05d.h5", tstep); //exec("h5topng -ZM0.1 -z0 -S4 -c /usr/share/h5utils/colormaps/dkbluered cpu_png/Ez-%05d.h5", tstep); updateTimer(t0, tstep, time_str); printf("tstep=%d\t%s\n", tstep, time_str); } } */ // time test t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) updateE( N, E, H, CE ); updateTimer(t0, tstep, time_str); printf("main E: \t%s\n", time_str); t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) updateH( N, E, H ); updateTimer(t0, tstep, time_str); printf("main H: \t%s\n", time_str); t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) { updateCPMLxE( N, E, H, CE, 1, Npml+1, 1, N.y-1, 1, N.z-1, psixE.y, psixE.z, bE, aE, 0 ); updateCPMLxE( N, E, H, CE, N.x-(Npml+1), N.x-1, 1, N.y-1, 1, N.z-1, psixE.y, psixE.z, bE, aE, 1 ); } updateTimer(t0, tstep, time_str); printf("cpmlx E:\t%s\n", time_str); t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) { updateCPMLxH( N, E, H, CE, 1, Npml+1, 1, N.y, 1, N.z, psixH.y, psixH.z, bH, aH, 0 ); updateCPMLxH( N, E, H, CE, N.x-Npml, N.x, 1, N.y, 1, N.z, psixH.y, psixH.z, bH, aH, 1 ); } updateTimer(t0, tstep, time_str); printf("cpmlx H:\t%s\n", time_str); t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) { updateCPMLyE( N, E, H, CE, 1, N.x-1, 1, Npml+1, 1, N.z-1, psiyE.z, psiyE.x, bE, aE, 0 ); updateCPMLyE( N, E, H, CE, 1, N.x-1, N.y-(Npml+1), N.y-1, 1, N.z-1, psiyE.z, psiyE.x, bE, aE, 1 ); } updateTimer(t0, tstep, time_str); printf("cpmly E:\t%s\n", time_str); t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) { updateCPMLyH( N, E, H, CE, 1, N.x, 1, Npml+1, 1, N.z, psiyH.z, psiyH.x, bH, aH, 0 ); updateCPMLyH( N, E, H, CE, 1, N.x, N.y-Npml, N.y, 1, N.z, psiyH.z, psiyH.x, bH, aH, 1 ); } updateTimer(t0, tstep, time_str); printf("cpmly H:\t%s\n", time_str); t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) { updateCPMLzE( N, E, H, CE, 1, N.x-1, 1, N.y-1, 1, Npml+1, psizE.x, psizE.y, bE, aE, 0 ); updateCPMLzE( N, E, H, CE, 1, N.x-1, 1, N.y-1, N.z-(Npml+1), N.z-1, psizE.x, psizE.y, bE, aE, 1 ); } updateTimer(t0, tstep, time_str); printf("cpmlz E:\t%s\n", time_str); t0 = time(0); for ( tstep=1; tstep<=TMAX; tstep++) { updateCPMLzH( N, E, H, CE, 1, N.x, 1, N.y, 1, Npml+1, psizH.x, psizH.y, bH, aH, 0 ); updateCPMLzH( N, E, H, CE, 1, N.x, 1, N.y, N.z-Npml, N.z, psizH.x, psizH.y, bH, aH, 1 ); } updateTimer(t0, tstep, time_str); printf("cpmlz H:\t%s\n", time_str); }