예제 #1
0
void UpdaterTE::updateFields() {
	updateH();
	if (tfsfCond != NULL) {
		updateTFSF();
	}
	updateE();
}
예제 #2
0
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;
}
예제 #3
0
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);
}
예제 #4
0
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);

}
예제 #5
0
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(&current_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(&current_time);
	printf(C_GREEN "[MSG]" C_RES " simulation finished on: %s\n", c_time_string);
	printf("----------------------------------- END ----------------------------------\n");

	fclose(fp);
	Py_Finalize();

	return 1;
}
예제 #6
0
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);

}