Exemplo n.º 1
0
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;
}