void populateValueArrays(std::size_t num_cells,bool isSide,const panzer::PhysicsBlock & in_pb,WorksetDetails & details) { using Teuchos::RCP; using Teuchos::rcp; panzer::IntrepidFieldContainerFactory arrayFactory; // setup the integration rules and bases RCP<const panzer::PhysicsBlock> pb = Teuchos::rcpFromRef(in_pb); if(isSide) { const panzer::CellData side_cell_data(num_cells, details.subcell_index, in_pb.cellData().getCellTopology()); pb = in_pb.copyWithCellData(side_cell_data); } const std::map<int,RCP<panzer::IntegrationRule> >& int_rules = pb->getIntegrationRules(); details.ir_degrees = rcp(new std::vector<int>(0)); details.basis_names = rcp(new std::vector<std::string>(0)); for (std::map<int,RCP<panzer::IntegrationRule> >::const_iterator ir_itr = int_rules.begin(); ir_itr != int_rules.end(); ++ir_itr) { details.ir_degrees->push_back(ir_itr->first); RCP<panzer::IntegrationValues<double,Intrepid::FieldContainer<double> > > iv = rcp(new panzer::IntegrationValues<double,Intrepid::FieldContainer<double> >); iv->setupArrays(ir_itr->second); iv->evaluateValues(details.cell_vertex_coordinates); details.int_rules.push_back(iv); // Need to create all combinations of basis/ir pairings const std::map<std::string,Teuchos::RCP<panzer::PureBasis> >& bases = pb->getBases(); for (std::map<std::string,Teuchos::RCP<panzer::PureBasis> >::const_iterator b_itr = bases.begin(); b_itr != bases.end(); ++b_itr) { RCP<panzer::BasisIRLayout> b_layout = rcp(new panzer::BasisIRLayout(b_itr->second,*ir_itr->second)); details.basis_names->push_back(b_layout->name()); RCP<panzer::BasisValues<double,Intrepid::FieldContainer<double> > > bv = rcp(new panzer::BasisValues<double,Intrepid::FieldContainer<double> >); bv->setupArrays(b_layout,arrayFactory); std::size_t int_degree_index = std::distance(details.ir_degrees->begin(), std::find(details.ir_degrees->begin(), details.ir_degrees->end(), ir_itr->second->order())); bv->evaluateValues(details.int_rules[int_degree_index]->cub_points, details.int_rules[int_degree_index]->jac, details.int_rules[int_degree_index]->jac_det, details.int_rules[int_degree_index]->jac_inv, details.int_rules[int_degree_index]->weighted_measure, details.cell_vertex_coordinates); details.bases.push_back(bv); } } }