void scene_free(scene *s) { rgb_free(s->bg); sl_free(s->spheres); light_free(s->light); rgb_free(s->amb); free(s); return; }
static void dtor(void *priv) { struct _world *world = priv; cvar_ns_save(world->cvars); cvar_ns_free(world->cvars); light_free(world->light); chopper_free(world->apache); map_free(world->map); free(world); }
static void *ctor(renderer_t r, void *common) { struct _world *world = NULL; vec3_t spawn; world = calloc(1, sizeof(*world)); if ( NULL == world ) goto out; world->render = r; renderer_viewangles(r, 45.0, 45.0, 0.0); world->map = map_load(r, "data/maps/level1"); if ( NULL == world->map ) goto out_free; spawn[0] = 0.0; spawn[1] = CHOPPER_HEIGHT; spawn[2] = 0.0; world->apache = chopper_comanche(spawn, 0.785); if ( NULL == world->apache ) goto out_free_map; world->light = light_new(r, LIGHT_CAST_SHADOWS); if ( NULL == world->light ) { goto out_free_chopper; } world->font = font_load(r, "data/font/carbon.png", 16, 16); if ( NULL == world->font ) goto out_free_light; world->lightRate = 1440; world->light_ticks = 10; world->cvars = cvar_ns_new("world"); if ( NULL == world->cvars ) goto out_free_font; cvar_register_float(world->cvars, "time", CVAR_FLAG_SAVE_ALWAYS, &world->lightAngle); cvar_register_float(world->cvars, "lightRate", CVAR_FLAG_SAVE_NOTDEFAULT, &world->lightRate); cvar_register_uint(world->cvars, "tpf", CVAR_FLAG_SAVE_NOTDEFAULT, &world->light_ticks); cvar_ns_load(world->cvars); world->fcnt = (world->lightAngle / (M_PI / world->lightRate)); world->fcnt *= world->light_ticks; /* success */ goto out; out_free_font: font_free(world->font); out_free_light: light_free(world->light); out_free_chopper: chopper_free(world->apache); out_free_map: map_free(world->map); out_free: free(world); world = NULL; out: return world; }
int run_simulation(struct simulation *sim) { struct device cell; log_clear(sim); printf_log(sim,_("Run_simulation\n")); device_init(&cell); cell.onlypos=FALSE; dump_init(sim,&cell); set_dump_status(sim,dump_stop_plot, FALSE); set_dump_status(sim,dump_print_text, TRUE); char temp[1000]; cell.kl_in_newton=FALSE; //if (strcmp(outputpath,"")!=0) strcpy(get_output_path(sim),outputpath); //if (strcmp(inputpath,"")!=0) strcpy(get_input_path(sim),inputpath); dump_load_config(sim,&cell); int i; int z; int x; int y; join_path(2,temp,get_output_path(sim),"error.dat"); remove(temp); join_path(2,temp,get_output_path(sim),"equilibrium"); remove_dir(sim,temp); join_path(2,temp,get_output_path(sim),"snapshots"); remove_dir(sim,temp); join_path(2,temp,get_output_path(sim),"light_dump"); remove_dir(sim,temp); join_path(2,temp,get_output_path(sim),"dynamic"); remove_dir(sim,temp); join_path(2,temp,get_output_path(sim),"frequency"); remove_dir(sim,temp); load_config(sim,&cell); if (strcmp(sim->force_sim_mode,"")!=0) { strcpy(cell.simmode,sim->force_sim_mode); } if (strcmp(cell.simmode,"opticalmodel@optics")!=0) { solver_init(sim,cell.solver_name); newton_init(sim,cell.newton_name); printf_log(sim,_("Loading DoS for %d layers\n"),cell.my_epitaxy.electrical_layers); char tempn[100]; char tempp[100]; i=0; for (i=0;i<cell.my_epitaxy.electrical_layers;i++) { dos_init(&cell,i); printf_log(sim,"Load DoS %d/%d\n",i,cell.my_epitaxy.electrical_layers); sprintf(tempn,"%s_dosn.dat",cell.my_epitaxy.dos_file[i]); sprintf(tempp,"%s_dosp.dat",cell.my_epitaxy.dos_file[i]); load_dos(sim,&cell,tempn,tempp,i); } device_alloc_traps(&cell); if (get_dump_status(sim,dump_write_converge)==TRUE) { sim->converge = fopena(get_output_path(sim),"converge.dat","w"); fclose(sim->converge); sim->tconverge=fopena(get_output_path(sim),"tconverge.dat","w"); fclose(sim->tconverge); } mesh_cal_layer_widths(&cell); long double depth=0.0; long double percent=0.0; long double value=0.0; for (z=0;z<cell.zmeshpoints;z++) { for (x=0;x<cell.xmeshpoints;x++) { for (y=0;y<cell.ymeshpoints;y++) { depth=cell.ymesh[y]-cell.layer_start[cell.imat[z][x][y]]; percent=depth/cell.layer_width[cell.imat[z][x][y]]; cell.Nad[z][x][y]=get_dos_doping_start(&cell,cell.imat[z][x][y])+(get_dos_doping_stop(&cell,cell.imat[z][x][y])-get_dos_doping_start(&cell,cell.imat[z][x][y]))*percent; } } } init_mat_arrays(&cell); for (z=0;z<cell.zmeshpoints;z++) { for (x=0;x<cell.xmeshpoints;x++) { for (y=0;y<cell.ymeshpoints;y++) { cell.phi[z][x][y]=0.0; cell.R[z][x][y]=0.0; cell.n[z][x][y]=0.0; } } } contacts_load(sim,&cell); cell.C=cell.xlen*cell.zlen*epsilon0*cell.epsilonr[0][0][0]/(cell.ylen+cell.other_layers); if (get_dump_status(sim,dump_print_text)==TRUE) printf_log(sim,"C=%Le\n",cell.C); cell.A=cell.xlen*cell.zlen; cell.Vol=cell.xlen*cell.zlen*cell.ylen; ///////////////////////light model char old_model[100]; gdouble old_Psun=0.0; old_Psun=light_get_sun(&cell.mylight); light_init(&cell.mylight); light_set_dx(&cell.mylight,cell.ymesh[1]-cell.ymesh[0]); light_load_config(sim,&cell.mylight); if (cell.led_on==TRUE) { strcpy(old_model,cell.mylight.mode); strcpy(cell.mylight.mode,"ray"); } light_load_dlls(sim,&cell.mylight); light_setup_ray(sim,&cell,&cell.mylight); if (cell.led_on==TRUE) { cell.mylight.force_update=TRUE; light_set_sun(&(cell.mylight),1.0); light_set_sun_delta_at_wavelength(&(cell.mylight),cell.led_wavelength); light_solve_all(sim,&(cell.mylight)); cell.mylight.force_update=FALSE; strcpy(cell.mylight.mode,old_model); light_set_sun(&(cell.mylight),old_Psun); light_free_dlls(sim,&cell.mylight); light_load_dlls(sim,&cell.mylight); } /////////////////////// //update_arrays(&cell); contact_set_all_voltages(sim,&cell,0.0); get_initial(sim,&cell); remesh_shrink(&cell); if (cell.math_enable_pos_solver==TRUE) { for (z=0;z<cell.zmeshpoints;z++) { for (x=0;x<cell.xmeshpoints;x++) { solve_pos(sim,&cell,z,x); } } } time_init(sim,&cell); cell.N=0; cell.M=0; solver_realloc(sim,&cell); plot_open(sim); cell.go_time=FALSE; plot_now(sim,"plot"); //set_solver_dump_every_matrix(1); find_n0(sim,&cell); //set_solver_dump_every_matrix(0); draw_gaus(&cell); if (cell.onlypos==TRUE) { join_path(2,temp,get_output_path(sim),"equilibrium"); dump_1d_slice(sim,&cell,temp); device_free(sim,&cell); device_free_traps(&cell); mesh_free(sim,&cell); return 0; } } //Load the dll if (is_domain(cell.simmode)!=0) { char gussed_full_mode[200]; if (guess_whole_sim_name(sim,gussed_full_mode,get_input_path(sim),cell.simmode)==0) { printf_log(sim,"I guess we are using running %s\n",gussed_full_mode); strcpy(cell.simmode,gussed_full_mode); }else { ewe(sim,"I could not guess which simulation to run from the mode %s\n",cell.simmode); } } run_electrical_dll(sim,&cell,strextract_domain(cell.simmode)); if (strcmp(cell.simmode,"opticalmodel@optics")!=0) { device_free(sim,&cell); device_free_traps(&cell); mesh_free(sim,&cell); plot_close(sim); for (i=0;i<cell.my_epitaxy.electrical_layers;i++) { dos_free(&cell,i); } solver_free_memory(sim,&cell); newton_interface_free(sim); light_free(sim,&cell.mylight); } return cell.odes; }
int main(int argc, char *argv[]) { cal_path(); setlocale(LC_MESSAGES, ""); bindtextdomain("opvdm", get_lang_path()); textdomain("opvdm"); timer_init(0); timer_init(1); dbus_init(); set_ewe_lock_file("", ""); cell.onlypos = FALSE; char pwd[1000]; if (getcwd(pwd, 1000) == NULL) { ewe("IO error\n"); } dump_init(&cell); dump_load_config(&cell); remove("snapshots.zip"); remove("light_dump.zip"); hard_limit_init(); //char path[PATH_MAX]; //char dest[PATH_MAX]; //pid_t pid = getpid(); //sprintf(path, "/proc/%d/exe", pid); //if (readlink(path, dest, PATH_MAX) == -1) //{ // printf("error\n"); // exit(1); //} // char *base = strrchr(dest, '/'); //*base='/'; //*(base+1)=0; set_plot_script_dir(pwd); //set_plot_script_dir(char * in) if (scanarg(argv, argc, "--help") == TRUE) { printf("opvdm_core - Organic Photovoltaic Device Model\n"); printf(copyright); printf("\n"); printf("Usage: opvdm_core [options]\n"); printf("\n"); printf("Options:\n"); printf("\n"); printf("\t--outputpath\toutput data path"); printf("\t--inputpath\t sets the input path\n"); printf("\t--version\tdisplays the current version\n"); printf("\t--zip_results\t zip the results\n"); printf("\t--optics\t runs only optical simulation\n"); printf("\t--cpus\t sets the number of CPUs\n"); printf("\n"); printf ("Additional information about opvdm is available at www.opvdm.com.\n"); printf("\n"); printf ("Report bugs to: [email protected]\n\n"); exit(0); } if (scanarg(argv, argc, "--version") == TRUE) { printf("opvdm_core, Version %s\n", opvdm_ver); printf(copyright); printf(this_is_free_software); printf ("There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or\n"); printf("FITNESS FOR A PARTICULAR PURPOSE.\n"); printf("\n"); exit(0); } if (geteuid() == 0) { ewe("Don't run me as root!\n"); } set_dump_status(dump_stop_plot, FALSE); set_dump_status(dump_print_text, TRUE); set_io_dump(FALSE); srand(time(0)); textcolor(fg_green); randomprint(_("Organic Photovoltaic Device Model (www.opvdm.com)\n")); randomprint(_ ("You should have received a copy of the GNU General Public License\n")); randomprint(_ ("along with this software. If not, see www.gnu.org/licenses/.\n")); randomprint("\n"); randomprint(_ ("If you wish to collaborate in anyway please get in touch:\n")); randomprint(_("[email protected]\n")); randomprint(_("www.roderickmackenzie.eu/contact.html\n")); randomprint("\n"); textcolor(fg_reset); globalserver.on = FALSE; globalserver.cpus = 1; globalserver.readconfig = TRUE; if (scanarg(argv, argc, "--outputpath") == TRUE) { strcpy(sim_output_path(), get_arg_plusone(argv, argc, "--outputpath")); } else { strcpy(sim_output_path(), pwd); } if (scanarg(argv, argc, "--inputpath") == TRUE) { strcpy(sim_input_path(), get_arg_plusone(argv, argc, "--inputpath")); } else { strcpy(sim_input_path(), sim_output_path()); } dump_load_config(&cell); if (scanarg(argv, argc, "--onlypos") == TRUE) { cell.onlypos = TRUE; } char name[200]; struct inp_file inp; inp_init(&inp); inp_load_from_path(&inp, sim_input_path(), "ver.inp"); inp_check(&inp, 1.0); inp_search_string(&inp, name, "#core"); inp_free(&inp); if (strcmp(name, opvdm_ver) != 0) { printf ("Software is version %s and the input files are version %s\n", opvdm_ver, name); exit(0); } gui_start(); if (scanarg(argv, argc, "--optics") == FALSE) server_init(&globalserver); if (scanarg(argv, argc, "--lock") == TRUE) { server_set_dbus_finish_signal(&globalserver, get_arg_plusone(argv, argc, "--lock")); } int ret = 0; int do_fit = FALSE; if (scanarg(argv, argc, "--fit") == TRUE) do_fit = TRUE; FILE *f = fopen("fit.inp", "r"); if (f != NULL) { fclose(f); inp_init(&inp); inp_load_from_path(&inp, pwd, "fit.inp"); int fit_temp; inp_search_int(&inp, &fit_temp, "#do_fit"); if (fit_temp == 1) { do_fit = TRUE; } inp_free(&inp); } if (do_fit == TRUE) { set_dump_status(dump_lock, FALSE); set_dump_status(dump_print_text, FALSE); set_dump_status(dump_iodump, FALSE); set_dump_status(dump_optics, FALSE); set_dump_status(dump_newton, FALSE); set_dump_status(dump_plot, FALSE); set_dump_status(dump_stop_plot, FALSE); set_dump_status(dump_opt_for_fit, FALSE); set_dump_status(dump_print_newtonerror, FALSE); set_dump_status(dump_print_converge, FALSE); set_dump_status(dump_print_pos_error, FALSE); set_dump_status(dump_lock, TRUE); } #include "main_args.c" if (scanarg(argv, argc, "--optics") == TRUE) { gui_start(); struct light two; light_init(&two, &cell, pwd); //light_set_dx(&cell.mylight,cell.ymesh[1]-cell.ymesh[0]); light_load_config(&two); two.disable_transfer_to_electrical_mesh = TRUE; set_dump_status(dump_lock, FALSE); set_dump_status(dump_optics, TRUE); set_dump_status(dump_optics_verbose, TRUE); double Psun; inp_init(&inp); inp_load_from_path(&inp, pwd, "light.inp"); inp_search_double(&inp, &(Psun), "#Psun"); Psun = 1.0; //fabs(Psun); inp_free(&inp); light_solve_and_update(&cell, &two, Psun, 0.0); light_dump(&two); light_free(&two); complex_solver_free(); } else { gen_dos_fd_gaus_fd(); server_add_job(&globalserver, cell.outputpath, cell.inputpath); print_jobs(&globalserver); ret = server_run_jobs(&globalserver); } server_shut_down(&globalserver); if (scanarg(argv, argc, "--zip_results") == TRUE) { printf("zipping results\n"); int ret; char temp[200]; DIR *dir = opendir("snapshots"); if (dir) { closedir(dir); ret = system("zip -r -j -q snapshots.zip ./snapshots/*"); if (ret == -1) { printf("tar returned error\n"); } join_path(2, temp, cell.outputpath, "snapshots"); remove_dir(temp); } dir = opendir("light_dump"); if (dir) { closedir(dir); ret = system ("zip -r -j -q light_dump.zip ./light_dump/*"); if (ret == -1) { printf("tar returned error\n"); } join_path(2, temp, cell.outputpath, "light_dump"); remove_dir(temp); } } hard_limit_free(); if (ret != 0) { return 1; } return 0; }