250 const Teuchos::RCP<panzer::GlobalData>& global_data,
251 const Teuchos::RCP<const panzer::EquationSetFactory>& eqset_factory,
254 bool meConstructionOn)
256 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::is_null(this->getParameterList()), std::runtime_error,
257 "ParameterList must be set before objects can be built!");
259 TEUCHOS_ASSERT(nonnull(comm));
260 TEUCHOS_ASSERT(nonnull(global_data));
261 TEUCHOS_ASSERT(nonnull(global_data->os));
262 TEUCHOS_ASSERT(nonnull(global_data->pl));
277 Teuchos::ParameterList& p = *this->getNonconstParameterList();
280 Teuchos::ParameterList & mesh_params = p.sublist(
"Mesh");
281 Teuchos::ParameterList & assembly_params = p.sublist(
"Assembly");
282 Teuchos::ParameterList & solncntl_params = p.sublist(
"Solution Control");
283 Teuchos::ParameterList & output_list = p.sublist(
"Output");
285 Teuchos::ParameterList & user_data_params = p.sublist(
"User Data");
286 Teuchos::ParameterList & panzer_data_params = user_data_params.sublist(
"Panzer Data");
288 Teuchos::RCP<Teuchos::ParameterList> physics_block_plist = Teuchos::sublist(this->getMyNonconstParamList(),
"Physics Blocks");
291 std::size_t workset_size = Teuchos::as<std::size_t>(assembly_params.get<
int>(
"Workset Size"));
292 std::string field_order = assembly_params.get<std::string>(
"Field Order");
294 bool use_dofmanager_fei = assembly_params.get<
bool>(
"Use DOFManager FEI");
295 bool use_load_balance = assembly_params.get<
bool>(
"Load Balance DOFs");
296 bool useTpetra = assembly_params.get<
bool>(
"Use Tpetra");
297 bool useThyraME = !assembly_params.get<
bool>(
"Use Epetra ME");
301 bool is_transient = (solncntl_params.get<std::string>(
"Piro Solver") ==
"Tempus") ?
true :
false;
303 if (solncntl_params.get<std::string>(
"Piro Solver") ==
"NOX") {
304 if (solncntl_params.sublist(
"NOX").get<std::string>(
"Nonlinear Solver") ==
"Pseudo-Transient")
309 if (solncntl_params.get<std::string>(
"Piro Solver") ==
"LOCA") {
310 if (solncntl_params.sublist(
"LOCA").sublist(
"Stepper").get<
bool>(
"Compute Eigenvalues"))
323 Teuchos::FancyOStream& fout = *global_data->os;
326 const Teuchos::RCP<const Teuchos::MpiComm<int> > mpi_comm =
327 Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int> >(comm);
332 Teuchos::RCP<panzer_stk::STK_MeshFactory> mesh_factory = this->
buildSTKMeshFactory(mesh_params);
333 Teuchos::RCP<panzer_stk::STK_Interface> mesh = mesh_factory->buildUncommitedMesh(*(mpi_comm->getRawMpiComm()));
341 std::vector<Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks;
344 std::map<std::string,std::string> block_ids_to_physics_ids;
348 std::map<std::string,Teuchos::RCP<const shards::CellTopology> > block_ids_to_cell_topo;
349 for(std::map<std::string,std::string>::const_iterator itr=block_ids_to_physics_ids.begin();
350 itr!=block_ids_to_physics_ids.end();++itr) {
351 block_ids_to_cell_topo[itr->first] = mesh->getCellTopology(itr->first);
352 TEUCHOS_ASSERT(block_ids_to_cell_topo[itr->first]!=Teuchos::null);
358 block_ids_to_cell_topo,
360 assembly_params.get<
int>(
"Default Integration Order"),
380 fout <<
"*****************************************\n\n";
381 fout <<
"Element block exception, could not finalize the mesh, printing block and sideset information:\n";
383 mesh->printMetaData(fout);
389 fout <<
"*****************************************\n\n";
390 fout <<
"Sideset exception, could not finalize the mesh, printing block and sideset information:\n";
392 mesh->printMetaData(fout);
400 if(p.sublist(
"Output").get<
bool>(
"Write to Exodus"))
401 mesh->setupExodusFile(p.sublist(
"Output").get<std::string>(
"File Name"));
405 Teuchos::RCP<panzer_stk::WorksetFactory> wkstFactory;
412 wkstFactory->setMesh(mesh);
416 std::vector<panzer::BC> bcs;
427 Teuchos::RCP<panzer::LinearObjFactory<panzer::Traits> > linObjFactory;
428 Teuchos::RCP<panzer::GlobalIndexer> globalIndexer;
430 std::string loadBalanceString =
"";
431 bool blockedAssembly =
false;
433 const bool has_interface_condition = hasInterfaceCondition(bcs);
438 TEUCHOS_TEST_FOR_EXCEPTION(has_interface_condition,
439 Teuchos::Exceptions::InvalidParameter,
440 "ERROR: Blocked Epetra systems cannot handle interface conditions.");
443 blockedAssembly =
true;
448 Teuchos::RCP<panzer::GlobalIndexer> dofManager
449 = globalIndexerFactory.
buildGlobalIndexer(mpi_comm->getRawMpiComm(),physicsBlocks,conn_manager,field_order);
450 globalIndexer = dofManager;
452 Teuchos::RCP<panzer::BlockedEpetraLinearObjFactory<panzer::Traits,int> > bloLinObjFactory
454 Teuchos::rcp_dynamic_cast<panzer::BlockedDOFManager>(dofManager)));
457 const std::string excludedBlocks = assembly_params.get<std::string>(
"Excluded Blocks");
458 std::vector<std::string> stringPairs;
460 for(std::size_t i=0;i<stringPairs.size();i++) {
461 std::vector<std::string> sPair;
462 std::vector<int> iPair;
466 TEUCHOS_TEST_FOR_EXCEPTION(iPair.size()!=2,std::logic_error,
467 "Input Error: The correct format for \"Excluded Blocks\" parameter in \"Assembly\" sub list is:\n"
468 " <int>,<int>; <int>,<int>; ...; <int>,<int>\n"
469 "Failure on string pair " << stringPairs[i] <<
"!");
471 bloLinObjFactory->addExcludedPair(iPair[0],iPair[1]);
474 linObjFactory = bloLinObjFactory;
477 loadBalanceString = printUGILoadBalancingInformation(*dofManager);
482 TEUCHOS_TEST_FOR_EXCEPTION(has_interface_condition,
483 Teuchos::Exceptions::InvalidParameter,
484 "ERROR: Blocked Tpetra system cannot handle interface conditions.");
487 blockedAssembly =
true;
489 TEUCHOS_ASSERT(!use_dofmanager_fei);
493 Teuchos::RCP<panzer::GlobalIndexer> dofManager
494 = globalIndexerFactory.
buildGlobalIndexer(mpi_comm->getRawMpiComm(),physicsBlocks,conn_manager,field_order);
495 globalIndexer = dofManager;
497 Teuchos::RCP<panzer::BlockedTpetraLinearObjFactory<panzer::Traits,double,int,panzer::GlobalOrdinal> > bloLinObjFactory
499 Teuchos::rcp_dynamic_cast<panzer::BlockedDOFManager>(dofManager)));
502 const std::string excludedBlocks = assembly_params.get<std::string>(
"Excluded Blocks");
503 std::vector<std::string> stringPairs;
505 for(std::size_t i=0;i<stringPairs.size();i++) {
506 std::vector<std::string> sPair;
507 std::vector<int> iPair;
511 TEUCHOS_TEST_FOR_EXCEPTION(iPair.size()!=2,std::logic_error,
512 "Input Error: The correct format for \"Excluded Blocks\" parameter in \"Assembly\" sub list is:\n"
513 " <int>,<int>; <int>,<int>; ...; <int>,<int>\n"
514 "Failure on string pair " << stringPairs[i] <<
"!");
516 bloLinObjFactory->addExcludedPair(iPair[0],iPair[1]);
519 linObjFactory = bloLinObjFactory;
522 loadBalanceString = printUGILoadBalancingInformation(*dofManager);
526 if (has_interface_condition)
527 buildInterfaceConnections(bcs, conn_manager);
531 TEUCHOS_ASSERT(!use_dofmanager_fei);
535 Teuchos::RCP<panzer::GlobalIndexer> dofManager
536 = globalIndexerFactory.
buildGlobalIndexer(mpi_comm->getRawMpiComm(),physicsBlocks,conn_manager,field_order);
537 globalIndexer = dofManager;
539 if (has_interface_condition)
540 checkInterfaceConnections(conn_manager, dofManager->getComm());
546 loadBalanceString = printUGILoadBalancingInformation(*dofManager);
550 if (has_interface_condition)
551 buildInterfaceConnections(bcs, conn_manager);
558 Teuchos::RCP<panzer::GlobalIndexer> dofManager
559 = globalIndexerFactory.
buildGlobalIndexer(mpi_comm->getRawMpiComm(),physicsBlocks,conn_manager,
561 globalIndexer = dofManager;
563 if (has_interface_condition)
564 checkInterfaceConnections(conn_manager, dofManager->getComm());
569 loadBalanceString = printUGILoadBalancingInformation(*dofManager);
572 TEUCHOS_ASSERT(globalIndexer!=Teuchos::null);
573 TEUCHOS_ASSERT(linObjFactory!=Teuchos::null);
579 fout <<
"Degree of freedom load balancing: " << loadBalanceString << std::endl;
585 std::map<std::string,panzer::WorksetNeeds> needs;
586 for(std::size_t i=0;i<physicsBlocks.size();i++)
587 needs[physicsBlocks[i]->elementBlockID()] = physicsBlocks[i]->getWorksetNeeds();
589 Teuchos::RCP<panzer::WorksetContainer> wkstContainer
592 wkstContainer->setWorksetSize(workset_size);
593 wkstContainer->setGlobalIndexer(globalIndexer);
598 std::size_t max_wksets = 0;
599 for(std::size_t pb=0;pb<physicsBlocks.size();pb++) {
601 Teuchos::RCP< std::vector<panzer::Workset> >works = wkstContainer->getWorksets(wd);
602 max_wksets = std::max(max_wksets,works->size());
604 user_data_params.set<std::size_t>(
"Max Worksets",max_wksets);
605 wkstContainer->clear();
613 for(std::size_t pb=0;pb<physicsBlocks.size();pb++) {
614 if(physicsBlocks[pb]->getCoordinateDOFs().size()>0) {
615 mesh->setUseFieldCoordinates(
true);
617 wkstContainer->clear();
626 panzer_data_params.set(
"STK Mesh", mesh);
627 panzer_data_params.set(
"DOF Manager", globalIndexer);
628 panzer_data_params.set(
"Linear Object Factory", linObjFactory);
633 if(!meConstructionOn)
639 std::vector<Teuchos::RCP<Teuchos::Array<std::string> > > p_names;
640 std::vector<Teuchos::RCP<Teuchos::Array<double> > > p_values;
641 if (p.isSublist(
"Active Parameters")) {
642 Teuchos::ParameterList& active_params = p.sublist(
"Active Parameters");
644 int num_param_vecs = active_params.get<
int>(
"Number of Parameter Vectors",0);
645 p_names.resize(num_param_vecs);
646 p_values.resize(num_param_vecs);
647 for (
int i=0; i<num_param_vecs; i++) {
648 std::stringstream ss;
649 ss <<
"Parameter Vector " << i;
650 Teuchos::ParameterList& pList = active_params.sublist(ss.str());
651 int numParameters = pList.get<
int>(
"Number");
652 TEUCHOS_TEST_FOR_EXCEPTION(numParameters == 0,
653 Teuchos::Exceptions::InvalidParameter,
654 std::endl <<
"Error! panzer::ModelEvaluator::ModelEvaluator(): " <<
655 "Parameter vector " << i <<
" has zero parameters!" << std::endl);
657 Teuchos::rcp(
new Teuchos::Array<std::string>(numParameters));
659 Teuchos::rcp(
new Teuchos::Array<double>(numParameters));
660 for (
int j=0; j<numParameters; j++) {
661 std::stringstream ss2;
662 ss2 <<
"Parameter " << j;
663 (*p_names[i])[j] = pList.get<std::string>(ss2.str());
666 ss2 <<
"Initial Value " << j;
667 (*p_values[i])[j] = pList.get<
double>(ss2.str());
680 cm_factory.buildObjects(io_cm_builder);
685 Teuchos::RCP<panzer::FieldManagerBuilder> fmb;
687 bool write_dot_files = p.sublist(
"Options").get(
"Write Volume Assembly Graphs",
false);
688 std::string dot_file_prefix = p.sublist(
"Options").get(
"Volume Assembly Graph Prefix",
"Panzer_AssemblyGraph");
689 bool write_fm_files = p.sublist(
"Options").get(
"Write Field Manager Files",
false);
690 std::string fm_file_prefix = p.sublist(
"Options").get(
"Field Manager File Prefix",
"Panzer_AssemblyGraph");
694 auto check_write_dag = std::getenv(
"PANZER_WRITE_DAG");
695 if (check_write_dag !=
nullptr) {
696 write_dot_files =
true;
697 write_fm_files =
true;
702 user_cm_factory,p.sublist(
"Closure Models"),*linObjFactory,user_data_params,
703 write_dot_files,dot_file_prefix,
704 write_fm_files,fm_file_prefix);
713 bool write_dot_files =
false;
714 std::string prefix =
"Panzer_ResponseGraph_";
715 write_dot_files = p.sublist(
"Options").get(
"Write Volume Response Graphs",write_dot_files);
716 prefix = p.sublist(
"Options").get(
"Volume Response Graph Prefix",prefix);
718 Teuchos::ParameterList user_data(p.sublist(
"User Data"));
719 user_data.set<
int>(
"Workset Size",workset_size);
725 Teuchos::RCP<Thyra::LinearOpWithSolveFactoryBase<double> > lowsFactory =
733 t_init = this->
getInitialTime(p.sublist(
"Initial Conditions").sublist(
"Transient Parameters"), *mesh);
735 if(blockedAssembly || useTpetra)
738 Teuchos::RCP<Thyra::ModelEvaluatorDefaultBase<double> > thyra_me
756 const Teuchos::ParameterList& models = p.sublist(
"Closure Models");
757 Teuchos::ParameterList cl_models(models.name());
758 for (Teuchos::ParameterList::ConstIterator model_it=models.begin();
759 model_it!=models.end(); ++model_it) {
760 std::string key = model_it->first;
761 if (model_it->first !=
"Global MMS Parameters")
762 cl_models.setEntry(key,model_it->second);
764 bool write_dot_files =
false;
765 std::string prefix =
"Panzer_AssemblyGraph_";
768 p.sublist(
"Initial Conditions"),
769 p.sublist(
"User Data"),
770 p.sublist(
"Options").get(
"Write Volume Assembly Graphs",write_dot_files),
771 p.sublist(
"Options").get(
"Volume Assembly Graph Prefix",prefix));
776 writeInitialConditions(*thyra_me,physicsBlocks,wkstContainer,globalIndexer,linObjFactory,mesh,user_cm_factory,
777 p.sublist(
"Closure Models"),
778 p.sublist(
"User Data"),workset_size);
788 const Teuchos::ParameterList & cellAvgQuants = output_list.sublist(
"Cell Average Quantities");
789 for(Teuchos::ParameterList::ConstIterator itr=cellAvgQuants.begin();
790 itr!=cellAvgQuants.end();++itr) {
791 const std::string & blockId = itr->first;
792 const std::string & fields = Teuchos::any_cast<std::string>(itr->second.getAny());
793 std::vector<std::string> tokens;
798 for(std::size_t i=0;i<tokens.size();i++)
805 const Teuchos::ParameterList & cellAvgVectors = output_list.sublist(
"Cell Average Vectors");
806 for(Teuchos::ParameterList::ConstIterator itr = cellAvgVectors.begin();
807 itr != cellAvgVectors.end(); ++itr) {
808 const std::string & blockId = itr->first;
809 const std::string & fields = Teuchos::any_cast<std::string>(itr->second.getAny());
810 std::vector<std::string> tokens;
815 for(std::size_t i = 0; i < tokens.size(); i++) {
816 std::string d_mod[3] = {
"X",
"Y",
"Z"};
823 const Teuchos::ParameterList & cellQuants = output_list.sublist(
"Cell Quantities");
824 for(Teuchos::ParameterList::ConstIterator itr=cellQuants.begin();
825 itr!=cellQuants.end();++itr) {
826 const std::string & blockId = itr->first;
827 const std::string & fields = Teuchos::any_cast<std::string>(itr->second.getAny());
828 std::vector<std::string> tokens;
833 for(std::size_t i=0;i<tokens.size();i++)
838 const Teuchos::ParameterList & nodalQuants = output_list.sublist(
"Nodal Quantities");
839 for(Teuchos::ParameterList::ConstIterator itr=nodalQuants.begin();
840 itr!=nodalQuants.end();++itr) {
841 const std::string & blockId = itr->first;
842 const std::string & fields = Teuchos::any_cast<std::string>(itr->second.getAny());
843 std::vector<std::string> tokens;
848 for(std::size_t i=0;i<tokens.size();i++)
852 const Teuchos::ParameterList & allocNodalQuants = output_list.sublist(
"Allocate Nodal Quantities");
853 for(Teuchos::ParameterList::ConstIterator itr=allocNodalQuants.begin();
854 itr!=allocNodalQuants.end();++itr) {
855 const std::string & blockId = itr->first;
856 const std::string & fields = Teuchos::any_cast<std::string>(itr->second.getAny());
857 std::vector<std::string> tokens;
862 for(std::size_t i=0;i<tokens.size();i++)
987 Teuchos::RCP<panzer_stk::STK_MeshFactory> mesh_factory;
990 if (mesh_params.get<std::string>(
"Source") ==
"Exodus File") {
991 mesh_factory = Teuchos::rcp(
new panzer_stk::STK_ExodusReaderFactory());
992 mesh_factory->setParameterList(Teuchos::rcp(
new Teuchos::ParameterList(mesh_params.sublist(
"Exodus File"))));
994 else if (mesh_params.get<std::string>(
"Source") ==
"Pamgen Mesh") {
995 mesh_factory = Teuchos::rcp(
new panzer_stk::STK_ExodusReaderFactory());
996 Teuchos::RCP<Teuchos::ParameterList> pamgenList = Teuchos::rcp(
new Teuchos::ParameterList(mesh_params.sublist(
"Pamgen Mesh")));
997 pamgenList->set(
"File Type",
"Pamgen");
998 mesh_factory->setParameterList(pamgenList);
1000 else if (mesh_params.get<std::string>(
"Source") ==
"Inline Mesh") {
1002 int dimension = mesh_params.sublist(
"Inline Mesh").get<
int>(
"Mesh Dimension");
1003 std::string typeStr =
"";
1004 if(mesh_params.sublist(
"Inline Mesh").isParameter(
"Type"))
1005 typeStr = mesh_params.sublist(
"Inline Mesh").get<std::string>(
"Type");
1007 if (dimension == 1) {
1009 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1010 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1011 mesh_factory->setParameterList(in_mesh);
1013 else if (dimension == 2 && typeStr==
"Tri") {
1015 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1016 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1017 mesh_factory->setParameterList(in_mesh);
1019 else if (dimension == 2) {
1021 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1022 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1023 mesh_factory->setParameterList(in_mesh);
1025 else if (dimension == 3 && typeStr==
"Tet") {
1027 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1028 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1029 mesh_factory->setParameterList(in_mesh);
1031 else if(dimension == 3) {
1033 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1034 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1035 mesh_factory->setParameterList(in_mesh);
1037 else if(dimension==4) {
1039 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1040 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1041 mesh_factory->setParameterList(in_mesh);
1044 else if (mesh_params.get<std::string>(
"Source") ==
"Custom Mesh") {
1046 mesh_factory->setParameterList(Teuchos::rcp(
new Teuchos::ParameterList(mesh_params.sublist(
"Custom Mesh"))));
1054 if(mesh_params.isSublist(
"Rebalance")) {
1055 const Teuchos::ParameterList & rebalance = mesh_params.sublist(
"Rebalance");
1058 bool enabled =
false;
1059 if(rebalance.isType<
bool>(
"Enabled"))
1060 enabled = rebalance.get<
bool>(
"Enabled");
1063 Teuchos::RCP<Teuchos::ParameterList> rebalanceCycles;
1064 if(enabled && rebalance.isSublist(
"Cycles"))
1065 rebalanceCycles = Teuchos::rcp(
new Teuchos::ParameterList(rebalance.sublist(
"Cycles")));
1068 mesh_factory->enableRebalance(enabled,rebalanceCycles);
1071 return mesh_factory;
1186 const Teuchos::RCP<panzer::GlobalData>& global_data,
1187#ifdef PANZER_HAVE_TEMPUS
1188 const Teuchos::RCP<Piro::TempusSolverForwardOnly<ScalarT> > tempusSolver,
1190 const Teuchos::Ptr<const panzer_stk::NOXObserverFactory> & in_nox_observer_factory
1191#ifdef PANZER_HAVE_TEMPUS
1192 ,
const Teuchos::Ptr<const panzer_stk::TempusObserverFactory> & in_tempus_observer_factory
1196 using Teuchos::is_null;
1200 "Objects are not built yet! Please call buildObjects() member function.");
1202 "Objects are not built yet! Please call buildObjects() member function.");
1203 TEUCHOS_TEST_FOR_EXCEPTION(is_null(
m_mesh), std::runtime_error,
1204 "Objects are not built yet! Please call buildObjects() member function.");
1205 Teuchos::Ptr<const panzer_stk::NOXObserverFactory> nox_observer_factory
1207#ifdef PANZER_HAVE_TEMPUS
1208 Teuchos::Ptr<const panzer_stk::TempusObserverFactory> tempus_observer_factory
1209 = is_null(in_tempus_observer_factory) ? m_tempus_observer_factory.ptr() : in_tempus_observer_factory;
1212 Teuchos::ParameterList& p = *this->getNonconstParameterList();
1213 Teuchos::ParameterList & solncntl_params = p.sublist(
"Solution Control");
1214 Teuchos::RCP<Teuchos::ParameterList> piro_params = Teuchos::rcp(
new Teuchos::ParameterList(solncntl_params));
1215 Teuchos::RCP<Thyra::ModelEvaluatorDefaultBase<double> > piro;
1217 std::string solver = solncntl_params.get<std::string>(
"Piro Solver");
1218 Teuchos::RCP<Thyra::ModelEvaluatorDefaultBase<double> > thyra_me_db
1219 = Teuchos::rcp_dynamic_cast<Thyra::ModelEvaluatorDefaultBase<double> >(thyra_me);
1220 if ( (solver==
"NOX") || (solver ==
"LOCA") ) {
1222 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::is_null(nox_observer_factory), std::runtime_error,
1223 "No NOX obersver built! Please call setNOXObserverFactory() member function if you plan to use a NOX solver.");
1226 piro_params->sublist(
"NOX").sublist(
"Solver Options").set(
"User Defined Pre/Post Operator", ppo);
1229 piro = Teuchos::rcp(
new Piro::NOXSolver<double>(piro_params,
1230 Teuchos::rcp_dynamic_cast<Thyra::ModelEvaluatorDefaultBase<double> >(thyra_me_db)));
1231 else if (solver ==
"LOCA")
1232 piro = Teuchos::rcp(
new Piro::LOCASolver<double>(piro_params,
1233 Teuchos::rcp_dynamic_cast<Thyra::ModelEvaluatorDefaultBase<double> >(thyra_me_db),
1235 TEUCHOS_ASSERT(nonnull(piro));
1238 piro_params->sublist(
"NOX").sublist(
"Printing").set<Teuchos::RCP<std::ostream> >(
"Output Stream",global_data->os);
1239 piro_params->sublist(
"NOX").sublist(
"Printing").set<Teuchos::RCP<std::ostream> >(
"Error Stream",global_data->os);
1240 piro_params->sublist(
"NOX").sublist(
"Printing").set<
int>(
"Output Processor",global_data->os->getOutputToRootOnly());
1242#ifdef PANZER_HAVE_TEMPUS
1243 else if (solver==
"Tempus") {
1245 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::is_null(tempus_observer_factory), std::runtime_error,
1246 "No Tempus observer built! Please call setTempusObserverFactory() member function if you plan to use a Tempus solver.");
1249 if(tempus_observer_factory->useNOXObserver()) {
1251 piro_params->sublist(
"NOX").sublist(
"Solver Options").set(
"User Defined Pre/Post Operator", ppo);
1255 piro_params->sublist(
"NOX").sublist(
"Printing").set<Teuchos::RCP<std::ostream> >(
"Output Stream",global_data->os);
1256 piro_params->sublist(
"NOX").sublist(
"Printing").set<Teuchos::RCP<std::ostream> >(
"Error Stream",global_data->os);
1257 piro_params->sublist(
"NOX").sublist(
"Printing").set<
int>(
"Output Processor",global_data->os->getOutputToRootOnly());
1260 Teuchos::RCP<Piro::TempusSolverForwardOnly<double> > piro_tempus;
1262 if(tempusSolver==Teuchos::null)
1265 Teuchos::rcp(
new Piro::TempusSolverForwardOnly<double>(piro_params, thyra_me,
1270 piro_tempus = tempusSolver;
1271 piro_tempus->initialize(piro_params, thyra_me,
1279 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
1280 "Error: Unknown Piro Solver : " << solver);
1341 const Teuchos::RCP<Teuchos::ParameterList> & physics_block_plist,
1342 const Teuchos::RCP<const panzer::EquationSetFactory>& eqset_factory,
1345 bool is_transient,
bool is_explicit,
1346 const Teuchos::Ptr<const Teuchos::ParameterList> & bc_list,
1351 Teuchos::RCP<Thyra::ModelEvaluator<ScalarT> > physics_me = physics_me_in==Teuchos::null ?
m_physics_me : physics_me_in;
1353 const Teuchos::ParameterList& p = *this->getParameterList();
1356 std::vector<Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks;
1358 const Teuchos::ParameterList & assembly_params = p.sublist(
"Assembly");
1361 std::map<std::string,std::string> block_ids_to_physics_ids;
1365 std::map<std::string,Teuchos::RCP<const shards::CellTopology> > block_ids_to_cell_topo;
1366 for(std::map<std::string,std::string>::const_iterator itr=block_ids_to_physics_ids.begin();
1367 itr!=block_ids_to_physics_ids.end();++itr) {
1368 block_ids_to_cell_topo[itr->first] =
m_mesh->getCellTopology(itr->first);
1369 TEUCHOS_ASSERT(block_ids_to_cell_topo[itr->first]!=Teuchos::null);
1372 std::size_t workset_size = Teuchos::as<std::size_t>(assembly_params.get<
int>(
"Workset Size"));
1375 block_ids_to_cell_topo,
1376 physics_block_plist,
1377 assembly_params.get<
int>(
"Default Integration Order"),
1386 Teuchos::RCP<panzer::FieldManagerBuilder> fmb;
1388 const Teuchos::ParameterList & user_data_params = p.sublist(
"User Data");
1390 bool write_dot_files =
false;
1391 std::string prefix =
"Cloned_";
1393 std::vector<panzer::BC> bcs;
1394 if(bc_list==Teuchos::null) {
1411 p.sublist(
"Closure Models"),
1414 write_dot_files,prefix,
1415 write_dot_files,prefix);
1418 Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > response_library
1429 Thyra::ModelEvaluatorBase::InArgs<ScalarT> nomVals = physics_me->getNominalValues();
1432 Teuchos::RCP<Thyra::EpetraModelEvaluator> ep_thyra_me = Teuchos::rcp_dynamic_cast<Thyra::EpetraModelEvaluator>(physics_me);
1433 Teuchos::RCP<PanzerME> panzer_me = Teuchos::rcp_dynamic_cast<PanzerME>(physics_me);
1434 bool useThyra =
true;
1435 if(ep_thyra_me!=Teuchos::null)
1439 std::vector<Teuchos::RCP<Teuchos::Array<std::string> > > p_names(physics_me->Np());
1440 std::vector<Teuchos::RCP<Teuchos::Array<double> > > p_values(physics_me->Np());
1441 for(std::size_t i=0;i<p_names.size();i++) {
1442 p_names[i] = Teuchos::rcp(
new Teuchos::Array<std::string>(*physics_me->get_p_names(i)));
1443 p_values[i] = Teuchos::rcp(
new Teuchos::Array<double>(p_names[i]->size(),0.0));
1446 Teuchos::RCP<Thyra::ModelEvaluatorDefaultBase<double> > thyra_me
1459 thyra_me->getNominalValues() = nomVals;
1463 const Teuchos::ParameterList & assembly_params = p.sublist(
"Assembly");
1464 bool lumpExplicitMass = assembly_params.get<
bool>(
"Lump Explicit Mass");