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);
      }
    }
    
  }
Beispiel #2
0
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);
}