Teuchos::RCP<panzer::PureBasis> buildBasis(std::size_t worksetSize,const std::string & basisName) { Teuchos::RCP<shards::CellTopology> topo = Teuchos::rcp(new shards::CellTopology(shards::getCellTopologyData< shards::Quadrilateral<4> >())); panzer::CellData cellData(worksetSize,topo); return Teuchos::rcp(new panzer::PureBasis(basisName,1,cellData)); }
Teuchos::RCP<panzer::BasisIRLayout> buildLinearBasis(std::size_t worksetSize) { Teuchos::RCP<shards::CellTopology> topo = Teuchos::rcp(new shards::CellTopology(shards::getCellTopologyData< shards::Quadrilateral<4> >())); panzer::CellData cellData(worksetSize,topo); panzer::IntegrationRule intRule(1,cellData); return Teuchos::rcp(new panzer::BasisIRLayout("Q1",1,intRule)); }
void CDPTH::readCells(ReadContext &ctx) { /* Read the cell data, each containing 64x64 pixels. Of course, since this * is a *compressed* format, the data is compressed using the LZSS algorithm * also used for .small files. */ ctx.cells.reserve(4096); try { // Read the cell offset and sizes for (size_t i = 0; i < 4096; i++) { const uint32 size = ctx.cdpth->readUint16LE(); const uint32 offset = ctx.cdpth->readUint16LE() * 512; if (offset < 0x4000) break; ctx.cells.push_back(0); if (size == 0) continue; uint32 pos = ctx.cdpth->pos(); Common::SeekableSubReadStream cellData(ctx.cdpth, offset, offset + size); ctx.cells.back() = Aurora::Small::decompress(cellData); if (ctx.cells.back()->size() != 8192) throw Common::Exception("Invalid size for cell %u: %u", (uint)i, (uint)ctx.cells.back()->size()); ctx.cdpth->seek(pos); } if (ctx.cells.empty()) throw Common::Exception("No cells"); } catch (Common::Exception &e) { e.add("Failed reading CDPTH file"); throw e; } }
TEUCHOS_UNIT_TEST(gather_orientation, gather_constr) { const std::size_t workset_size = 4; const std::string fieldName_q1 = "U"; const std::string fieldName_qedge1 = "V"; Teuchos::RCP<panzer_stk_classic::STK_Interface> mesh = buildMesh(2,2); // build input physics block Teuchos::RCP<panzer::PureBasis> basis_q1 = buildBasis(workset_size,"Q1"); Teuchos::RCP<panzer::PureBasis> basis_qedge1 = buildBasis(workset_size,"QEdge1"); Teuchos::RCP<Teuchos::ParameterList> ipb = Teuchos::parameterList(); testInitialization(ipb); const int default_int_order = 1; std::string eBlockID = "eblock-0_0"; Teuchos::RCP<user_app::MyFactory> eqset_factory = Teuchos::rcp(new user_app::MyFactory); panzer::CellData cellData(workset_size,mesh->getCellTopology("eblock-0_0")); Teuchos::RCP<panzer::GlobalData> gd = panzer::createGlobalData(); Teuchos::RCP<panzer::PhysicsBlock> physicsBlock = Teuchos::rcp(new PhysicsBlock(ipb,eBlockID,default_int_order,cellData,eqset_factory,gd,false)); Teuchos::RCP<std::vector<panzer::Workset> > work_sets = panzer_stk_classic::buildWorksets(*mesh,*physicsBlock); TEST_EQUALITY(work_sets->size(),1); // build connection manager and field manager const Teuchos::RCP<panzer::ConnManager<int,int> > conn_manager = Teuchos::rcp(new panzer_stk_classic::STKConnManager<int>(mesh)); RCP<panzer::DOFManager<int,int> > dofManager = Teuchos::rcp(new panzer::DOFManager<int,int>(conn_manager,MPI_COMM_WORLD)); dofManager->addField(fieldName_q1,Teuchos::rcp(new panzer::Intrepid2FieldPattern(basis_q1->getIntrepid2Basis()))); dofManager->addField(fieldName_qedge1,Teuchos::rcp(new panzer::Intrepid2FieldPattern(basis_qedge1->getIntrepid2Basis()))); dofManager->setOrientationsRequired(true); dofManager->buildGlobalUnknowns(); // setup field manager, add evaluator under test ///////////////////////////////////////////////////////////// PHX::FieldManager<panzer::Traits> fm; Teuchos::RCP<PHX::FieldTag> evalField_q1, evalField_qedge1; { Teuchos::RCP<std::vector<std::string> > dofNames = Teuchos::rcp(new std::vector<std::string>); dofNames->push_back(fieldName_q1); Teuchos::ParameterList pl; pl.set("Indexer Names",dofNames); pl.set("DOF Names",dofNames); pl.set("Basis",basis_q1); Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator = Teuchos::rcp(new panzer::GatherOrientation<panzer::Traits::Residual,panzer::Traits,int,int>(dofManager,pl)); TEST_EQUALITY(evaluator->evaluatedFields().size(),1); evalField_q1 = evaluator->evaluatedFields()[0]; TEST_EQUALITY(evalField_q1->name(),basis_q1->name()+" Orientation"); TEST_EQUALITY(evalField_q1->dataLayout().dimension(0),basis_q1->functional->dimension(0)); TEST_EQUALITY(evalField_q1->dataLayout().dimension(1),basis_q1->functional->dimension(1)); fm.registerEvaluator<panzer::Traits::Residual>(evaluator); fm.requireField<panzer::Traits::Residual>(*evaluator->evaluatedFields()[0]); } { Teuchos::RCP<std::vector<std::string> > dofNames = Teuchos::rcp(new std::vector<std::string>); dofNames->push_back(fieldName_qedge1); Teuchos::ParameterList pl; pl.set("Indexer Names",dofNames); pl.set("DOF Names",dofNames); pl.set("Basis",basis_qedge1); Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator = Teuchos::rcp(new panzer::GatherOrientation<panzer::Traits::Residual,panzer::Traits,int,int>(dofManager,pl)); TEST_EQUALITY(evaluator->evaluatedFields().size(),1); evalField_qedge1 = evaluator->evaluatedFields()[0]; TEST_EQUALITY(evalField_qedge1->name(),basis_qedge1->name()+" Orientation"); TEST_EQUALITY(evalField_qedge1->dataLayout().dimension(0),basis_qedge1->functional->dimension(0)); TEST_EQUALITY(evalField_qedge1->dataLayout().dimension(1),basis_qedge1->functional->dimension(1)); fm.registerEvaluator<panzer::Traits::Residual>(evaluator); fm.requireField<panzer::Traits::Residual>(*evaluator->evaluatedFields()[0]); } panzer::Traits::SetupData sd; fm.postRegistrationSetup(sd); // run tests ///////////////////////////////////////////////////////////// panzer::Workset & workset = (*work_sets)[0]; workset.alpha = 0.0; workset.beta = 0.0; workset.time = 0.0; workset.evaluate_transient_terms = false; fm.evaluateFields<panzer::Traits::Residual>(workset); // <cell,basis> PHX::MDField<panzer::Traits::Residual::ScalarT> fieldData_q1(evalField_q1->name(),basis_q1->functional); // <cell,basis> PHX::MDField<panzer::Traits::Residual::ScalarT> fieldData_qedge1(evalField_qedge1->name(),basis_qedge1->functional); fm.getFieldData<panzer::Traits::Residual::ScalarT,panzer::Traits::Residual>(fieldData_q1); fm.getFieldData<panzer::Traits::Residual::ScalarT,panzer::Traits::Residual>(fieldData_qedge1); for(int i=0;i<fieldData_q1.size();i++) { TEST_EQUALITY(fieldData_q1[i],1); } for(int i=0;i<fieldData_qedge1.dimension(0);i++) { TEST_EQUALITY(fieldData_qedge1(i,0), 1); TEST_EQUALITY(fieldData_qedge1(i,1), 1); TEST_EQUALITY(fieldData_qedge1(i,2),-1); TEST_EQUALITY(fieldData_qedge1(i,3),-1); } }
const std::vector<double>& solvent_saturation() const { return cellData()[ solventId_ ]; }
TEUCHOS_UNIT_TEST(basis_time_vector, residual) { PHX::KokkosDeviceSession session; const std::size_t workset_size = 1; const std::string fieldName_q1 = "TEMPERATURE"; const std::string fieldName_qedge1 = "ION_TEMPERATURE"; Teuchos::RCP<panzer_stk_classic::STK_Interface> mesh = buildMesh(1,1); // build input physics block Teuchos::RCP<panzer::PureBasis> basis_q1 = buildBasis(workset_size,"Q1"); Teuchos::RCP<panzer::PureBasis> basis_qedge1 = buildBasis(workset_size,"QEdge1"); Teuchos::RCP<Teuchos::ParameterList> ipb = Teuchos::parameterList(); testInitialization(ipb); const int default_int_order = 1; std::string eBlockID = "eblock-0_0"; Teuchos::RCP<user_app::MyFactory> eqset_factory = Teuchos::rcp(new user_app::MyFactory); panzer::CellData cellData(workset_size,mesh->getCellTopology("eblock-0_0")); Teuchos::RCP<panzer::GlobalData> gd = panzer::createGlobalData(); Teuchos::RCP<panzer::PhysicsBlock> physicsBlock = Teuchos::rcp(new PhysicsBlock(ipb,eBlockID,default_int_order,cellData,eqset_factory,gd,false)); Teuchos::RCP<panzer::IntegrationRule> ir = buildIR(workset_size,4); Teuchos::RCP<panzer::BasisIRLayout> layout_qedge1 = Teuchos::rcp(new panzer::BasisIRLayout(basis_qedge1,*ir)); // build connection manager and field manager const Teuchos::RCP<panzer::ConnManager<int,int> > conn_manager = Teuchos::rcp(new panzer_stk_classic::STKConnManager<int>(mesh)); RCP<panzer::DOFManager<int,int> > dofManager = Teuchos::rcp(new panzer::DOFManager<int,int>(conn_manager,MPI_COMM_WORLD)); dofManager->addField(fieldName_q1,Teuchos::rcp(new panzer::IntrepidFieldPattern(basis_q1->getIntrepidBasis()))); dofManager->addField(fieldName_qedge1,Teuchos::rcp(new panzer::IntrepidFieldPattern(basis_qedge1->getIntrepidBasis()))); dofManager->setOrientationsRequired(true); dofManager->buildGlobalUnknowns(); // build worksets std::vector<Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks; physicsBlocks.push_back(physicsBlock); // pushing back singular panzer::WorksetContainer wkstContainer(Teuchos::rcp(new panzer_stk_classic::WorksetFactory(mesh)),physicsBlocks,workset_size); wkstContainer.setGlobalIndexer(dofManager); Teuchos::RCP<std::vector<panzer::Workset> > work_sets = wkstContainer.getVolumeWorksets(physicsBlock->elementBlockID()); TEST_EQUALITY(work_sets->size(),1); // setup field manager, add evaluator under test ///////////////////////////////////////////////////////////// PHX::FieldManager<panzer::Traits> fm; { Teuchos::ParameterList pl; pl.set("Name","Integrand"); pl.set("IR",ir); pl.set("Is Vector",true); pl.set<Teuchos::RCP<const PointEvaluation<panzer::Traits::Residual::ScalarT> > >("Point Evaluator", Teuchos::rcp(new BilinearPointEvaluator)); Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator = Teuchos::rcp(new PointEvaluator<panzer::Traits::Residual,panzer::Traits>(pl)); fm.registerEvaluator<panzer::Traits::Residual>(evaluator); } { Teuchos::ParameterList pl; pl.set("Residual Name","Residual"); pl.set("Value Name","Integrand"); pl.set("Test Field Name",fieldName_qedge1); pl.set("Basis",layout_qedge1); pl.set("IR",ir); pl.set<double>("Multiplier", 1.0); Teuchos::RCP<const std::vector<std::string> > vec = Teuchos::rcp(new std::vector<std::string>); pl.set("Field Multipliers", vec); Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator = Teuchos::rcp(new panzer::Integrator_BasisTimesVector<panzer::Traits::Residual,panzer::Traits>(pl)); fm.registerEvaluator<panzer::Traits::Residual>(evaluator); fm.requireField<panzer::Traits::Residual>(*evaluator->evaluatedFields()[0]); } std::vector<PHX::index_size_type> derivative_dimensions; derivative_dimensions.push_back(8); fm.setKokkosExtendedDataTypeDimensions<panzer::Traits::Jacobian>(derivative_dimensions); panzer::Traits::SetupData sd; sd.worksets_ = work_sets; fm.postRegistrationSetup(sd); // run tests ///////////////////////////////////////////////////////////// panzer::Workset & workset = (*work_sets)[0]; workset.alpha = 0.0; workset.beta = 0.0; workset.time = 0.0; workset.evaluate_transient_terms = false; fm.evaluateFields<panzer::Traits::Residual>(workset); PHX::MDField<panzer::Traits::Residual::ScalarT,panzer::Cell,panzer::BASIS> fieldData_qedge1("Residual",basis_qedge1->functional); fm.getFieldData<panzer::Traits::Residual::ScalarT,panzer::Traits::Residual>(fieldData_qedge1); TEST_EQUALITY(fieldData_qedge1.dimension(0),1); TEST_EQUALITY(fieldData_qedge1.dimension(1),4); // Transformation is [x,y] = F[x_ref,y_ref] = 0.5*[1,1]+0.5*[1,0;0,1]*[x_ref,y_ref] // therefore transformation matrix is DF^{-T} = 2*[1,0;0,1] // so curl vector u_ref:Ref_coord=>Ref_Vec transforms with // // u(x,y)=DF^{-T}*u_ref(F^{-1}(x,y)) TEST_FLOATING_EQUALITY(fieldData_qedge1(0,0),5.0/12.0,1e-5); // 0 edge basis is [(1-y_ref)/4, 0] TEST_FLOATING_EQUALITY(fieldData_qedge1(0,2),3.0/4.0,1e-5); // 2 edge basis is [(1+y_ref)/4, 0] // these two have sign changes because of the mesh topology! TEST_FLOATING_EQUALITY(fieldData_qedge1(0,1),0.428925006266,1e-5); // 1 edge basis is [(1+x_ref)/4, 0] TEST_FLOATING_EQUALITY(fieldData_qedge1(0,3),0.344719536524,1e-5); // 3 edge basis is [(1-x_ref)/4, 0] }