Teuchos::RCP<std::vector<Workset> > WorksetContainer::getWorksets(const WorksetDescriptor & wd) { Teuchos::RCP<std::vector<Workset> > worksetVector; VolumeMap::iterator itr = volWorksets_.find(wd); if(itr==volWorksets_.end()) { // couldn't find workset, build it! const PhysicsBlock & pb = lookupPhysicsBlock(wd.getElementBlock()); worksetVector = wkstFactory_->getWorksets(wd,pb); // apply orientations to the just constructed worksets if(worksetVector!=Teuchos::null) applyOrientations(wd.getElementBlock(),*worksetVector); // store vector for reuse in the future volWorksets_[wd] = worksetVector; } else worksetVector = itr->second; return worksetVector; }
//======================================================================= void panzer::FieldManagerBuilder::setupVolumeFieldManagers( const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks, const std::vector<WorksetDescriptor> & wkstDesc, const panzer::ClosureModelFactory_TemplateManager<panzer::Traits>& cm_factory, const Teuchos::ParameterList& closure_models, const panzer::LinearObjFactory<panzer::Traits> & lo_factory, const Teuchos::ParameterList& user_data, const GenericEvaluatorFactory & gEvalFact, bool closureModelByEBlock) { using Teuchos::RCP; using Teuchos::rcp; TEUCHOS_TEST_FOR_EXCEPTION(getWorksetContainer()==Teuchos::null,std::logic_error, "panzer::FMB::setupVolumeFieldManagers: method function getWorksetContainer() returns null. " "Plase call setWorksetContainer() before calling this method"); TEUCHOS_TEST_FOR_EXCEPTION(physicsBlocks.size()!=wkstDesc.size(),std::runtime_error, "panzer::FMB::setupVolumeFieldManagers: physics block count must match workset descriptor count."); phx_volume_field_managers_.clear(); for (std::size_t blkInd=0;blkInd<physicsBlocks.size();++blkInd) { RCP<panzer::PhysicsBlock> pb = physicsBlocks[blkInd]; const WorksetDescriptor wd = wkstDesc[blkInd]; Traits::SetupData setupData; setupData.worksets_ = getWorksetContainer()->getWorksets(wd); if(setupData.worksets_->size()==0) continue; // sanity check TEUCHOS_ASSERT(wd.getElementBlock()==pb->elementBlockID()); // build a field manager object Teuchos::RCP<PHX::FieldManager<panzer::Traits> > fm = Teuchos::rcp(new PHX::FieldManager<panzer::Traits>); // use the physics block to register evaluators pb->buildAndRegisterEquationSetEvaluators(*fm, user_data); if(!physicsBlockGatherDisabled()) pb->buildAndRegisterGatherAndOrientationEvaluators(*fm,lo_factory,user_data); pb->buildAndRegisterDOFProjectionsToIPEvaluators(*fm,Teuchos::ptrFromRef(lo_factory),user_data); if(!physicsBlockScatterDisabled()) pb->buildAndRegisterScatterEvaluators(*fm,lo_factory,user_data); if(closureModelByEBlock) pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,pb->elementBlockID(),closure_models,user_data); else pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,closure_models,user_data); // register additional model evaluator from the generic evaluator factory gEvalFact.registerEvaluators(*fm,wd,*pb); // build the setup data using passed in information fm->postRegistrationSetup(setupData); // make sure to add the field manager & workset to the list volume_workset_desc_.push_back(wd); phx_volume_field_managers_.push_back(fm); } }
Teuchos::RCP<std::vector<panzer::Workset> > getWorksets(const WorksetDescriptor & wd, const panzer::PhysicsBlock & pb) const { return volume_worksets[wd.getElementBlock()]; } // lazy