TEUCHOS_UNIT_TEST(workset_builder, stk_edge) { RCP<Teuchos::ParameterList> pl = rcp(new Teuchos::ParameterList); pl->set("X Blocks",2); pl->set("Y Blocks",1); pl->set("X Elements",2); // in each block pl->set("Y Elements",2); // in each block // This mesh will have element IDs // 4 5 6 7 // 0 1 2 3 int myRank=0; MPI_Comm_rank(MPI_COMM_WORLD, &myRank); panzer_stk::SquareQuadMeshFactory factory; factory.setParameterList(pl); RCP<panzer_stk::STK_Interface> mesh = factory.buildMesh(MPI_COMM_WORLD); mesh->writeToExodus("test.exo"); std::vector<std::string> element_blocks; mesh->getElementBlockNames(element_blocks); const std::size_t workset_size = 20; // Use a high integration order to test ordering of the fields in // IntegrationValues2. const int default_integration_order = 4; Teuchos::RCP<Teuchos::ParameterList> ipb = Teuchos::parameterList("Physics Blocks"); std::vector<panzer::BC> bcs; testInitialzation(ipb, bcs, default_integration_order); // build physics blocks ////////////////////////////////////////////////////////////// std::vector<Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks; { Teuchos::RCP<user_app::MyFactory> eqset_factory = Teuchos::rcp(new user_app::MyFactory); std::map<std::string,std::string> block_ids_to_physics_ids; block_ids_to_physics_ids["eblock-0_0"] = "test physics"; block_ids_to_physics_ids["eblock-1_0"] = "test physics"; std::map<std::string,Teuchos::RCP<const shards::CellTopology> > block_ids_to_cell_topo; block_ids_to_cell_topo["eblock-0_0"] = mesh->getCellTopology("eblock-0_0"); block_ids_to_cell_topo["eblock-1_0"] = mesh->getCellTopology("eblock-1_0"); Teuchos::RCP<panzer::GlobalData> gd = panzer::createGlobalData(); panzer::buildPhysicsBlocks(block_ids_to_physics_ids, block_ids_to_cell_topo, ipb, default_integration_order, workset_size, eqset_factory, gd, false, physicsBlocks); } { std::string sideset = "vertical_0"; Teuchos::RCP<std::map<unsigned,panzer::Workset> > worksets = panzer_stk::buildBCWorksets( *mesh, *(panzer::findPhysicsBlock(element_blocks[0],physicsBlocks)), *(panzer::findPhysicsBlock(element_blocks[1],physicsBlocks)), sideset); if(myRank==0) { TEST_EQUALITY(worksets->size(),0); // no elements on this processor } else { TEST_EQUALITY(worksets->size(),1); panzer::Workset& workset = worksets->begin()->second; TEST_EQUALITY((*worksets).size(),1); TEST_EQUALITY(workset.num_cells,2); TEST_EQUALITY(workset.subcell_dim,1); TEST_EQUALITY(workset.numDetails(),2); // this is identical to workset(0) TEST_EQUALITY(workset.subcell_index, 1); TEST_EQUALITY(workset.block_id, "eblock-0_0"); TEST_EQUALITY(workset.cell_local_ids.size(),2); TEST_EQUALITY(workset.cell_local_ids[0],0); TEST_EQUALITY(workset.cell_local_ids[1],2); TEST_EQUALITY(workset.ir_degrees->size(),1); TEST_EQUALITY(workset.int_rules.size(),1); TEST_EQUALITY(workset.basis_names->size(),2); TEST_EQUALITY(workset.bases.size(),2); TEST_EQUALITY(workset(0).subcell_index, 1); TEST_EQUALITY(workset(0).block_id, "eblock-0_0"); TEST_EQUALITY(workset(0).cell_local_ids.size(),2); TEST_EQUALITY(workset(0).cell_local_ids[0],0); TEST_EQUALITY(workset(0).cell_local_ids[1],2); TEST_EQUALITY(workset(0).ir_degrees->size(),1); TEST_EQUALITY(workset(0).int_rules.size(),1); TEST_EQUALITY(workset(0).basis_names->size(),2); TEST_EQUALITY(workset(0).bases.size(),2); TEST_EQUALITY(workset(1).subcell_index, 3); TEST_EQUALITY(workset(1).block_id, "eblock-1_0"); TEST_EQUALITY(workset(1).cell_local_ids[0],5); TEST_EQUALITY(workset(1).cell_local_ids[1],7); TEST_EQUALITY(workset(1).ir_degrees->size(),1); TEST_EQUALITY(workset(1).int_rules.size(),1); TEST_EQUALITY(workset(1).basis_names->size(),2); TEST_EQUALITY(workset(1).bases.size(),2); testIpMatch(workset(0), workset(1), workset.num_cells, out, success); } } { std::string sideset = "vertical_0"; Teuchos::RCP<std::map<unsigned,panzer::Workset> > worksets = panzer_stk::buildBCWorksets( *mesh, *(panzer::findPhysicsBlock(element_blocks[1],physicsBlocks)), *(panzer::findPhysicsBlock(element_blocks[0],physicsBlocks)), sideset); if(myRank==1) { TEST_EQUALITY(worksets->size(),0); // no elements on this processor } else { TEST_EQUALITY(worksets->size(),1); panzer::Workset& workset = worksets->begin()->second; TEST_EQUALITY(workset.num_cells,2); TEST_EQUALITY(workset.subcell_dim,1); TEST_EQUALITY(workset.numDetails(),2); // this is identical to details[0] TEST_EQUALITY(workset.subcell_index, 3); TEST_EQUALITY(workset.block_id, "eblock-1_0"); TEST_EQUALITY(workset.cell_local_ids.size(),2); TEST_EQUALITY(workset.cell_local_ids[0],1); TEST_EQUALITY(workset.cell_local_ids[1],3); TEST_EQUALITY(workset.ir_degrees->size(),1); TEST_EQUALITY(workset.int_rules.size(),1); TEST_EQUALITY(workset.basis_names->size(),2); TEST_EQUALITY(workset.bases.size(),2); TEST_EQUALITY(workset(0).subcell_index, 3); TEST_EQUALITY(workset(0).block_id, "eblock-1_0"); TEST_EQUALITY(workset(0).cell_local_ids.size(),2); TEST_EQUALITY(workset(0).cell_local_ids[0],1); TEST_EQUALITY(workset(0).cell_local_ids[1],3); TEST_EQUALITY(workset(0).ir_degrees->size(),1); TEST_EQUALITY(workset(0).int_rules.size(),1); TEST_EQUALITY(workset(0).basis_names->size(),2); TEST_EQUALITY(workset(0).bases.size(),2); TEST_EQUALITY(workset(1).subcell_index, 1); TEST_EQUALITY(workset(1).block_id, "eblock-0_0"); TEST_EQUALITY(workset(1).cell_local_ids[0],4); TEST_EQUALITY(workset(1).cell_local_ids[1],6); TEST_EQUALITY(workset(1).ir_degrees->size(),1); TEST_EQUALITY(workset(1).int_rules.size(),1); TEST_EQUALITY(workset(1).basis_names->size(),2); TEST_EQUALITY(workset(1).bases.size(),2); testIpMatch(workset(0), workset(1), workset.num_cells, out, success); } } }
TEUCHOS_UNIT_TEST(gs_evaluators, gather_constr) { PHX::KokkosDeviceSession session; const std::size_t workset_size = 20; Teuchos::RCP<panzer::BasisIRLayout> linBasis = buildLinearBasis(workset_size); Teuchos::RCP<std::vector<std::string> > fieldNames = Teuchos::rcp(new std::vector<std::string>); fieldNames->push_back("dog"); Teuchos::ParameterList pl; pl.set("Basis",linBasis); pl.set("Field Names",fieldNames); Teuchos::RCP<panzer_stk_classic::STK_Interface> mesh = buildMesh(2,2); RCP<Epetra_Comm> Comm = Teuchos::rcp(new Epetra_MpiComm(MPI_COMM_WORLD)); Teuchos::RCP<Teuchos::ParameterList> ipb = Teuchos::parameterList("Physics Blocks"); std::vector<panzer::BC> bcs; testInitialzation(ipb, bcs); Teuchos::RCP<panzer::FieldManagerBuilder> fmb = Teuchos::rcp(new panzer::FieldManagerBuilder); // build physics blocks ////////////////////////////////////////////////////////////// Teuchos::RCP<user_app::MyFactory> eqset_factory = Teuchos::rcp(new user_app::MyFactory); user_app::BCFactory bc_factory; std::vector<Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks; { std::map<std::string,std::string> block_ids_to_physics_ids; block_ids_to_physics_ids["eblock-0_0"] = "test physics"; block_ids_to_physics_ids["eblock-1_0"] = "test physics"; std::map<std::string,Teuchos::RCP<const shards::CellTopology> > block_ids_to_cell_topo; block_ids_to_cell_topo["eblock-0_0"] = mesh->getCellTopology("eblock-0_0"); block_ids_to_cell_topo["eblock-1_0"] = mesh->getCellTopology("eblock-1_0"); Teuchos::RCP<panzer::GlobalData> gd = panzer::createGlobalData(); int default_integration_order = 1; panzer::buildPhysicsBlocks(block_ids_to_physics_ids, block_ids_to_cell_topo, ipb, default_integration_order, workset_size, eqset_factory, gd, false, physicsBlocks); } Teuchos::RCP<panzer_stk_classic::WorksetFactory> wkstFactory = Teuchos::rcp(new panzer_stk_classic::WorksetFactory(mesh)); // build STK workset factory Teuchos::RCP<panzer::WorksetContainer> wkstContainer // attach it to a workset container (uses lazy evaluation) = Teuchos::rcp(new panzer::WorksetContainer(wkstFactory,physicsBlocks,workset_size)); // build DOF Manager ///////////////////////////////////////////////////////////// // build the connection manager const Teuchos::RCP<panzer::ConnManager<int,int> > conn_manager = Teuchos::rcp(new panzer_stk_classic::STKConnManager<int>(mesh)); panzer::DOFManagerFactory<int,int> globalIndexerFactory; RCP<panzer::UniqueGlobalIndexer<int,int> > dofManager = globalIndexerFactory.buildUniqueGlobalIndexer(Teuchos::opaqueWrapper(MPI_COMM_WORLD),physicsBlocks,conn_manager); Teuchos::RCP<panzer::EpetraLinearObjFactory<panzer::Traits,int> > eLinObjFactory = Teuchos::rcp(new panzer::EpetraLinearObjFactory<panzer::Traits,int>(Comm.getConst(),dofManager)); Teuchos::RCP<panzer::LinearObjFactory<panzer::Traits> > linObjFactory = eLinObjFactory; // setup field manager build ///////////////////////////////////////////////////////////// // Add in the application specific closure model factory user_app::MyModelFactory_TemplateBuilder cm_builder; panzer::ClosureModelFactory_TemplateManager<panzer::Traits> cm_factory; cm_factory.buildObjects(cm_builder); Teuchos::ParameterList closure_models("Closure Models"); closure_models.sublist("solid").sublist("SOURCE_TEMPERATURE").set<double>("Value",1.0); closure_models.sublist("ion solid").sublist("SOURCE_ION_TEMPERATURE").set<double>("Value",1.0); Teuchos::ParameterList user_data("User Data"); fmb->setWorksetContainer(wkstContainer); fmb->setupVolumeFieldManagers(physicsBlocks,cm_factory,closure_models,*linObjFactory,user_data); fmb->setupBCFieldManagers(bcs,physicsBlocks,*eqset_factory,cm_factory,bc_factory,closure_models,*linObjFactory,user_data); fmb->writeVolumeGraphvizDependencyFiles("field_manager",physicsBlocks); panzer::AssemblyEngine_TemplateManager<panzer::Traits> ae_tm; panzer::AssemblyEngine_TemplateBuilder builder(fmb,linObjFactory); ae_tm.buildObjects(builder); RCP<panzer::EpetraLinearObjContainer> eGhosted = Teuchos::rcp_dynamic_cast<panzer::EpetraLinearObjContainer>(linObjFactory->buildGhostedLinearObjContainer()); RCP<panzer::EpetraLinearObjContainer> eGlobal = Teuchos::rcp_dynamic_cast<panzer::EpetraLinearObjContainer>(linObjFactory->buildLinearObjContainer()); eLinObjFactory->initializeGhostedContainer(panzer::EpetraLinearObjContainer::X | panzer::EpetraLinearObjContainer::DxDt | panzer::EpetraLinearObjContainer::F | panzer::EpetraLinearObjContainer::Mat,*eGhosted); eLinObjFactory->initializeContainer(panzer::EpetraLinearObjContainer::X | panzer::EpetraLinearObjContainer::DxDt | panzer::EpetraLinearObjContainer::F | panzer::EpetraLinearObjContainer::Mat,*eGlobal); panzer::AssemblyEngineInArgs input(eGhosted,eGlobal); ae_tm.getAsObject<panzer::Traits::Residual>()->evaluate(input); ae_tm.getAsObject<panzer::Traits::Jacobian>()->evaluate(input); }