int main(int argc, char** argv) { // Define shorthand for alps::accumulators namespace: namespace aa = alps::accumulators; // Define shorthand for our simulation class: typedef MySimulation mysim_type; // Parse the parameters alps::params p(argc, argv); // Define the simulation parameters... mysim_type::define_parameters(p) // ...and add one more parameter (with default value of 5): .define<std::size_t>("timelimit", 5, "Time limit for the computation"); // Check if user needs help or is missing something if (p.help_requested(std::cerr) || p.has_missing(std::cerr)) return 1; std::cout << "Creating simulation" << std::endl; mysim_type mysim(p); std::cout << "Starting simulation" << std::endl; mysim.run(alps::stop_callback(std::size_t(p["timelimit"]))); std::cout << "Simulation finished" << std::endl << "Collecting results..." << std::endl; aa::result_set results=mysim.collect_results(); // Print all results: std::cout << "All results:\n" << results << std::endl; // Access individual results: aa::result_wrapper r=results["hits"]; std::cout << "Simulation ran for " << r.count() << " steps." << std::endl; // should get $\pi$: aa::result_wrapper pi_result=r*4.; // print the mean and the error bar: std::cout << "pi = " << pi_result.mean<double>() << " +/- " << pi_result.error<double>() << std::endl; return 0; }
int main() { // create the simulator object // viennamini::simulator mysim(std::cout); // read mesh and material input files // mysim.device().read(viennamini::device_collection_path()+"/Double_Gate/Double_Gate_FreeCAD/Double_Gate_MOSFET/Double_Gate_MOSFET3/Double_Gate_MOSFET3_meshed.pvd", viennamini::tetrahedral_3d()); mysim.device().read_material_database("../../auxiliary/materials.xml"); mysim.device().read_unit_database("../../auxiliary/units.xml"); // perform an optional scaling step // e.g., transfer device dimensions to nm regime // mysim.device().scale(1.0E-9); // set the temperature of the device // mysim.device().set_quantity(viennamini::id::temperature(), 300.0, "K"); // setup auxiliary segment indices, aiding in identifying the individual // device segments in the subsequent device setup step // const int source_contact = 1; const int source = 2; const int channel = 3; const int drain = 4; const int drain_contact = 5; const int oxide = 6; const int top_gate_contact = 7; const int bottom_gate_contact = 8; // setup the device by identifying the individual segments // mysim.device().make(viennamini::role::semiconductor, source, "source", "Si"); mysim.device().make(viennamini::role::semiconductor, channel, "channel", "Si"); mysim.device().make(viennamini::role::semiconductor, drain, "drain", "Si"); mysim.device().make(viennamini::role::oxide, oxide, "oxide", "HfO2"); mysim.device().make(viennamini::role::contact, top_gate_contact, "top_gate_contact", "Cu"); mysim.device().make(viennamini::role::contact, bottom_gate_contact, "bottom_gate_contact", "Cu"); mysim.device().make(viennamini::role::contact, source_contact, "source_contact", "Cu"); mysim.device().make(viennamini::role::contact, drain_contact, "drain_contact", "Cu"); // assign doping values to the semiconductor segments // mysim.device().set_quantity(viennamini::id::donor_doping(), source, 1.0E24, "m-3"); mysim.device().set_quantity(viennamini::id::acceptor_doping(), source, 1.0E8, "m-3"); mysim.device().set_quantity(viennamini::id::donor_doping(), drain, 1.0E24, "m-3"); mysim.device().set_quantity(viennamini::id::acceptor_doping(), drain, 1.0E8, "m-3"); mysim.device().set_quantity(viennamini::id::donor_doping(), channel, 1.0E22, "m-3"); mysim.device().set_quantity(viennamini::id::acceptor_doping(), channel, 1.0E10, "m-3"); // set optional solver parameters // mysim.config().linear_breaktol() = 1.0E-10; mysim.config().linear_iterations() = 1000; mysim.config().nonlinear_iterations() = 100; mysim.config().nonlinear_breaktol() = 1.0E-2; mysim.config().damping() = 0.6; // set the simulation type by choosing the PDE set and the discretization // mysim.config().model().set_pdeset(viennamini::pdeset::drift_diffusion); mysim.config().model().set_discretization(viennamini::discret::fvm); // manually set the contact potentials // mysim.device().set_contact_quantity(viennamini::id::potential(), top_gate_contact, 0.6, "V"); mysim.device().set_contact_quantity(viennamini::id::potential(), bottom_gate_contact, 0.6, "V"); mysim.device().set_contact_quantity(viennamini::id::potential(), source_contact, 0.0, "V"); mysim.device().set_contact_quantity(viennamini::id::potential(), drain_contact, 0.2, "V"); // perform the simulation // mysim.run(); return EXIT_SUCCESS; }