// draw objects with geometry shader defined by points void draw_objects(const Shader& shad, const GLuint option) { // number of objects (quads) constexpr GLuint n {100}; shad.use(); GLuint vao{}, vbo{}; if (option == 0) { gen_objects(vao, vbo, quad_vertices(), 5, 2); const auto offset_arr = offsets_array(n); const auto idx = shad.id(); for (GLuint i {0}; i < n; ++i) { const GLint loc = glGetUniformLocation(idx, std::string{"offsets_arr[" + std::to_string(i) + "]"}. c_str()); glUniform2f(loc, offset_arr[i].x, offset_arr[i].y); } } else { GLuint inst_vbo {gen_instance_buf(offsets_array(n))}; gen_objects_base(vao, vbo, quad_vertices(), 5, 2); set_instance_data(inst_vbo); } glBindVertexArray(vao); glDrawArraysInstanced(GL_TRIANGLES, 0, 6, n); glBindVertexArray(0); }
DOF<typename TRAITS::Jacobian, TRAITS>:: DOF(const Teuchos::ParameterList & p) : dof_basis( p.get<std::string>("Name"), p.get< Teuchos::RCP<BasisIRLayout> >("Basis")->functional), basis_name(p.get< Teuchos::RCP<BasisIRLayout> >("Basis")->name()) { Teuchos::RCP<const PureBasis> basis = p.get< Teuchos::RCP<BasisIRLayout> >("Basis")->getBasis(); is_vector_basis = basis->isVectorBasis(); if(p.isType<Teuchos::RCP<const std::vector<int> > >("Jacobian Offsets Vector")) { const std::vector<int> & offsets = *p.get<Teuchos::RCP<const std::vector<int> > >("Jacobian Offsets Vector"); // allocate and copy offsets vector to Kokkos array offsets_array = Kokkos::View<int*,PHX::Device>("offsets",offsets.size()); for(std::size_t i=0;i<offsets.size();i++) offsets_array(i) = offsets[i]; accelerate_jacobian_enabled = true; // short cut for identity matrix // get the sensitivities name that is valid for accelerated jacobians sensitivities_name = true; if (p.isType<std::string>("Sensitivities Name")) sensitivities_name = p.get<std::string>("Sensitivities Name"); } else accelerate_jacobian_enabled = false; // don't short cut for identity matrix // swap between scalar basis value, or vector basis value if(basis->isScalarBasis()) { dof_ip_scalar = PHX::MDField<ScalarT,Cell,Point>( p.get<std::string>("Name"), p.get< Teuchos::RCP<panzer::IntegrationRule> >("IR")->dl_scalar); this->addEvaluatedField(dof_ip_scalar); } else if(basis->isVectorBasis()) { dof_ip_vector = PHX::MDField<ScalarT,Cell,Point,Dim>( p.get<std::string>("Name"), p.get< Teuchos::RCP<panzer::IntegrationRule> >("IR")->dl_vector); this->addEvaluatedField(dof_ip_vector); } else { TEUCHOS_ASSERT(false); } this->addDependentField(dof_basis); std::string n = "DOF: " + dof_basis.fieldTag().name() + ( accelerate_jacobian_enabled ? " accel_jac " : "slow_jac" ) + " ("+PHX::typeAsString<panzer::Traits::Jacobian>()+")"; this->setName(n); }
DOF_PointValues<typename TRAITS::Jacobian, TRAITS>:: DOF_PointValues(const Teuchos::ParameterList & p) { const std::string fieldName = p.get<std::string>("Name"); basis = p.get< Teuchos::RCP<const PureBasis> >("Basis"); Teuchos::RCP<const PointRule> pointRule = p.get< Teuchos::RCP<const PointRule> >("Point Rule"); is_vector_basis = basis->isVectorBasis(); if(p.isType<Teuchos::RCP<const std::vector<int> > >("Jacobian Offsets Vector")) { const std::vector<int> & offsets = *p.get<Teuchos::RCP<const std::vector<int> > >("Jacobian Offsets Vector"); // allocate and copy offsets vector to Kokkos array offsets_array = Kokkos::View<int*,PHX::Device>("offsets",offsets.size()); for(std::size_t i=0;i<offsets.size();i++) offsets_array(i) = offsets[i]; accelerate_jacobian = true; // short cut for identity matrix } else accelerate_jacobian = false; // don't short cut for identity matrix std::string evalName = fieldName+"_"+pointRule->getName(); if(p.isType<bool>("Use DOF Name")) { if(p.get<bool>("Use DOF Name")) evalName = fieldName; } dof_basis = PHX::MDField<ScalarT,Cell,Point>(fieldName, basis->functional); this->addDependentField(dof_basis); // setup all basis fields that are required Teuchos::RCP<BasisIRLayout> layout = Teuchos::rcp(new BasisIRLayout(basis,*pointRule)); basisValues = Teuchos::rcp(new BasisValues2<ScalarT>(basis->name()+"_"+pointRule->getName()+"_")); basisValues->setupArrays(layout,false); // the field manager will allocate all of these field // swap between scalar basis value, or vector basis value if(basis->isScalarBasis()) { dof_ip_scalar = PHX::MDField<ScalarT,Cell,Point>( evalName, pointRule->dl_scalar); this->addEvaluatedField(dof_ip_scalar); this->addDependentField(basisValues->basis_ref_scalar); this->addDependentField(basisValues->basis_scalar); } else if(basis->isVectorBasis()) { dof_ip_vector = PHX::MDField<ScalarT,Cell,Point,Dim>( evalName, pointRule->dl_vector); this->addEvaluatedField(dof_ip_vector); this->addDependentField(basisValues->basis_ref_vector); this->addDependentField(basisValues->basis_vector); } else { TEUCHOS_ASSERT(false); } std::string n = "DOF_PointValues: " + dof_basis.fieldTag().name() + " Jacobian"; this->setName(n); }