void simulate_RT(component c, double a){ /* Memory Allocation, Structures and Fields */ grid_volume v = vol2d(size_x,size_y,a); /* Grid volume for computations */ structure s0(v,air,pml(h_PML,Y)); /* Reference case: no scatterers; PML termination in the y-direction */ structure s(v,air_glass_grating,pml(h_PML,Y)); /* Structure to be simulated; PML termination in the y-direction */ fields f0(&s0); /* Fields for reference case */ fields f(&s); /* Fields for simulation structure */ h5file *eps_file_ptr=f.open_h5file(eps_file_name); f.output_hdf5(Dielectric, v.surroundings(), eps_file_ptr, true); /* Outputting dielectric function as .h5 file; <fields>.output_hdf5(<field_type>,<?>) */ /* Flux Lines for Transmissions and Reflection Detectors */ volume flux_line_trans(vec(0,h_PML+4*h_sep+d),vec(size_x,h_PML+4*h_sep+d)); volume flux_line_refl(vec(0,h_PML+2*h_sep),vec(size_x,h_PML+2*h_sep)); /* Appropriate Bloch Boundary Conditions */ double k_x=n_air*freq_centre*sin(theta_degrees*const_pi/180.0); f0.use_bloch(vec(k_x,0.0)); f.use_bloch(vec(k_x,0.0)); /* Light Sources */ gaussian_src_time src(freq_centre, 0.5/pw_freq_width, 0, 5/pw_freq_width); /* Time-domain definition of source */ volume src_line(vec(0,h_PML+h_sep),vec(size_x,h_PML+h_sep)); f0.add_volume_source(c,src,src_line,src_spatial_modulator,1.0); f.add_volume_source(c,src,src_line,src_spatial_modulator,1.0); master_printf("# Line source(s) added ...\n"); /* Fluxes for Transmission, Reflection */ dft_flux f_t0 = f0.add_dft_flux_plane(flux_line_trans,min2(freq_min,freq_max),max2(freq_min,freq_max),num_freqs); dft_flux f_t = f.add_dft_flux_plane(flux_line_trans,min2(freq_min,freq_max),max2(freq_min,freq_max),num_freqs); dft_flux f_r0 = f0.add_dft_flux_plane(flux_line_refl,min2(freq_min,freq_max),max2(freq_min,freq_max),num_freqs); dft_flux f_r = f.add_dft_flux_plane(flux_line_refl,min2(freq_min,freq_max),max2(freq_min,freq_max),num_freqs); angleResolvedDetectors2D *ard = new angleResolvedDetectors2D(h_PML+4*h_sep, h_PML+2*h_sep, size_x, a, angle_res_degrees, freq_min, freq_max, num_freqs, theta_degrees, n_air, n_air, degree); master_printf("# Simulating reference structure ...\n"); double t_final_src_0=f0.last_source_time(), t_final_sim_0=t_final_src_0+duration_factor*num_freqs/pw_freq_width/2; master_printf("\tparameter__user_inaccessible:\tt_final_src_0 = %f\n",t_final_src_0); master_printf("\tparameter__user_inaccessible:\tt_final_sim_0 = %f\n",t_final_sim_0); while(f0.time() < t_final_sim_0){ /* Time-stepping -- reference structure */ f0.step(); double t=f0.time(); ard->update(t,f0,reference); } f_r0.save_hdf5(f0, flux_file_name, "reflection"); ard->finalize_update(reference); master_printf("# Simulating test structure ...\n"); double t_final_src=f.last_source_time(), t_final_sim=t_final_src+duration_factor*num_freqs/pw_freq_width/2; master_printf("\tparameter__user_inaccessible:\tt_final_src = %f\n",t_final_src); master_printf("\tparameter__user_inaccessible:\tt_final_sim = %f\n",t_final_sim); f_r.load_hdf5(f, flux_file_name, "reflection"); f_r.scale_dfts(-1.0); while(f.time() < t_final_sim){ /* Time-stepping -- simulated structure */ f.step(); double t=f.time(); ard->update(t,f,simulation); } f.output_hdf5(c, v.surroundings()); /* Outputting electric field as .h5 file; <fields>.output_hdf5(<field_type>,<?>) */ ard->finalize_update(simulation); double *flux_t = f_t.flux(); /* Calculating flux -- integrating? */ double *flux_t0 = f_t0.flux(); /* Calculating flux -- integrating? */ double *flux_r = f_r.flux(); /* Calculating flux -- integrating? */ double *flux_r0 = f_r0.flux(); /* Calculating flux -- integrating? */ double *T; /* Array to store transmission coefficients (frequency-dependent) */ double *R; /* Array to store reflection coefficients (frequency-dependent) */ T = new double[num_freqs]; R = new double[num_freqs]; for (int i=0; i<num_freqs; ++i){ /* Calculating transmission, reflection coefficients */ T[i] = flux_t[i] / flux_t0[i]; R[i] = -flux_r[i] / flux_r0[i]; } double dfreq = pw_freq_width / (num_freqs-1); master_printf("transmission:, omega, T\n"); master_printf("reflection:, omega, R\n"); master_printf("addition_check:, omega, R+T\n"); for (int l=0; l<num_freqs; ++l){ /* Printing transmission coefficient values */ master_printf("transmission:, %f, %f\n",freq_min+l*dfreq,T[l]); master_printf("reflection:, %f, %f\n",freq_min+l*dfreq,R[l]); master_printf("addition_check:, %f, %f\n",freq_min+l*dfreq,T[l]+R[l]); } ard->print_angle_unresolved_T(); ard->print_angle_unresolved_R(); ard->print_angle_resolved_T(file_name_prefix); ard->print_angle_resolved_R(file_name_prefix); delete [] eps_file_name; delete [] flux_file_name; delete [] flux_t; /* "Garbage collection" at end of code execution */ delete [] flux_t0; /* "Garbage collection" at end of code execution */ delete [] flux_r; /* "Garbage collection" at end of code execution */ delete [] flux_r0; /* "Garbage collection" at end of code execution */ delete [] T; /* "Garbage collection" at end of code execution */ delete [] R; /* "Garbage collection" at end of code execution */ delete ard; }
void StereoCam::placeLeft() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glLoadMatrixf(pml().getPtr()); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLoadMatrixf(vm().getPtr()); setupLeft(); }