Esempio n. 1
0
int main(int argc, char* argv[])
{
#ifdef GRINS_USE_GRVY_TIMERS
  GRVY::GRVY_Timer_Class grvy_timer;
  grvy_timer.Init("GRINS Timer");
#endif

  // Check command line count.
  if( argc < 2 )
    {
      // TODO: Need more consistent error handling.
      std::cerr << "Error: Must specify libMesh input file." << std::endl;
      exit(1); // TODO: something more sophisticated for parallel runs?
    }

  // libMesh input file should be first argument
  std::string libMesh_input_filename = argv[1];
  
  // Create our GetPot object.
  GetPot libMesh_inputfile( libMesh_input_filename );

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.BeginTimer("Initialize Solver");
#endif

  // Initialize libMesh library.
  LibMeshInit libmesh_init(argc, argv);
 
  GRINS::SimulationBuilder sim_builder;

  GRINS::Simulation grins( libMesh_inputfile,
			   sim_builder );

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.EndTimer("Initialize Solver");

  // Attach GRVY timer to solver
  grins.attach_grvy_timer( &grvy_timer );
#endif

grins.run();

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.Finalize();
 
  if( Parallel::Communicator_World.rank() == 0 ) grvy_timer.Summarize();
#endif

  return 0;
}
Esempio n. 2
0
int main(int argc, char* argv[])
{
  /* Echo GRINS version, libMesh version, and command */
  libMesh::out << "=========================================================="
               << std::endl;
  libMesh::out << "GRINS Version: " << GRINS_BUILD_VERSION << std::endl
               << "libMesh Version: " << LIBMESH_BUILD_VERSION << std::endl
               << "Running with command:\n";

  for (int i=0; i != argc; ++i)
    std::cout << argv[i] << ' ';

  std::cout << std::endl
            << "=========================================================="
            << std::endl;

#ifdef GRINS_USE_GRVY_TIMERS
  GRVY::GRVY_Timer_Class grvy_timer;
  grvy_timer.Init("GRINS Timer");
#endif

  // Check command line count.
  if( argc < 2 )
    {
      // TODO: Need more consistent error handling.
      std::cerr << "Error: Must specify libMesh input file." << std::endl;
      exit(1); // TODO: something more sophisticated for parallel runs?
    }

  // libMesh input file should be first argument
  std::string libMesh_input_filename = argv[1];
  
  // Initialize libMesh library.
  libMesh::LibMeshInit libmesh_init(argc, argv);

  // Create our GetPot object.
  GetPot libMesh_inputfile( libMesh_input_filename );

  GetPot command_line(argc,argv);

  // GetPot doesn't throw an error for a nonexistent file?
  {
    std::ifstream i(libMesh_input_filename.c_str());
    if (!i)
      {
        std::cerr << "Error: Could not read from libMesh input file "
                << libMesh_input_filename << std::endl;
        exit(1);
      }
  }

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.BeginTimer("Initialize Solver");
#endif

  GRINS::SimulationBuilder sim_builder;

  GRINS::Simulation grins( libMesh_inputfile,
                           command_line,
			   sim_builder,
                           libmesh_init.comm() );

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.EndTimer("Initialize Solver");

  // Attach GRVY timer to solver
  grins.attach_grvy_timer( &grvy_timer );
#endif

grins.run();

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.Finalize();
 
  if( Parallel::Communicator_World.rank() == 0 ) grvy_timer.Summarize();
#endif

  return 0;
}
int main(int argc, char* argv[]) 
{

#ifdef GRINS_USE_GRVY_TIMERS
  GRVY::GRVY_Timer_Class grvy_timer;
  grvy_timer.Init("GRINS Timer");
#endif

  // Check command line count.
  if( argc < 2 )
    {
      // TODO: Need more consistent error handling.
      std::cerr << "Error: Must specify libMesh input file." << std::endl;
      exit(1); // TODO: something more sophisticated for parallel runs?
    }

  // libMesh input file should be first argument
  std::string libMesh_input_filename = argv[1];
  
  // Create our GetPot object.
  GetPot libMesh_inputfile( libMesh_input_filename );

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.BeginTimer("Initialize Solver");
#endif

  // Initialize libMesh library.
  libMesh::LibMeshInit libmesh_init(argc, argv);
 
  GRINS::SimulationBuilder sim_builder;

  GRINS::SharedPtr<GRINS::BoundaryConditionsFactory> bc_factory( new ParabolicBCFactory );

  sim_builder.attach_bc_factory(bc_factory);

  GRINS::Simulation grins( libMesh_inputfile,
			   sim_builder,
                           libmesh_init.comm() );

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.EndTimer("Initialize Solver");

  // Attach GRVY timer to solver
  grins.attach_grvy_timer( &grvy_timer );
#endif

  // Solve
  grins.run();

  // Get equation systems to create ExactSolution object
  GRINS::SharedPtr<libMesh::EquationSystems> es = grins.get_equation_system();

  // Create Exact solution object and attach exact solution quantities
  libMesh::ExactSolution exact_sol(*es);

  exact_sol.attach_exact_value(&exact_solution);
  exact_sol.attach_exact_deriv(&exact_derivative);
  
  // Compute error and get it in various norms
  exact_sol.compute_error("GRINS", "u");

  double l2error = exact_sol.l2_error("GRINS", "u");
  double h1error = exact_sol.h1_error("GRINS", "u");

  int return_flag = 0;

  const double tol = 1.0e-8;

  if( l2error > tol || h1error > tol )
    {
      return_flag = 1;

      std::cout << "Tolerance exceeded for velocity in Poiseuille test." << std::endl
		<< "l2 error = " << l2error << std::endl
		<< "h1 error = " << h1error << std::endl;
    }

  // Compute error and get it in various norms
  exact_sol.compute_error("GRINS", "p");

  l2error = exact_sol.l2_error("GRINS", "p");
  h1error = exact_sol.h1_error("GRINS", "p");

  if( l2error > tol || h1error > tol )
    {
      return_flag = 1;

      std::cout << "Tolerance exceeded for pressure in Poiseuille test." << std::endl
		<< "l2 error = " << l2error << std::endl
		<< "h1 error = " << h1error << std::endl;
    }

  return return_flag;
}
int main(int argc, char* argv[])
{
#ifdef GRINS_USE_GRVY_TIMERS
    GRVY::GRVY_Timer_Class grvy_timer;
    grvy_timer.Init("GRINS Timer");
#endif

    // Check command line count.
    if( argc < 3 )
    {
        // TODO: Need more consistent error handling.
        std::cerr << "Error: Must specify libMesh input file and solution file." << std::endl;
        exit(1); // TODO: something more sophisticated for parallel runs?
    }

    // libMesh input file should be first argument
    std::string libMesh_input_filename = argv[1];

    // Create our GetPot object.
    GetPot libMesh_inputfile( libMesh_input_filename );

#ifdef GRINS_USE_GRVY_TIMERS
    grvy_timer.BeginTimer("Initialize Solver");
#endif

    // Initialize libMesh library.
    libMesh::LibMeshInit libmesh_init(argc, argv);

    GRINS::SimulationBuilder sim_builder;

    sim_builder.attach_bc_factory( GRINS::SharedPtr<GRINS::BoundaryConditionsFactory>( new GRINS::ThermallyDrivenFlowTestBCFactory( libMesh_inputfile ) ) );

    GRINS::Simulation grins( libMesh_inputfile,
                             sim_builder,
                             libmesh_init.comm() );

#ifdef GRINS_USE_GRVY_TIMERS
    grvy_timer.EndTimer("Initialize Solver");

    // Attach GRVY timer to solver
    grins.attach_grvy_timer( &grvy_timer );
#endif

    // Do solve here
    grins.run();

    // Get equation systems to create ExactSolution object
    GRINS::SharedPtr<libMesh::EquationSystems> es = grins.get_equation_system();

    //es->write("foobar.xdr");

    // Create Exact solution object and attach exact solution quantities
    libMesh::ExactSolution exact_sol(*es);

    libMesh::EquationSystems es_ref( es->get_mesh() );

    // Filename of file where comparison solution is stashed
    std::string solution_file = std::string(argv[2]);
    es_ref.read( solution_file );

    exact_sol.attach_reference_solution( &es_ref );

    // Compute error and get it in various norms
    exact_sol.compute_error("GRINS", "u");
    exact_sol.compute_error("GRINS", "v");

    if( (es->get_mesh()).mesh_dimension() == 3 )
        exact_sol.compute_error("GRINS", "w");

    exact_sol.compute_error("GRINS", "p");
    exact_sol.compute_error("GRINS", "T");

    double u_l2error = exact_sol.l2_error("GRINS", "u");
    double u_h1error = exact_sol.h1_error("GRINS", "u");

    double v_l2error = exact_sol.l2_error("GRINS", "v");
    double v_h1error = exact_sol.h1_error("GRINS", "v");

    double p_l2error = exact_sol.l2_error("GRINS", "p");
    double p_h1error = exact_sol.h1_error("GRINS", "p");

    double T_l2error = exact_sol.l2_error("GRINS", "T");
    double T_h1error = exact_sol.h1_error("GRINS", "T");

    double w_l2error = 0.0,
           w_h1error = 0.0;

    if( (es->get_mesh()).mesh_dimension() == 3 )
    {
        w_l2error = exact_sol.l2_error("GRINS", "w");
        w_h1error = exact_sol.h1_error("GRINS", "w");
    }

    int return_flag = 0;

    // This is the tolerance of the iterative linear solver so
    // it's unreasonable to expect anything better than this.
    double tol = 8.0e-9;

    if( u_l2error > tol || u_h1error > tol ||
            v_l2error > tol || v_h1error > tol ||
            w_l2error > tol || w_h1error > tol ||
            p_l2error > tol || p_h1error > tol ||
            T_l2error > tol || T_h1error > tol   )
    {
        return_flag = 1;

        std::cout << "Tolerance exceeded for thermally driven flow test." << std::endl
                  << "tolerance = " << tol << std::endl
                  << "u l2 error = " << u_l2error << std::endl
                  << "u h1 error = " << u_h1error << std::endl
                  << "v l2 error = " << v_l2error << std::endl
                  << "v h1 error = " << v_h1error << std::endl
                  << "w l2 error = " << w_l2error << std::endl
                  << "w h1 error = " << w_h1error << std::endl
                  << "p l2 error = " << p_l2error << std::endl
                  << "p h1 error = " << p_h1error << std::endl
                  << "T l2 error = " << T_l2error << std::endl
                  << "T h1 error = " << T_h1error << std::endl;
    }

    return return_flag;
}
int run( int argc, char* argv[], const GetPot& input )
{
  // Initialize libMesh library.
  libMesh::LibMeshInit libmesh_init(argc, argv);
 
  GRINS::SimulationBuilder sim_builder;

  std::tr1::shared_ptr<GRINS::BoundaryConditionsFactory> bc_factory( new NitridationCalibration::BoundaryConditionsFactory(input) );

  sim_builder.attach_bc_factory( bc_factory );

  std::tr1::shared_ptr<GRINS::QoIFactory> qoi_factory( new NitridationCalibration::QoIFactory );

  sim_builder.attach_qoi_factory( qoi_factory );

  GRINS::Simulation grins( input,
			   sim_builder,
                           libmesh_init.comm());

  //FIXME: We need to move this to within the Simulation object somehow...
  std::string restart_file = input( "restart-options/restart_file", "none" );

  std::tr1::shared_ptr<NitridationCalibration::TubeTempBC> wall_temp;
  
  std::string system_name = input( "screen-options/system_name", "GRINS" );

  if( restart_file == "none" )
    {
      // Asssign initial temperature value
      std::tr1::shared_ptr<libMesh::EquationSystems> es = grins.get_equation_system();
      const libMesh::System& system = es->get_system(system_name);
      
      libMesh::Parameters &params = es->parameters;

      libMesh::Real& w_N2 = params.set<libMesh::Real>( "w_N2" );
      w_N2 = input( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 0 );
      
      libMesh::Real& w_N = params.set<libMesh::Real>( "w_N" );
      w_N = input( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 1 );

      wall_temp.reset( new NitridationCalibration::TubeTempBC( input ) );
      std::tr1::shared_ptr<NitridationCalibration::TubeTempBC>& dummy = params.set<std::tr1::shared_ptr<NitridationCalibration::TubeTempBC> >( "wall_temp" );
      dummy = wall_temp;

      system.project_solution( initial_values, NULL, params );
    }

  grins.run();

  // Get equation systems to create ExactSolution object
  std::tr1::shared_ptr<libMesh::EquationSystems> es = grins.get_equation_system();

  //es->write("foobar.xdr");

  // Create Exact solution object and attach exact solution quantities
  libMesh::ExactSolution exact_sol(*es);
  
  libMesh::EquationSystems es_ref( es->get_mesh() );

  // Filename of file where comparison solution is stashed
  std::string solution_file = std::string(argv[2]);
  es_ref.read( solution_file );

  exact_sol.attach_reference_solution( &es_ref );
  
  // Compute error and get it in various norms
  exact_sol.compute_error(system_name, "u");
  exact_sol.compute_error(system_name, "v");

  if( (es->get_mesh()).mesh_dimension() == 3 )
    exact_sol.compute_error(system_name, "w");

  exact_sol.compute_error(system_name, "p");
  exact_sol.compute_error(system_name, "T");
  exact_sol.compute_error(system_name, "w_N2");
  exact_sol.compute_error(system_name, "w_N");
  exact_sol.compute_error(system_name, "w_CN");

  double u_l2error = exact_sol.l2_error(system_name, "u");
  double u_h1error = exact_sol.h1_error(system_name, "u");

  double v_l2error = exact_sol.l2_error(system_name, "v");
  double v_h1error = exact_sol.h1_error(system_name, "v");

  double p_l2error = exact_sol.l2_error(system_name, "p");
  double p_h1error = exact_sol.h1_error(system_name, "p");

  double T_l2error = exact_sol.l2_error(system_name, "T");
  double T_h1error = exact_sol.h1_error(system_name, "T");

  double wN_l2error = exact_sol.l2_error(system_name, "w_N");
  double wN_h1error = exact_sol.h1_error(system_name, "w_N");

  double wN2_l2error = exact_sol.l2_error(system_name, "w_N2");
  double wN2_h1error = exact_sol.h1_error(system_name, "w_N2");

  double wCN_l2error = exact_sol.l2_error(system_name, "w_CN");
  double wCN_h1error = exact_sol.h1_error(system_name, "w_CN");
  
  double w_l2error = 0.0, 
         w_h1error = 0.0;

  if( (es->get_mesh()).mesh_dimension() == 3 )
    {
      w_l2error = exact_sol.l2_error(system_name, "w");
      w_h1error = exact_sol.h1_error(system_name, "w");
    }

  int return_flag = 0;

  // This is the tolerance of the iterative linear solver so
  // it's unreasonable to expect anything better than this.
  double tol = 5.0e-10;
  
  if( u_l2error > tol   || u_h1error > tol   ||
      v_l2error > tol   || v_h1error > tol   ||
      w_l2error > tol   || w_h1error > tol   ||
      p_l2error > tol   || p_h1error > tol   ||
      T_l2error > tol   || T_h1error > tol   ||
      wN_l2error > tol  || wN_h1error > tol  ||
      wN2_l2error > tol || wN2_h1error > tol ||
      wCN_l2error > tol || wCN_h1error > tol )
    {
      return_flag = 1;

      std::cout << "Tolerance exceeded for solution fields." << std::endl
		<< "tolerance     = " << tol << std::endl
		<< "u l2 error    = " << u_l2error << std::endl
		<< "u h1 error    = " << u_h1error << std::endl
		<< "v l2 error    = " << v_l2error << std::endl
		<< "v h1 error    = " << v_h1error << std::endl
		<< "w l2 error    = " << w_l2error << std::endl
		<< "w h1 error    = " << w_h1error << std::endl
		<< "p l2 error    = " << p_l2error << std::endl
		<< "p h1 error    = " << p_h1error << std::endl
		<< "T l2 error    = " << T_l2error << std::endl
		<< "T h1 error    = " << T_h1error << std::endl
		<< "w_N l2 error  = " << wN_l2error << std::endl
		<< "w_N h1 error  = " << wN_h1error << std::endl
		<< "w_N2 l2 error = " << wN2_l2error << std::endl
		<< "w_N2 h1 error = " << wN2_h1error << std::endl
                << "w_CN l2 error = " << wCN_l2error << std::endl
                << "w_CN h1 error = " << wCN_h1error << std::endl;
    }

  // Now test QoI Values
  const libMesh::Real mass_loss_reg = atof(argv[3]);
  const libMesh::Real avg_N_reg = atof(argv[4]);
  
  /* The value we compute is negative by convention, but the data are given
     as positive by convention, so convert to data convention. */
  const libMesh::Real mass_loss_comp = std::fabs(grins.get_qoi_value(0));
  const libMesh::Real avg_N_comp = grins.get_qoi_value(1);
  
  const double qoi_tol = 1.0e-9;

  const double mass_loss_error = std::fabs( (mass_loss_comp - mass_loss_reg)/mass_loss_reg );

  const double avg_N_error = std::fabs( (avg_N_comp - avg_N_reg)/avg_N_reg );

  if( mass_loss_error > qoi_tol ||
      avg_N_error > qoi_tol )
    {
      return_flag = 1;

       std::cout << "Tolerance exceeded for qoi values." << std::endl
                 << "tolerance       = " << qoi_tol << std::endl
                 << "mass loss       = " << mass_loss_comp << std::endl
                 << "avg N           = " << avg_N_comp << std::endl
                 << "mass loss error = " << mass_loss_error << std::endl
                 << "avg N error     = " << avg_N_error << std::endl;
    }

  return return_flag;
}
//---------------------------------------------------------------------------//
// Example driver.
//---------------------------------------------------------------------------//
int main(int argc, char* argv[])
{
    // INITIALIZATION
    // --------------

    // Setup communication.
    Teuchos::GlobalMPISession mpiSession(&argc,&argv);

    // Extract the raw mpi communicator.
    Teuchos::RCP<const Teuchos::Comm<int> > comm =
	Teuchos::DefaultComm<int>::getComm();
    Teuchos::RCP<const Teuchos::MpiComm<int> > mpi_comm =
	Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int> >(comm);
    Teuchos::RCP<const Teuchos::OpaqueWrapper<MPI_Comm> > opaque_comm =
	mpi_comm->getRawMpiComm();
    MPI_Comm raw_comm = (*opaque_comm)();

    // Build the parameter list from the xml input.
    Teuchos::RCP<Teuchos::ParameterList> plist = Teuchos::rcp(
	new Teuchos::ParameterList());
    Teuchos::updateParametersFromXmlFile("input.xml",
					 Teuchos::inoutArg(*plist));

    // Load the mesh.
    Teuchos::RCP<moab::Interface> source_iface = Teuchos::rcp(new moab::Core());
    std::string meshFileName("sahex1_unic.h5m");
    std::string options = std::string(
	"PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;"
	"PARALLEL_RESOLVE_SHARED_ENTS;PARTITION_DISTRIBUTE;"
	"PARALLEL_GHOSTS=3.0.1;");
    source_iface->load_file(meshFileName.c_str(), 0, options.c_str());

    // Get the parallel moab instance.
    Teuchos::RCP<moab::ParallelComm> source_mesh = Teuchos::rcp(
	moab::ParallelComm::get_pcomm(source_iface.getRawPtr(),0), false );

    // Get the entity set for the source part. Just use the root set for now.
    moab::EntityHandle source_set = source_iface->get_root_set();

    // Get the nodes in the source set.
    std::vector<moab::EntityHandle> source_nodes;
    moab::ErrorCode error = source_iface->get_entities_by_type(
	source_set, moab::MBVERTEX, source_nodes);
    checkMoabErrorCode(error);
    assert(moab::MB_SUCCESS == error);
    int num_source_nodes = source_nodes.size();

    // Create a mesh set for just the source nodes. We need this so we can
    // build a vector over the nodes.
    moab::EntityHandle source_node_set;
    error = source_iface->create_meshset(0, source_node_set);
    checkMoabErrorCode(error);
    assert(moab::MB_SUCCESS == error);
    error = source_iface->add_entities(source_node_set,
				       source_nodes.data(),
				       num_source_nodes);
    checkMoabErrorCode(error);
    assert(moab::MB_SUCCESS == error);

    // Create a source data tag.
    moab::Tag source_data_tag;
    std::string source_data_tag_name("u_src");
    double default_val = 0.0;
    bool created = false;
    error = source_iface->tag_get_handle(source_data_tag_name.c_str(), 1,
					 moab::MB_TYPE_DOUBLE, source_data_tag,
					 moab::MB_TAG_DENSE | moab::MB_TAG_CREAT,
					 static_cast<void*>(&default_val), &created);
    checkMoabErrorCode(error);
    assert(moab::MB_SUCCESS == error);
    assert(created);

    // Create some data and put it on the tag.
    Teuchos::Array<double> source_tag_data(num_source_nodes);
    Teuchos::Array<double> source_coords(3);
    for (int n = 0; n < num_source_nodes; ++n) {
	error = source_iface->get_coords(&source_nodes[n], 1,
					 source_coords.getRawPtr());
	checkMoabErrorCode(error);
	assert(moab::MB_SUCCESS == error);
	source_tag_data[n] = dataFunction(source_coords[0], source_coords[1],
					  source_coords[2]);
    }
    error = source_iface->tag_set_data(
	source_data_tag, source_nodes.data(),
	num_source_nodes, static_cast<void*>(source_tag_data.getRawPtr()));
    checkMoabErrorCode(error);
    assert(moab::MB_SUCCESS == error);

    // Make the tag parallel consistent.
    moab::Range shared_entities;
    error = source_mesh->get_shared_entities( -1, shared_entities, -1, false, true );
    checkMoabErrorCode(error);
    assert(moab::MB_SUCCESS == error);
    error = source_mesh->exchange_tags( source_data_tag, shared_entities );
    checkMoabErrorCode(error);
    assert(moab::MB_SUCCESS == error);

    

    // TARGET MESH READ
    // ----------------

    // Initialize libmesh.
    libMesh::LibMeshInit libmesh_init( argc, argv, raw_comm );

    // Create a target mesh.
    Teuchos::RCP<libMesh::Mesh> tgt_mesh = Teuchos::rcp(
	new libMesh::Mesh(libmesh_init.comm()));
    tgt_mesh->read("sahex.e");
    
    // Make a libmesh system. We will put a first order linear basis on the
    // elements for all subdomains.
    std::string tgt_var_name = "tgt_var";
    std::string tgt_err_name = "tgt_err";
    libMesh::EquationSystems tgt_equation_systems(*tgt_mesh);
    libMesh::System& tgt_system = tgt_equation_systems.add_system<
	libMesh::ExplicitSystem>("Target System");
    int tgt_var_id = tgt_system.add_variable(tgt_var_name);
    int tgt_err_id = tgt_system.add_variable(tgt_err_name);
    tgt_equation_systems.init();


    // SETUP DTK DATA
    // --------------

    // Create a manager for the source set elements.
    DataTransferKit::MoabManager src_manager(source_mesh, source_set);

    // Create a manager for the target set nodes.
    DataTransferKit::LibmeshManager tgt_manager(tgt_mesh,
						Teuchos::rcpFromRef(tgt_system));

    // Create a solution vector for the source.
    Teuchos::RCP<Tpetra::MultiVector<double, int, DataTransferKit::SupportId> > src_vector =
	src_manager.createFieldMultiVector(source_node_set,
					   source_data_tag);

    // Create a solution vector for the target.
    Teuchos::RCP<Tpetra::MultiVector<double, int, DataTransferKit::SupportId> > tgt_vector =
	tgt_manager.createFieldMultiVector(tgt_var_name);

    // Print out mesh info.
    Teuchos::RCP<Teuchos::FancyOStream>
	fancy_out = Teuchos::VerboseObjectBase::getDefaultOStream();
    fancy_out->setShowProcRank( true );
    src_manager.functionSpace()->entitySet()->describe( *fancy_out );
    tgt_manager.functionSpace()->entitySet()->describe( *fancy_out );

    // Create a map operator.
    Teuchos::ParameterList& dtk_list = plist->sublist("DataTransferKit");
    DataTransferKit::MapOperatorFactory op_factory;
    Teuchos::RCP<DataTransferKit::MapOperator> map_op =
	op_factory.create(src_vector->getMap(), tgt_vector->getMap(),
			  dtk_list);

    // Setup the map operator.
    map_op->setup(src_manager.functionSpace(), tgt_manager.functionSpace());


    // SOLUTION TRANSFER
    // -----------------

    // Apply the map operator.
    map_op->apply(*src_vector, *tgt_vector);

    
    // COMPUTE THE SOLUTION ERROR
    // --------------------------

    double gold_value = 0.0;
    double error_l2_norm = 0.0;
    double var_l2_norm = 0.0;
    double tgt_value = 0.0;

    std::unordered_map<libMesh::dof_id_type, double> tgt_val_map;
    std::unordered_map<libMesh::dof_id_type, double> error_val_map;
    libMesh::Mesh::const_element_iterator elements_begin =
	tgt_mesh->local_elements_begin();
    libMesh::Mesh::const_element_iterator elements_end =
	tgt_mesh->local_elements_end();
    std::vector<libMesh::dof_id_type> elem_dof_ids;
    int elem_n_nodes = 0;
    libMesh::Node* node;
    std::vector<libMesh::dof_id_type> err_dof_ids;
    for (auto element = elements_begin; element != elements_end; ++element) {
	tgt_system.get_dof_map().dof_indices(*element, elem_dof_ids,
					     tgt_var_id);
	tgt_system.get_dof_map().dof_indices(*element, err_dof_ids, tgt_err_id);
	elem_n_nodes = (*element)->n_nodes();

	for (int n = 0; n < elem_n_nodes; ++n)
	{
	    node = (*element)->get_node(n);
	    if ( comm->getRank() == node->processor_id() )
	    {
		gold_value = dataFunction((*node)(0), (*node)(1), (*node)(2));
		tgt_value = tgt_system.solution->el(elem_dof_ids[n]);
		tgt_system.solution->set(err_dof_ids[n],
					 (tgt_value - gold_value) / gold_value);
		tgt_val_map.emplace(err_dof_ids[n], tgt_value * tgt_value);
		error_val_map.emplace(err_dof_ids[n],
				      (tgt_value - gold_value) * (tgt_value - gold_value));
	    }
	}
    }
    tgt_system.solution->close();
    tgt_system.update();

    for (auto tval = tgt_val_map.begin(), eval = error_val_map.begin();
	 tval != tgt_val_map.end(); ++tval, ++eval) {
	var_l2_norm += tval->second;
	error_l2_norm += eval->second;
    }

    error_l2_norm = std::sqrt(error_l2_norm);
    var_l2_norm = std::sqrt(var_l2_norm);
    std::cout << "|e|_2 / |f|_2: " << error_l2_norm / var_l2_norm << std::endl;

    // SOURCE MESH WRITE
    // -----------------
    error = source_iface->write_file("source_moab_out.h5m", "H5M",
				     "PARALLEL=WRITE_PART", &source_set, 1, &source_data_tag, 1);
    checkMoabErrorCode(error);
    assert(moab::MB_SUCCESS == error);

    // TARGET MESH WRITE
    // -----------------

    libMesh::ExodusII_IO(*tgt_mesh).write_equation_systems(
	"target_libmesh_out.exo", tgt_equation_systems);

}
int run( int argc, char* argv[], const GetPot& input, GetPot& command_line )
{
  // Initialize libMesh library.
  libMesh::LibMeshInit libmesh_init(argc, argv);

  GRINS::SimulationBuilder sim_builder;

  GRINS::Simulation grins( input,
			   sim_builder,
                           libmesh_init.comm() );

  //FIXME: We need to move this to within the Simulation object somehow...
  std::string restart_file = input( "restart-options/restart_file", "none" );

  if( restart_file == "none" )
    {
      // Asssign initial temperature value
      std::string system_name = input( "screen-options/system_name", "GRINS" );
      std::tr1::shared_ptr<libMesh::EquationSystems> es = grins.get_equation_system();
      const libMesh::System& system = es->get_system(system_name);

      libMesh::Parameters &params = es->parameters;

      libMesh::Real& w_N2 = params.set<libMesh::Real>( "w_N2" );
      w_N2 = input( "Physics/ReactingLowMachNavierStokes/bound_species_0", 0.0, 0.0 );

      libMesh::Real& w_N = params.set<libMesh::Real>( "w_N" );
      w_N = input( "Physics/ReactingLowMachNavierStokes/bound_species_0", 0.0, 1.0 );

      system.project_solution( initial_values, NULL, params );
    }

  grins.run();

  // Get equation systems to create ExactSolution object
  std::tr1::shared_ptr<libMesh::EquationSystems> es = grins.get_equation_system();

   // Create Exact solution object and attach exact solution quantities
  libMesh::ExactSolution exact_sol(*es);

  libMesh::EquationSystems es_ref( es->get_mesh() );

  // Filename of file where comparison solution is stashed
  std::string solution_file = command_line("soln-data", "DIE!");
  es_ref.read( solution_file );

  exact_sol.attach_reference_solution( &es_ref );

  // Now grab the variables for which we want to compare
  unsigned int n_vars = command_line.vector_variable_size("vars");
  std::vector<std::string> vars(n_vars);
  for( unsigned int v = 0; v < n_vars; v++ )
    {
      vars[v] = command_line("vars", "DIE!", v);
    }

  // Now grab the norms to compute for each variable error
  unsigned int n_norms = command_line.vector_variable_size("norms");
  std::vector<std::string> norms(n_norms);
  for( unsigned int n = 0; n < n_norms; n++ )
    {
      norms[n] = command_line("norms", "DIE!", n);
      if( norms[n] != std::string("L2") &&
          norms[n] != std::string("H1") )
        {
          std::cerr << "ERROR: Invalid norm input " << norms[n] << std::endl
                    << "       Valid values are: L2" << std::endl
                    << "                         H1" << std::endl;
        }
    }

  const std::string& system_name = grins.get_multiphysics_system_name();

  // Now compute error for each variable
  for( unsigned int v = 0; v < n_vars; v++ )
    {
      exact_sol.compute_error(system_name, vars[v]);
    }

  int return_flag = 0;

  double tol = command_line("tol", 1.0e-10);

  // Now test error for each variable, for each norm
  for( unsigned int v = 0; v < n_vars; v++ )
    {
      for( unsigned int n = 0; n < n_norms; n++ )
        {
          test_error_norm( exact_sol, system_name, vars[v], norms[n], tol, return_flag );
        }
    }

  return return_flag;
}
Esempio n. 8
0
int main(int argc, char* argv[])
{
#ifdef GRINS_USE_GRVY_TIMERS
  GRVY::GRVY_Timer_Class grvy_timer;
  grvy_timer.Init("GRINS Timer");
#endif

  // Check command line count.
  if( argc < 2 )
    {
      // TODO: Need more consistent error handling.
      std::cerr << "Error: Must specify libMesh input file." << std::endl;
      exit(1); // TODO: something more sophisticated for parallel runs?
    }

  // libMesh input file should be first argument
  std::string libMesh_input_filename = argv[1];
  
  // Create our GetPot object.
  GetPot libMesh_inputfile( libMesh_input_filename );

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.BeginTimer("Initialize Solver");
#endif

  // Initialize libMesh library.
  libMesh::LibMeshInit libmesh_init(argc, argv);
 
  GRINS::SimulationBuilder sim_builder;

  GRINS::Simulation grins( libMesh_inputfile,
			   sim_builder,
                           libmesh_init.comm() );

  //FIXME: We need to move this to within the Simulation object somehow...
  std::string restart_file = libMesh_inputfile( "restart-options/restart_file", "none" );

  if( restart_file == "none" )
    {
      // Asssign initial temperature value
      std::string system_name = libMesh_inputfile( "screen-options/system_name", "GRINS" );
      std::tr1::shared_ptr<libMesh::EquationSystems> es = grins.get_equation_system();
      const libMesh::System& system = es->get_system(system_name);
      
      libMesh::Parameters &params = es->parameters;
      libMesh::Real T_init = libMesh_inputfile("Physics/LowMachNavierStokes/T0", 0.0);
      libMesh::Real p0_init = libMesh_inputfile("Physics/LowMachNavierStokes/p0", 0.0);

      libMesh::Real& dummy_T  = params.set<libMesh::Real>("T_init");
      dummy_T = T_init;

      libMesh::Real& dummy_p0 = params.set<libMesh::Real>("p0_init");
      dummy_p0 = p0_init;

      system.project_solution( initial_values, NULL, params );
    }

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.EndTimer("Initialize Solver");

  // Attach GRVY timer to solver
  grins.attach_grvy_timer( &grvy_timer );
#endif

  grins.run();

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.Finalize();
 
  if( Parallel::Communicator_World.rank() == 0 ) grvy_timer.Summarize();
#endif

  return 0;
}
Esempio n. 9
0
int main(int argc, char* argv[])
{
  // Check command line count.
  if( argc < 4 )
    {
      // TODO: Need more consistent error handling.
      std::cerr << "Error: Must specify libMesh input file, regression file, and regression tolerance." << std::endl;
      exit(1); // TODO: something more sophisticated for parallel runs?
    }

  // libMesh input file should be first argument
  std::string libMesh_input_filename = argv[1];
  
  // Create our GetPot object.
  GetPot libMesh_inputfile( libMesh_input_filename );

  // Initialize libMesh library.
  LibMeshInit libmesh_init(argc, argv);
 
  GRINS::SimulationBuilder sim_builder;

  GRINS::Simulation grins( libMesh_inputfile,
			   sim_builder,
                           libmesh_init.comm() );

  grins.run();

  // Get equation systems to create ExactSolution object
  std::tr1::shared_ptr<EquationSystems> es = grins.get_equation_system();

  //es->write("foobar.xdr");

  // Create Exact solution object and attach exact solution quantities
  ExactSolution exact_sol(*es);
  
  EquationSystems es_ref( es->get_mesh() );

  // Filename of file where comparison solution is stashed
  std::string solution_file = std::string(argv[2]);
  es_ref.read( solution_file );

  exact_sol.attach_reference_solution( &es_ref );
  
  std::string system_name = libMesh_inputfile( "screen-options/system_name", "GRINS" );

  // Compute error and get it in various norms
  exact_sol.compute_error(system_name, "u");
  exact_sol.compute_error(system_name, "v");

  exact_sol.compute_error(system_name, "p");

  double u_l2error = exact_sol.l2_error(system_name, "u");
  double u_h1error = exact_sol.h1_error(system_name, "u");

  double v_l2error = exact_sol.l2_error(system_name, "v");
  double v_h1error = exact_sol.h1_error(system_name, "v");

  double p_l2error = exact_sol.l2_error(system_name, "p");
  double p_h1error = exact_sol.h1_error(system_name, "p");

  int return_flag = 0;

  // This is the tolerance of the iterative linear solver so
  // it's unreasonable to expect anything better than this.
  double tol = atof(argv[3]);
  
  if( u_l2error > tol || u_h1error > tol ||
      v_l2error > tol || v_h1error > tol ||
      p_l2error > tol || p_h1error > tol  )
    {
      return_flag = 1;

      std::cout << "Tolerance exceeded for thermally driven flow test." << std::endl
		<< "tolerance = " << tol << std::endl
		<< "u l2 error = " << u_l2error << std::endl
		<< "u h1 error = " << u_h1error << std::endl
		<< "v l2 error = " << v_l2error << std::endl
		<< "v h1 error = " << v_h1error << std::endl
		<< "p l2 error = " << p_l2error << std::endl
		<< "p h1 error = " << p_h1error << std::endl;
    }

 return return_flag;
}
Esempio n. 10
0
int main(int argc, char* argv[]) 
{

#ifdef GRINS_USE_GRVY_TIMERS
  GRVY::GRVY_Timer_Class grvy_timer;
  grvy_timer.Init("GRINS Timer");
#endif

  // Check command line count.
  if( argc < 2 )
    {
      // TODO: Need more consistent error handling.
      std::cerr << "Error: Must specify libMesh input file." << std::endl;
      exit(1); // TODO: something more sophisticated for iarallel runs?
    }

  // libMesh input file should be first argument
  std::string libMesh_input_filename = argv[1];
  
  // Create our GetPot object.
  GetPot libMesh_inputfile( libMesh_input_filename );

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.BeginTimer("Initialize Solver");
#endif

  // Initialize libMesh library.
  LibMeshInit libmesh_init(argc, argv);
 
  GRINS::SimulationBuilder sim_builder;

  GRINS::Simulation grins( libMesh_inputfile,
			   sim_builder,
                           libmesh_init.comm() );

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.EndTimer("Initialize Solver");

  // Attach GRVY timer to solver
  grins.attach_grvy_timer( &grvy_timer );
#endif

  // Solve
  grins.run();

  Number qoi = grins.get_qoi_value( 0 );

  int return_flag = 0;
  const Number exact_value = -0.5;
  const Number rel_error = std::fabs( (qoi - exact_value )/exact_value );
  const Number tol = 1.0e-15;
  if( rel_error > tol )
    {
      std::cerr << "Computed voriticity QoI mismatch greater than tolerance." << std::endl
		<< "Computed value = " << qoi << std::endl
		<< "Exact value = " << exact_value << std::endl
		<< "Relative error = " << rel_error << std::endl
		<< "Tolerance = " << tol << std::endl;
      return_flag = 1;
    }

  return return_flag;
}
Esempio n. 11
0
int main(int argc, char* argv[])
{
#ifdef GRINS_USE_GRVY_TIMERS
  GRVY::GRVY_Timer_Class grvy_timer;
  grvy_timer.Init("GRINS Timer");
#endif
	// Check command line count.
	if( argc < 3 )
	{
		// TODO: Need more consistent error handling.
		std::cerr << "Error: Must specify libMesh input file." << std::endl;
		exit(1); // TODO: something more sophisticated for parallel runs?
	}

	// libMesh input file should be first argument
	std::string libMesh_input_filename = argv[1];

	// Create our GetPot object.
	GetPot libMesh_inputfile( libMesh_input_filename );

	// GetPot doesn't throw an error for a nonexistent file?
	{
		std::ifstream i(libMesh_input_filename.c_str());
		if (!i)
		{
			std::cerr << "Error: Could not read from libMesh input file "
					<< libMesh_input_filename << std::endl;
			exit(1);
		}
	}

	// Initialize libMesh library.
	libMesh::LibMeshInit libmesh_init(argc, argv);

	libMesh::out << "Starting GRINS with command:\n";
	for (int i=0; i != argc; ++i)
		libMesh::out << argv[i] << ' ';
	libMesh::out << std::endl;

	GRINS::SimulationBuilder sim_builder;

	GRINS::Simulation grins( libMesh_inputfile,
						     sim_builder,
						     libmesh_init.comm() );

	std::string system_name = libMesh_inputfile( "screen-options/system_name", "GRINS" );

	// Get equation systems
	GRINS::SharedPtr<libMesh::EquationSystems> es = grins.get_equation_system();
	const libMesh::System& system = es->get_system(system_name);

	libMesh::Parameters &params = es->parameters;

	system.project_solution( initial_values, NULL, params );

	grins.run();

	//es->write("suspended_cable_test.xdr");

	// Create Exact solution object and attach exact solution quantities
	libMesh::ExactSolution exact_sol(*es);

	libMesh::EquationSystems es_ref( es->get_mesh() );

	// Filename of file where comparison solution is stashed
	std::string solution_file = std::string(argv[2]);
	es_ref.read( solution_file );

	exact_sol.attach_reference_solution( &es_ref );

	// Compute error and get it in various norms
	exact_sol.compute_error(system_name, "u");
	exact_sol.compute_error(system_name, "v");
	exact_sol.compute_error(system_name, "w");

	double u_l2error = exact_sol.l2_error(system_name, "u");
	double u_h1error = exact_sol.h1_error(system_name, "u");

	double v_l2error = exact_sol.l2_error(system_name, "v");
	double v_h1error = exact_sol.h1_error(system_name, "v");

	double w_l2error = exact_sol.l2_error(system_name, "w");
	double w_h1error = exact_sol.h1_error(system_name, "w");

	int return_flag = 0;

	double tol = 5.0e-8;

	if( u_l2error > tol   || u_h1error > tol   ||
	    v_l2error > tol   || v_h1error > tol   ||
	    w_l2error > tol   || w_h1error > tol     )
	{
	  return_flag = 1;

	  std::cout << "Tolerance exceeded for suspended cable test." << std::endl
		<< "tolerance     = " << tol << std::endl
		<< "u l2 error    = " << u_l2error << std::endl
		<< "u h1 error    = " << u_h1error << std::endl
		<< "v l2 error    = " << v_l2error << std::endl
		<< "v h1 error    = " << v_h1error << std::endl
		<< "w l2 error    = " << w_l2error << std::endl
		<< "w h1 error    = " << w_h1error << std::endl;
	}

	return return_flag;
}
Esempio n. 12
0
int main(int argc, char* argv[])
{
#ifdef GRINS_USE_GRVY_TIMERS
  GRVY::GRVY_Timer_Class grvy_timer;
  grvy_timer.Init("GRINS Timer");
#endif

  // Check command line count.
  if( argc < 2 )
    {
      // TODO: Need more consistent error handling.
      std::cerr << "Error: Must specify libMesh input file." << std::endl;
      exit(1); // TODO: something more sophisticated for parallel runs?
    }

  // libMesh input file should be first argument
  std::string libMesh_input_filename = argv[1];
  
  // Create our GetPot object.
  GetPot libMesh_inputfile( libMesh_input_filename );

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.BeginTimer("Initialize Solver");
#endif

  // Initialize libMesh library.
  LibMeshInit libmesh_init(argc, argv);
 
  GRINS::SimulationBuilder sim_builder;

  std::tr1::shared_ptr<BunsenBCFactory> bc_factory( new BunsenBCFactory );
  sim_builder.attach_bc_factory( bc_factory );

  std::tr1::shared_ptr<GRINS::PhysicsFactory> physics_factory( new BunsenPhysicsFactory );
  sim_builder.attach_physics_factory( physics_factory );

  GRINS::Simulation grins( libMesh_inputfile,
			   sim_builder );

  //FIXME: We need to move this to within the Simulation object somehow...
  std::string restart_file = libMesh_inputfile( "restart-options/restart_file", "none" );

  // If we are "cold starting", setup the flow field.
  if( restart_file == "none" )
    {
      // Asssign initial temperature value
      std::string system_name = libMesh_inputfile( "screen-options/system_name", "GRINS" );
      std::tr1::shared_ptr<libMesh::EquationSystems> es = grins.get_equation_system();
      const libMesh::System& system = es->get_system(system_name);
      
      Parameters &params = es->parameters;

      libMesh::Real& T_init = params.set<libMesh::Real>("T_init");
      T_init = libMesh_inputfile("InitialConditions/T0", 0.0);

      libMesh::Real& p0 = params.set<libMesh::Real>("p0");
      p0 = libMesh_inputfile("Physics/ReactingLowMachNavierStokes/p0", 1.0e5);

#ifdef GRINS_HAVE_CANTERA
      //Cantera::IdealGasMix& cantera = GRINS::CanteraSingleton::cantera_instance(libMesh_inputfile);
#endif

      libMesh::Real& w_H2 = params.set<libMesh::Real>( "w_H2" );
      w_H2 = libMesh_inputfile( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 0 );

      libMesh::Real& w_O2 = params.set<libMesh::Real>( "w_O2" );
      w_O2 = libMesh_inputfile( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 1 );

      libMesh::Real& w_H2O = params.set<libMesh::Real>( "w_H2O" );
      w_H2O = libMesh_inputfile( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 2 );

      libMesh::Real& w_H = params.set<libMesh::Real>( "w_H" );
      w_H = libMesh_inputfile( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 3 );

      libMesh::Real& w_O = params.set<libMesh::Real>( "w_O" );
      w_O = libMesh_inputfile( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 4 );

      libMesh::Real& w_OH = params.set<libMesh::Real>( "w_OH" );
      w_OH = libMesh_inputfile( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 5 );

      libMesh::Real& w_HO2 = params.set<libMesh::Real>( "w_HO2" );
      w_HO2 = libMesh_inputfile( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 6 );

      libMesh::Real& w_H2O2 = params.set<libMesh::Real>( "w_H2O2" );
      w_H2O2 = libMesh_inputfile( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 7 );

      libMesh::Real& w_N2 = params.set<libMesh::Real>( "w_N2" );
      w_N2 = libMesh_inputfile( "Physics/ReactingLowMachNavierStokes/bound_species_1", 0.0, 8 );

      std::cout << "==============================================" << std::endl;
      std::cout << "Projecting Solution." << std::endl;
      std::cout << "==============================================" << std::endl;
      system.project_solution( initial_values, NULL, params );
      std::cout << "==============================================" << std::endl;
      std::cout << "Done Projecting Solution!" << std::endl;
      std::cout << "==============================================" << std::endl;
    }

  /* If we're restarting to try and get ignition, then we need to setup a
     "restart" system and using the IgniteInitalGuess functor to do the projection
     on the "real" system. */
  if( libMesh_inputfile( "restart-options/ignition", false ) && 
      restart_file != std::string("none") )
    {
      std::string system_name = libMesh_inputfile( "screen-options/system_name", "GRINS" );

      /*
      GetPot restart_input( "bunsen_restart.in" );
      
      GRINS::Simulation restart_sim( restart_input,
				     sim_builder );
      std::tr1::shared_ptr<libMesh::EquationSystems> restart_es = restart_sim.get_equation_system();
      libMesh::System& restart_system = restart_es->get_system(system_name);
      GRINS::MultiphysicsSystem& restart_ms_system = libmesh_cast_ref<GRINS::MultiphysicsSystem&>( restart_system );
      */

      std::tr1::shared_ptr<libMesh::EquationSystems> es = grins.get_equation_system();
      libMesh::System& system = es->get_system(system_name);
      GRINS::MultiphysicsSystem& ms_system = libmesh_cast_ref<GRINS::MultiphysicsSystem&>( system );

      Bunsen::IgniteInitialGuess<libMesh::Real> ignite( libMesh_inputfile, ms_system, 
					       ms_system );

      es->reinit();
      
      std::cout << "==============================================" << std::endl;
      std::cout << "Projecting Solution." << std::endl;
      std::cout << "==============================================" << std::endl;
      ms_system.project_solution( &ignite );
      std::cout << "==============================================" << std::endl;
      std::cout << "Done Projecting Solution!" << std::endl;
      std::cout << "==============================================" << std::endl;
    }

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.EndTimer("Initialize Solver");

  // Attach GRVY timer to solver
  grins.attach_grvy_timer( &grvy_timer );
#endif

  grins.run();

#ifdef GRINS_USE_GRVY_TIMERS
  grvy_timer.Finalize();
 
  if( Parallel::Communicator_World.rank() == 0 ) grvy_timer.Summarize();
#endif

  return 0;
}