示例#1
0
void
DisplacedProblem::reinitElemPhys(const Elem * elem, std::vector<Point> phys_points_in_elem, THREAD_ID tid)
{
    std::vector<Point> points(phys_points_in_elem.size());
    std::copy(phys_points_in_elem.begin(), phys_points_in_elem.end(), points.begin());

    _assembly[tid]->reinitAtPhysical(elem, points);

    _displaced_nl.prepare(tid);
    _displaced_aux.prepare(tid);
    _assembly[tid]->prepare();

    reinitElem(elem, tid);
}
示例#2
0
bool
DisplacedProblem::reinitDirac(const Elem * elem, THREAD_ID tid)
{
  std::vector<Point> & points = _dirac_kernel_info.getPoints()[elem];

  bool have_points = points.size();

  if (have_points)
  {
    _assembly[tid]->reinitAtPhysical(elem, points);

    _displaced_nl.prepare(tid);
    _displaced_aux.prepare(tid);
    _assembly[tid]->prepare();

    reinitElem(elem, tid);
  }

  return have_points;
}
示例#3
0
bool
DisplacedProblem::reinitDirac(const Elem * elem, THREAD_ID tid)
{
  std::vector<Point> & points = _dirac_kernel_info.getPoints()[elem];

  unsigned int n_points = points.size();

  if (n_points)
  {
    unsigned int max_qps = _mproblem.getMaxQps();

    if (n_points > max_qps)
    {
      /**
       * The maximum number of qps can rise if several Dirac points are added to a single element.
       * In that case we need to resize the zeros to compensate.
       */
      for (unsigned int tid = 0; tid < libMesh::n_threads(); ++tid)
      {
        _zero[tid].resize(max_qps, 0);
        _grad_zero[tid].resize(max_qps, 0);
        _second_zero[tid].resize(max_qps, RealTensor(0.));
        _second_phi_zero[tid].resize(max_qps, std::vector<RealTensor>(_mproblem.getMaxShapeFunctions(), RealTensor(0.)));
      }
    }

    _assembly[tid]->reinitAtPhysical(elem, points);

    _displaced_nl.prepare(tid);
    _displaced_aux.prepare(tid);

    reinitElem(elem, tid);
  }

  _assembly[tid]->prepare();

  return n_points > 0;
}
示例#4
0
bool
DisplacedProblem::reinitDirac(const Elem * elem, THREAD_ID tid)
{
    std::set<Point> & points_set = _dirac_kernel_info._points[elem];

    bool have_points = points_set.size();

    if (have_points)
    {
        std::vector<Point> points(points_set.size());
        std::copy(points_set.begin(), points_set.end(), points.begin());

        _assembly[tid]->reinitAtPhysical(elem, points);

        _displaced_nl.prepare(tid);
        _displaced_aux.prepare(tid);
        _assembly[tid]->prepare();

        reinitElem(elem, tid);
    }

    return have_points;
}