229 const Teuchos::RCP<panzer::GlobalData>& global_data,
230 const Teuchos::RCP<const panzer::EquationSetFactory>& eqset_factory,
233 bool meConstructionOn)
235 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::is_null(this->getParameterList()), std::runtime_error,
236 "ParameterList must be set before objects can be built!");
238 TEUCHOS_ASSERT(nonnull(comm));
239 TEUCHOS_ASSERT(nonnull(global_data));
240 TEUCHOS_ASSERT(nonnull(global_data->os));
241 TEUCHOS_ASSERT(nonnull(global_data->pl));
244 m_global_data = global_data;
256 Teuchos::ParameterList& p = *this->getNonconstParameterList();
259 Teuchos::ParameterList & mesh_params = p.sublist(
"Mesh");
260 Teuchos::ParameterList & assembly_params = p.sublist(
"Assembly");
261 Teuchos::ParameterList & solncntl_params = p.sublist(
"Solution Control");
262 Teuchos::ParameterList & output_list = p.sublist(
"Output");
264 Teuchos::ParameterList & user_data_params = p.sublist(
"User Data");
265 Teuchos::ParameterList & panzer_data_params = user_data_params.sublist(
"Panzer Data");
267 Teuchos::RCP<Teuchos::ParameterList> physics_block_plist = Teuchos::sublist(this->getMyNonconstParamList(),
"Physics Blocks");
270 std::size_t workset_size = Teuchos::as<std::size_t>(assembly_params.get<
int>(
"Workset Size"));
271 std::string field_order = assembly_params.get<std::string>(
"Field Order");
273 bool use_dofmanager_fei = assembly_params.get<
bool>(
"Use DOFManager FEI");
274 bool use_load_balance = assembly_params.get<
bool>(
"Load Balance DOFs");
275 bool useTpetra = assembly_params.get<
bool>(
"Use Tpetra");
276 bool useThyraME = !assembly_params.get<
bool>(
"Use Epetra ME");
280 bool is_transient = (solncntl_params.get<std::string>(
"Piro Solver") ==
"Tempus") ? true :
false;
282 if (solncntl_params.get<std::string>(
"Piro Solver") ==
"NOX") {
283 if (solncntl_params.sublist(
"NOX").get<std::string>(
"Nonlinear Solver") ==
"Pseudo-Transient")
288 if (solncntl_params.get<std::string>(
"Piro Solver") ==
"LOCA") {
289 if (solncntl_params.sublist(
"LOCA").sublist(
"Stepper").get<
bool>(
"Compute Eigenvalues"))
292 m_is_transient = is_transient;
294 useDiscreteAdjoint = p.get<
bool>(
"Use Discrete Adjoint");
302 Teuchos::FancyOStream& fout = *global_data->os;
305 const Teuchos::RCP<const Teuchos::MpiComm<int> > mpi_comm =
306 Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int> >(comm);
311 Teuchos::RCP<panzer_stk::STK_MeshFactory> mesh_factory = this->buildSTKMeshFactory(mesh_params);
312 Teuchos::RCP<panzer_stk::STK_Interface> mesh = mesh_factory->buildUncommitedMesh(*(mpi_comm->getRawMpiComm()));
315 m_eqset_factory = eqset_factory;
320 std::vector<Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks;
323 std::map<std::string,std::string> block_ids_to_physics_ids;
327 std::map<std::string,Teuchos::RCP<const shards::CellTopology> > block_ids_to_cell_topo;
328 for(std::map<std::string,std::string>::const_iterator itr=block_ids_to_physics_ids.begin();
329 itr!=block_ids_to_physics_ids.end();++itr) {
330 block_ids_to_cell_topo[itr->first] = mesh->getCellTopology(itr->first);
331 TEUCHOS_ASSERT(block_ids_to_cell_topo[itr->first]!=Teuchos::null);
336 panzer::buildPhysicsBlocks(block_ids_to_physics_ids,
337 block_ids_to_cell_topo,
339 assembly_params.get<
int>(
"Default Integration Order"),
345 m_physics_blocks = physicsBlocks;
350 addUserFieldsToMesh(*mesh,output_list);
357 this->finalizeMeshConstruction(*mesh_factory,physicsBlocks,*mpi_comm,*mesh);
359 fout <<
"*****************************************\n\n";
360 fout <<
"Element block exception, could not finalize the mesh, printing block and sideset information:\n";
362 mesh->printMetaData(fout);
368 fout <<
"*****************************************\n\n";
369 fout <<
"Sideset exception, could not finalize the mesh, printing block and sideset information:\n";
371 mesh->printMetaData(fout);
379 if(p.sublist(
"Output").get<
bool>(
"Write to Exodus"))
380 mesh->setupExodusFile(p.sublist(
"Output").get<std::string>(
"File Name"));
384 p.sublist(
"User Data").set(
"panzer_stk::STK_Interface",mesh);
389 Teuchos::RCP<panzer_stk::WorksetFactory> wkstFactory;
390 if(m_user_wkst_factory==Teuchos::null)
393 wkstFactory = m_user_wkst_factory;
396 wkstFactory->setMesh(mesh);
400 std::vector<panzer::BC> bcs;
401 panzer::buildBCs(bcs, p.sublist(
"Boundary Conditions"), global_data);
406 m_conn_manager = conn_manager;
411 Teuchos::RCP<panzer::LinearObjFactory<panzer::Traits> > linObjFactory;
412 Teuchos::RCP<panzer::GlobalIndexer> globalIndexer;
414 std::string loadBalanceString =
"";
415 bool blockedAssembly =
false;
417 const bool has_interface_condition = hasInterfaceCondition(bcs);
421#ifdef PANZER_HAVE_EPETRA_STACK
423 TEUCHOS_TEST_FOR_EXCEPTION(has_interface_condition,
424 Teuchos::Exceptions::InvalidParameter,
425 "ERROR: Blocked Epetra systems cannot handle interface conditions.");
428 blockedAssembly =
true;
433 Teuchos::RCP<panzer::GlobalIndexer> dofManager
434 = globalIndexerFactory.
buildGlobalIndexer(mpi_comm->getRawMpiComm(),physicsBlocks,conn_manager,field_order);
435 globalIndexer = dofManager;
437 Teuchos::RCP<panzer::BlockedEpetraLinearObjFactory<panzer::Traits,int> > bloLinObjFactory
439 Teuchos::rcp_dynamic_cast<panzer::BlockedDOFManager>(dofManager)));
442 const std::string excludedBlocks = assembly_params.get<std::string>(
"Excluded Blocks");
443 std::vector<std::string> stringPairs;
445 for(std::size_t i=0;i<stringPairs.size();i++) {
446 std::vector<std::string> sPair;
447 std::vector<int> iPair;
451 TEUCHOS_TEST_FOR_EXCEPTION(iPair.size()!=2,std::logic_error,
452 "Input Error: The correct format for \"Excluded Blocks\" parameter in \"Assembly\" sub list is:\n"
453 " <int>,<int>; <int>,<int>; ...; <int>,<int>\n"
454 "Failure on string pair " << stringPairs[i] <<
"!");
456 bloLinObjFactory->addExcludedPair(iPair[0],iPair[1]);
459 linObjFactory = bloLinObjFactory;
462 loadBalanceString = printUGILoadBalancingInformation(*dofManager);
464 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
"ERROR: buildObjects() - Epetra support is NOT enabled in this build!");
470 TEUCHOS_TEST_FOR_EXCEPTION(has_interface_condition,
471 Teuchos::Exceptions::InvalidParameter,
472 "ERROR: Blocked Tpetra system cannot handle interface conditions.");
475 blockedAssembly =
true;
477 TEUCHOS_ASSERT(!use_dofmanager_fei);
481 Teuchos::RCP<panzer::GlobalIndexer> dofManager
482 = globalIndexerFactory.
buildGlobalIndexer(mpi_comm->getRawMpiComm(),physicsBlocks,conn_manager,field_order);
483 globalIndexer = dofManager;
485 Teuchos::RCP<panzer::BlockedTpetraLinearObjFactory<panzer::Traits,double,int,panzer::GlobalOrdinal> > bloLinObjFactory
487 Teuchos::rcp_dynamic_cast<panzer::BlockedDOFManager>(dofManager)));
490 const std::string excludedBlocks = assembly_params.get<std::string>(
"Excluded Blocks");
491 std::vector<std::string> stringPairs;
493 for(std::size_t i=0;i<stringPairs.size();i++) {
494 std::vector<std::string> sPair;
495 std::vector<int> iPair;
499 TEUCHOS_TEST_FOR_EXCEPTION(iPair.size()!=2,std::logic_error,
500 "Input Error: The correct format for \"Excluded Blocks\" parameter in \"Assembly\" sub list is:\n"
501 " <int>,<int>; <int>,<int>; ...; <int>,<int>\n"
502 "Failure on string pair " << stringPairs[i] <<
"!");
504 bloLinObjFactory->addExcludedPair(iPair[0],iPair[1]);
507 linObjFactory = bloLinObjFactory;
510 loadBalanceString = printUGILoadBalancingInformation(*dofManager);
514 if (has_interface_condition)
515 buildInterfaceConnections(bcs, conn_manager);
519 TEUCHOS_ASSERT(!use_dofmanager_fei);
523 Teuchos::RCP<panzer::GlobalIndexer> dofManager
524 = globalIndexerFactory.
buildGlobalIndexer(mpi_comm->getRawMpiComm(),physicsBlocks,conn_manager,field_order);
525 globalIndexer = dofManager;
527 if (has_interface_condition)
528 checkInterfaceConnections(conn_manager, dofManager->getComm());
530 TEUCHOS_ASSERT(!useDiscreteAdjoint);
534 loadBalanceString = printUGILoadBalancingInformation(*dofManager);
538#ifdef PANZER_HAVE_EPETRA_STACK
539 if (has_interface_condition)
540 buildInterfaceConnections(bcs, conn_manager);
547 Teuchos::RCP<panzer::GlobalIndexer> dofManager
548 = globalIndexerFactory.
buildGlobalIndexer(mpi_comm->getRawMpiComm(),physicsBlocks,conn_manager,
550 globalIndexer = dofManager;
552 if (has_interface_condition)
553 checkInterfaceConnections(conn_manager, dofManager->getComm());
558 loadBalanceString = printUGILoadBalancingInformation(*dofManager);
560 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
"ERROR: buildObjects() - Epetra support is NOT enabled in this build!");
564 TEUCHOS_ASSERT(globalIndexer!=Teuchos::null);
565 TEUCHOS_ASSERT(linObjFactory!=Teuchos::null);
566 m_global_indexer = globalIndexer;
567 m_lin_obj_factory = linObjFactory;
568 m_blockedAssembly = blockedAssembly;
571 fout <<
"Degree of freedom load balancing: " << loadBalanceString << std::endl;
577 std::map<std::string,panzer::WorksetNeeds> needs;
578 for(std::size_t i=0;i<physicsBlocks.size();i++)
579 needs[physicsBlocks[i]->elementBlockID()] = physicsBlocks[i]->getWorksetNeeds();
581 Teuchos::RCP<panzer::WorksetContainer> wkstContainer
584 wkstContainer->setWorksetSize(workset_size);
585 wkstContainer->setGlobalIndexer(globalIndexer);
587 m_wkstContainer = wkstContainer;
590 std::size_t max_wksets = 0;
591 for(std::size_t pb=0;pb<physicsBlocks.size();pb++) {
593 Teuchos::RCP< std::vector<panzer::Workset> >works = wkstContainer->getWorksets(wd);
594 max_wksets = std::max(max_wksets,works->size());
596 user_data_params.set<std::size_t>(
"Max Worksets",max_wksets);
597 wkstContainer->clear();
604 useDynamicCoordinates_ =
false;
605 for(std::size_t pb=0;pb<physicsBlocks.size();pb++) {
606 if(physicsBlocks[pb]->getCoordinateDOFs().size()>0) {
607 mesh->setUseFieldCoordinates(
true);
608 useDynamicCoordinates_ =
true;
609 wkstContainer->clear();
618 panzer_data_params.set(
"STK Mesh", mesh);
619 panzer_data_params.set(
"DOF Manager", globalIndexer);
620 panzer_data_params.set(
"Linear Object Factory", linObjFactory);
625 if(!meConstructionOn)
631 std::vector<Teuchos::RCP<Teuchos::Array<std::string> > > p_names;
632 std::vector<Teuchos::RCP<Teuchos::Array<double> > > p_values;
633 if (p.isSublist(
"Active Parameters")) {
634 Teuchos::ParameterList& active_params = p.sublist(
"Active Parameters");
636 int num_param_vecs = active_params.get<
int>(
"Number of Parameter Vectors",0);
637 p_names.resize(num_param_vecs);
638 p_values.resize(num_param_vecs);
639 for (
int i=0; i<num_param_vecs; i++) {
640 std::stringstream ss;
641 ss <<
"Parameter Vector " << i;
642 Teuchos::ParameterList& pList = active_params.sublist(ss.str());
643 int numParameters = pList.get<
int>(
"Number");
644 TEUCHOS_TEST_FOR_EXCEPTION(numParameters == 0,
645 Teuchos::Exceptions::InvalidParameter,
646 std::endl <<
"Error! panzer::ModelEvaluator::ModelEvaluator(): " <<
647 "Parameter vector " << i <<
" has zero parameters!" << std::endl);
649 Teuchos::rcp(
new Teuchos::Array<std::string>(numParameters));
651 Teuchos::rcp(
new Teuchos::Array<double>(numParameters));
652 for (
int j=0; j<numParameters; j++) {
653 std::stringstream ss2;
654 ss2 <<
"Parameter " << j;
655 (*p_names[i])[j] = pList.get<std::string>(ss2.str());
658 ss2 <<
"Initial Value " << j;
659 (*p_values[i])[j] = pList.get<
double>(ss2.str());
672 cm_factory.buildObjects(io_cm_builder);
677 Teuchos::RCP<panzer::FieldManagerBuilder> fmb;
679 bool write_dot_files = p.sublist(
"Options").get(
"Write Volume Assembly Graphs",
false);
680 std::string dot_file_prefix = p.sublist(
"Options").get(
"Volume Assembly Graph Prefix",
"Panzer_AssemblyGraph");
681 bool write_fm_files = p.sublist(
"Options").get(
"Write Field Manager Files",
false);
682 std::string fm_file_prefix = p.sublist(
"Options").get(
"Field Manager File Prefix",
"Panzer_AssemblyGraph");
686 auto check_write_dag = std::getenv(
"PANZER_WRITE_DAG");
687 if (check_write_dag !=
nullptr) {
688 write_dot_files =
true;
689 write_fm_files =
true;
693 fmb = buildFieldManagerBuilder(wkstContainer,physicsBlocks,bcs,*eqset_factory,bc_factory,cm_factory,
694 user_cm_factory,p.sublist(
"Closure Models"),*linObjFactory,user_data_params,
695 write_dot_files,dot_file_prefix,
696 write_fm_files,fm_file_prefix);
705 bool write_dot_files =
false;
706 std::string prefix =
"Panzer_ResponseGraph_";
707 write_dot_files = p.sublist(
"Options").get(
"Write Volume Response Graphs",write_dot_files);
708 prefix = p.sublist(
"Options").get(
"Volume Response Graph Prefix",prefix);
710 Teuchos::ParameterList user_data(p.sublist(
"User Data"));
711 user_data.set<
int>(
"Workset Size",workset_size);
717 Teuchos::RCP<Thyra::LinearOpWithSolveFactoryBase<double> > lowsFactory =
725 t_init = this->getInitialTime(p.sublist(
"Initial Conditions").sublist(
"Transient Parameters"), *mesh);
727 if(blockedAssembly || useTpetra)
730 Teuchos::RCP<Thyra::ModelEvaluatorDefaultBase<double> > thyra_me
731 = buildPhysicsModelEvaluator(useThyraME,
748 const Teuchos::ParameterList& models = p.sublist(
"Closure Models");
749 Teuchos::ParameterList cl_models(models.name());
750 for (Teuchos::ParameterList::ConstIterator model_it=models.begin();
751 model_it!=models.end(); ++model_it) {
752 std::string key = model_it->first;
753 if (model_it->first !=
"Global MMS Parameters")
754 cl_models.setEntry(key,model_it->second);
756 bool write_dot_files =
false;
757 std::string prefix =
"Panzer_AssemblyGraph_";
758 setupInitialConditions(*thyra_me,*wkstContainer,physicsBlocks,user_cm_factory,*linObjFactory,
760 p.sublist(
"Initial Conditions"),
761 p.sublist(
"User Data"),
762 p.sublist(
"Options").get(
"Write Volume Assembly Graphs",write_dot_files),
763 p.sublist(
"Options").get(
"Volume Assembly Graph Prefix",prefix));
768 writeInitialConditions(*thyra_me,physicsBlocks,wkstContainer,globalIndexer,linObjFactory,mesh,user_cm_factory,
769 p.sublist(
"Closure Models"),
770 p.sublist(
"User Data"),workset_size);
772 m_physics_me = thyra_me;
979 Teuchos::RCP<panzer_stk::STK_MeshFactory> mesh_factory;
982 if (mesh_params.get<std::string>(
"Source") ==
"Exodus File") {
983 mesh_factory = Teuchos::rcp(
new panzer_stk::STK_ExodusReaderFactory());
984 mesh_factory->setParameterList(Teuchos::rcp(
new Teuchos::ParameterList(mesh_params.sublist(
"Exodus File"))));
986 else if (mesh_params.get<std::string>(
"Source") ==
"Pamgen Mesh") {
987 mesh_factory = Teuchos::rcp(
new panzer_stk::STK_ExodusReaderFactory());
988 Teuchos::RCP<Teuchos::ParameterList> pamgenList = Teuchos::rcp(
new Teuchos::ParameterList(mesh_params.sublist(
"Pamgen Mesh")));
989 pamgenList->set(
"File Type",
"Pamgen");
990 mesh_factory->setParameterList(pamgenList);
992 else if (mesh_params.get<std::string>(
"Source") ==
"Inline Mesh") {
994 int dimension = mesh_params.sublist(
"Inline Mesh").get<
int>(
"Mesh Dimension");
995 std::string typeStr =
"";
996 if(mesh_params.sublist(
"Inline Mesh").isParameter(
"Type"))
997 typeStr = mesh_params.sublist(
"Inline Mesh").get<std::string>(
"Type");
999 if (dimension == 1) {
1001 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1002 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1003 mesh_factory->setParameterList(in_mesh);
1005 else if (dimension == 2 && typeStr==
"Tri") {
1007 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1008 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1009 mesh_factory->setParameterList(in_mesh);
1011 else if (dimension == 2) {
1013 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1014 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1015 mesh_factory->setParameterList(in_mesh);
1017 else if (dimension == 3 && typeStr==
"Tet") {
1019 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1020 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1021 mesh_factory->setParameterList(in_mesh);
1023 else if(dimension == 3) {
1025 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1026 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1027 mesh_factory->setParameterList(in_mesh);
1029 else if(dimension==4) {
1031 Teuchos::RCP<Teuchos::ParameterList> in_mesh = Teuchos::rcp(
new Teuchos::ParameterList);
1032 *in_mesh = mesh_params.sublist(
"Inline Mesh").sublist(
"Mesh Factory Parameter List");
1033 mesh_factory->setParameterList(in_mesh);
1036 else if (mesh_params.get<std::string>(
"Source") ==
"Custom Mesh") {
1038 mesh_factory->setParameterList(Teuchos::rcp(
new Teuchos::ParameterList(mesh_params.sublist(
"Custom Mesh"))));
1046 if(mesh_params.isSublist(
"Rebalance")) {
1047 const Teuchos::ParameterList & rebalance = mesh_params.sublist(
"Rebalance");
1050 bool enabled =
false;
1051 if(rebalance.isType<
bool>(
"Enabled"))
1052 enabled = rebalance.get<
bool>(
"Enabled");
1055 Teuchos::RCP<Teuchos::ParameterList> rebalanceCycles;
1056 if(enabled && rebalance.isSublist(
"Cycles"))
1057 rebalanceCycles = Teuchos::rcp(
new Teuchos::ParameterList(rebalance.sublist(
"Cycles")));
1060 mesh_factory->enableRebalance(enabled,rebalanceCycles);
1063 return mesh_factory;
1178 const Teuchos::RCP<panzer::GlobalData>& global_data,
1179#ifdef PANZER_HAVE_TEMPUS
1180 const Teuchos::RCP<Piro::TempusSolverForwardOnly<ScalarT> > tempusSolver,
1182 const Teuchos::Ptr<const panzer_stk::NOXObserverFactory> & in_nox_observer_factory
1183#ifdef PANZER_HAVE_TEMPUS
1184 ,
const Teuchos::Ptr<const panzer_stk::TempusObserverFactory> & in_tempus_observer_factory
1188 using Teuchos::is_null;
1191 TEUCHOS_TEST_FOR_EXCEPTION(is_null(m_lin_obj_factory), std::runtime_error,
1192 "Objects are not built yet! Please call buildObjects() member function.");
1193 TEUCHOS_TEST_FOR_EXCEPTION(is_null(m_global_indexer), std::runtime_error,
1194 "Objects are not built yet! Please call buildObjects() member function.");
1195 TEUCHOS_TEST_FOR_EXCEPTION(is_null(m_mesh), std::runtime_error,
1196 "Objects are not built yet! Please call buildObjects() member function.");
1197 Teuchos::Ptr<const panzer_stk::NOXObserverFactory> nox_observer_factory
1198 = is_null(in_nox_observer_factory) ? m_nox_observer_factory.ptr() : in_nox_observer_factory;
1199#ifdef PANZER_HAVE_TEMPUS
1200 Teuchos::Ptr<const panzer_stk::TempusObserverFactory> tempus_observer_factory
1201 = is_null(in_tempus_observer_factory) ? m_tempus_observer_factory.ptr() : in_tempus_observer_factory;
1204 Teuchos::ParameterList& p = *this->getNonconstParameterList();
1205 Teuchos::ParameterList & solncntl_params = p.sublist(
"Solution Control");
1206 Teuchos::RCP<Teuchos::ParameterList> piro_params = Teuchos::rcp(
new Teuchos::ParameterList(solncntl_params));
1207 Teuchos::RCP<Thyra::ModelEvaluatorDefaultBase<double> > piro;
1209 std::string solver = solncntl_params.get<std::string>(
"Piro Solver");
1210 Teuchos::RCP<Thyra::ModelEvaluatorDefaultBase<double> > thyra_me_db
1211 = Teuchos::rcp_dynamic_cast<Thyra::ModelEvaluatorDefaultBase<double> >(thyra_me);
1212 if ( (solver==
"NOX") || (solver ==
"LOCA") ) {
1214 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::is_null(nox_observer_factory), std::runtime_error,
1215 "No NOX obersver built! Please call setNOXObserverFactory() member function if you plan to use a NOX solver.");
1217 Teuchos::RCP<NOX::Abstract::PrePostOperator> ppo = nox_observer_factory->buildNOXObserver(m_mesh,m_global_indexer,m_lin_obj_factory);
1218 piro_params->sublist(
"NOX").sublist(
"Solver Options").set(
"User Defined Pre/Post Operator", ppo);
1221 piro = Teuchos::rcp(
new Piro::NOXSolver<double>(piro_params,
1222 Teuchos::rcp_dynamic_cast<Thyra::ModelEvaluatorDefaultBase<double> >(thyra_me_db)));
1223 else if (solver ==
"LOCA")
1224 piro = Teuchos::rcp(
new Piro::LOCASolver<double>(piro_params,
1225 Teuchos::rcp_dynamic_cast<Thyra::ModelEvaluatorDefaultBase<double> >(thyra_me_db),
1227 TEUCHOS_ASSERT(nonnull(piro));
1230 piro_params->sublist(
"NOX").sublist(
"Printing").set<Teuchos::RCP<std::ostream> >(
"Output Stream",global_data->os);
1231 piro_params->sublist(
"NOX").sublist(
"Printing").set<Teuchos::RCP<std::ostream> >(
"Error Stream",global_data->os);
1232 piro_params->sublist(
"NOX").sublist(
"Printing").set<
int>(
"Output Processor",global_data->os->getOutputToRootOnly());
1234#ifdef PANZER_HAVE_TEMPUS
1235 else if (solver==
"Tempus") {
1237 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::is_null(tempus_observer_factory), std::runtime_error,
1238 "No Tempus observer built! Please call setTempusObserverFactory() member function if you plan to use a Tempus solver.");
1241 if(tempus_observer_factory->useNOXObserver()) {
1242 Teuchos::RCP<NOX::Abstract::PrePostOperator> ppo = nox_observer_factory->buildNOXObserver(m_mesh,m_global_indexer,m_lin_obj_factory);
1243 piro_params->sublist(
"NOX").sublist(
"Solver Options").set(
"User Defined Pre/Post Operator", ppo);
1247 piro_params->sublist(
"NOX").sublist(
"Printing").set<Teuchos::RCP<std::ostream> >(
"Output Stream",global_data->os);
1248 piro_params->sublist(
"NOX").sublist(
"Printing").set<Teuchos::RCP<std::ostream> >(
"Error Stream",global_data->os);
1249 piro_params->sublist(
"NOX").sublist(
"Printing").set<
int>(
"Output Processor",global_data->os->getOutputToRootOnly());
1252 Teuchos::RCP<Piro::TempusSolverForwardOnly<double> > piro_tempus;
1254 if(tempusSolver==Teuchos::null)
1257 Teuchos::rcp(
new Piro::TempusSolverForwardOnly<double>(piro_params, thyra_me,
1258 tempus_observer_factory->buildTempusObserver(m_mesh,m_global_indexer,m_lin_obj_factory)));
1262 piro_tempus = tempusSolver;
1263 piro_tempus->initialize(piro_params, thyra_me,
1264 tempus_observer_factory->buildTempusObserver(m_mesh,m_global_indexer,m_lin_obj_factory));
1271 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
1272 "Error: Unknown Piro Solver : " << solver);
1333 const Teuchos::RCP<Teuchos::ParameterList> & physics_block_plist,
1334 const Teuchos::RCP<const panzer::EquationSetFactory>& eqset_factory,
1337 bool is_transient,
bool is_explicit,
1338 const Teuchos::Ptr<const Teuchos::ParameterList> & bc_list,
1343 Teuchos::RCP<Thyra::ModelEvaluator<ScalarT> > physics_me = physics_me_in==Teuchos::null ? m_physics_me : physics_me_in;
1345 const Teuchos::ParameterList& p = *this->getParameterList();
1348 std::vector<Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks;
1350 const Teuchos::ParameterList & assembly_params = p.sublist(
"Assembly");
1353 std::map<std::string,std::string> block_ids_to_physics_ids;
1357 std::map<std::string,Teuchos::RCP<const shards::CellTopology> > block_ids_to_cell_topo;
1358 for(std::map<std::string,std::string>::const_iterator itr=block_ids_to_physics_ids.begin();
1359 itr!=block_ids_to_physics_ids.end();++itr) {
1360 block_ids_to_cell_topo[itr->first] = m_mesh->getCellTopology(itr->first);
1361 TEUCHOS_ASSERT(block_ids_to_cell_topo[itr->first]!=Teuchos::null);
1364 std::size_t workset_size = Teuchos::as<std::size_t>(assembly_params.get<
int>(
"Workset Size"));
1366 panzer::buildPhysicsBlocks(block_ids_to_physics_ids,
1367 block_ids_to_cell_topo,
1368 physics_block_plist,
1369 assembly_params.get<
int>(
"Default Integration Order"),
1378 Teuchos::RCP<panzer::FieldManagerBuilder> fmb;
1380 const Teuchos::ParameterList & user_data_params = p.sublist(
"User Data");
1382 bool write_dot_files =
false;
1383 std::string prefix =
"Cloned_";
1385 std::vector<panzer::BC> bcs;
1386 if(bc_list==Teuchos::null) {
1387 panzer::buildBCs(bcs, p.sublist(
"Boundary Conditions"), m_global_data);
1390 panzer::buildBCs(bcs, *bc_list, m_global_data);
1393 fmb = buildFieldManagerBuilder(
1403 p.sublist(
"Closure Models"),
1406 write_dot_files,prefix,
1407 write_dot_files,prefix);
1410 Teuchos::RCP<panzer::ResponseLibrary<panzer::Traits> > response_library
1413 m_lin_obj_factory));
1421 Thyra::ModelEvaluatorBase::InArgs<ScalarT> nomVals = physics_me->getNominalValues();
1424 Teuchos::RCP<PanzerME> panzer_me = Teuchos::rcp_dynamic_cast<PanzerME>(physics_me);
1426 bool useThyra =
true;
1427#ifdef PANZER_HAVE_EPETRA_STACK
1428 Teuchos::RCP<Thyra::EpetraModelEvaluator> ep_thyra_me = Teuchos::rcp_dynamic_cast<Thyra::EpetraModelEvaluator>(physics_me);
1429 if(ep_thyra_me!=Teuchos::null)
1434 std::vector<Teuchos::RCP<Teuchos::Array<std::string> > > p_names(physics_me->Np());
1435 std::vector<Teuchos::RCP<Teuchos::Array<double> > > p_values(physics_me->Np());
1436 for(std::size_t i=0;i<p_names.size();i++) {
1437 p_names[i] = Teuchos::rcp(
new Teuchos::Array<std::string>(*physics_me->get_p_names(i)));
1438 p_values[i] = Teuchos::rcp(
new Teuchos::Array<double>(p_names[i]->size(),0.0));
1441 Teuchos::RCP<Thyra::ModelEvaluatorDefaultBase<double> > thyra_me
1442 = buildPhysicsModelEvaluator(useThyra,
1454 thyra_me->getNominalValues() = nomVals;
1458 const Teuchos::ParameterList & assembly_params = p.sublist(
"Assembly");
1459 bool lumpExplicitMass = assembly_params.get<
bool>(
"Lump Explicit Mass");