Пример #1
0
void GenericCell<dim, spacedim>::project_flux_BC_to_face(
  const Function<dim, func_out_type> &func,
  const poly_space_basis<BasisType, dim - 1> &the_basis,
  const std::vector<double> &weights,
  mtl::vec::dense_vector<func_out_type> &vec)
{
  if (std::is_same<JacobiPolys<dim - 1>, BasisType>::value)
  {
    std::vector<dealii::Point<dim> > integration_points_loc =
      this->face_quad_fe_vals->get_quadrature_points();
    std::vector<dealii::Point<dim> > normals_at_integration =
      this->face_quad_fe_vals->get_normal_vectors();
    assert(the_basis.n_quads == integration_points_loc.size());
    assert(integration_points_loc.size() == weights.size());
    vec.change_dim(the_basis.n_polys);
    vec = 0;
    for (unsigned i1 = 0; i1 < weights.size(); ++i1)
    {
      const eigen3mat &Nj0 = the_basis.get_func_vals_at_iquad(i1);
      mtl::vec::dense_vector<double> Nj(the_basis.n_polys,
                                        (double *)Nj0.data());
      const func_out_type &value =
        func.value(integration_points_loc[i1], normals_at_integration[i1]);
      vec += weights[i1] * value * Nj;
    }
  }
  else if (std::is_same<LagrangePolys<dim - 1>, BasisType>::value)
  {
    std::vector<dealii::Point<dim> > support_points_loc =
      this->face_supp_fe_vals->get_quadrature_points();
    std::vector<dealii::Point<dim> > normals_at_supports =
      this->face_supp_fe_vals->get_normal_vectors();
    assert(support_points_loc.size() == the_basis.n_polys);
    vec.change_dim(the_basis.n_polys);
    vec = 0;
    unsigned counter = 0;
    for (auto &&support_point : support_points_loc)
    {
      vec[counter] = func.value(support_point, normals_at_supports[counter]);
      counter++;
    }
  }
}
Пример #2
0
void GenericCell<dim, spacedim>::project_func_to_face(
  const TimeFunction<dim, func_out_type> &func,
  const poly_space_basis<BasisType, dim - 1> &the_basis,
  const std::vector<double> &weights,
  mtl::vec::dense_vector<func_out_type> &vec,
  const unsigned &i_face,
  const double &time)
{
  if (std::is_same<JacobiPolys<dim - 1>, BasisType>::value)
  {
    std::vector<dealii::Point<dim> > integration_points_loc =
      this->face_quad_fe_vals->get_quadrature_points();
    std::vector<dealii::Point<dim - 1> > face_quad_points =
      this->face_quad_bundle->get_points();
    assert(the_basis.n_quads == integration_points_loc.size());
    assert(integration_points_loc.size() == weights.size());
    vec.change_dim(the_basis.n_polys);
    vec = 0;
    for (unsigned i1 = 0; i1 < weights.size(); ++i1)
    {
      const std::vector<double> &face_basis_at_iquad =
        this->the_face_basis->value(face_quad_points[i1],
                                    this->half_range_flag[i_face]);
      mtl::vec::dense_vector<double> Nj(the_basis.n_polys,
                                        (double *)face_basis_at_iquad.data());
      const func_out_type &value = func.value(
        integration_points_loc[i1], integration_points_loc[i1], time);
      vec += weights[i1] * value * Nj;
    }
  }
  else if (std::is_same<LagrangePolys<dim - 1>, BasisType>::value)
  {
    std::vector<dealii::Point<dim> > support_points_loc =
      this->face_supp_fe_vals->get_quadrature_points();
    assert(support_points_loc.size() == the_basis.n_polys);
    vec.change_dim(the_basis.n_polys);
    unsigned counter = 0;
    for (auto &&support_point : support_points_loc)
      vec[counter++] = func.value(support_point, support_point, time);
  }
}
Пример #3
0
int GModel::readP3D(const std::string &name)
{
  FILE *fp = Fopen(name.c_str(), "r");
  if(!fp) {
    Msg::Error("Unable to open file '%s'", name.c_str());
    return 0;
  }

  int numBlocks = 0;
  if(fscanf(fp, "%d", &numBlocks) != 1 || numBlocks <= 0) {
    fclose(fp);
    return 0;
  }

  std::vector<int> Ni(numBlocks), Nj(numBlocks), Nk(numBlocks);
  for(int n = 0; n < numBlocks; n++)
    if(fscanf(fp, "%d %d %d", &Ni[n], &Nj[n], &Nk[n]) != 3) {
      fclose(fp);
      return 0;
    }

  for(int n = 0; n < numBlocks; n++) {
    if(Nk[n] == 1) {
      GFace *gf = new discreteFace(this, getMaxElementaryNumber(2) + 1);
      add(gf);
      gf->transfinite_vertices.resize(Ni[n]);
      for(int i = 0; i < Ni[n]; i++) gf->transfinite_vertices[i].resize(Nj[n]);
      for(int coord = 0; coord < 3; coord++) {
        for(int j = 0; j < Nj[n]; j++) {
          for(int i = 0; i < Ni[n]; i++) {
            double d;
            if(fscanf(fp, "%lf", &d) != 1) {
              fclose(fp);
              return 0;
            }
            if(coord == 0) {
              MVertex *v = new MVertex(d, 0., 0., gf);
              gf->transfinite_vertices[i][j] = v;
              gf->mesh_vertices.push_back(v);
            }
            else if(coord == 1) {
              gf->transfinite_vertices[i][j]->y() = d;
            }
            else if(coord == 2) {
              gf->transfinite_vertices[i][j]->z() = d;
            }
          }
        }
      }
      for(std::size_t i = 0; i < gf->transfinite_vertices.size() - 1; i++)
        for(std::size_t j = 0; j < gf->transfinite_vertices[0].size() - 1; j++)
          gf->quadrangles.push_back(new MQuadrangle(
            gf->transfinite_vertices[i][j], gf->transfinite_vertices[i + 1][j],
            gf->transfinite_vertices[i + 1][j + 1],
            gf->transfinite_vertices[i][j + 1]));
    }
    else {
      GRegion *gr = new discreteRegion(this, getMaxElementaryNumber(3) + 1);
      add(gr);
      gr->transfinite_vertices.resize(Ni[n]);
      for(int i = 0; i < Ni[n]; i++) {
        gr->transfinite_vertices[i].resize(Nj[n]);
        for(int j = 0; j < Nj[n]; j++) {
          gr->transfinite_vertices[i][j].resize(Nk[n]);
        }
      }
      for(int coord = 0; coord < 3; coord++) {
        for(int k = 0; k < Nk[n]; k++) {
          for(int j = 0; j < Nj[n]; j++) {
            for(int i = 0; i < Ni[n]; i++) {
              double d;
              if(fscanf(fp, "%lf", &d) != 1) {
                fclose(fp);
                return 0;
              }
              if(coord == 0) {
                MVertex *v = new MVertex(d, 0., 0., gr);
                gr->transfinite_vertices[i][j][k] = v;
                gr->mesh_vertices.push_back(v);
              }
              else if(coord == 1) {
                gr->transfinite_vertices[i][j][k]->y() = d;
              }
              else if(coord == 2) {
                gr->transfinite_vertices[i][j][k]->z() = d;
              }
            }
          }
        }
      }
      for(std::size_t i = 0; i < gr->transfinite_vertices.size() - 1; i++)
        for(std::size_t j = 0; j < gr->transfinite_vertices[0].size() - 1; j++)
          for(std::size_t k = 0; k < gr->transfinite_vertices[0][0].size() - 1;
              k++)
            gr->hexahedra.push_back(
              new MHexahedron(gr->transfinite_vertices[i][j][k],
                              gr->transfinite_vertices[i + 1][j][k],
                              gr->transfinite_vertices[i + 1][j + 1][k],
                              gr->transfinite_vertices[i][j + 1][k],
                              gr->transfinite_vertices[i][j][k + 1],
                              gr->transfinite_vertices[i + 1][j][k + 1],
                              gr->transfinite_vertices[i + 1][j + 1][k + 1],
                              gr->transfinite_vertices[i][j + 1][k + 1]));
    }
  }

  fclose(fp);
  return 1;
}