Ejemplo n.º 1
0
// 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);
}
Ejemplo n.º 2
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);
}