tmp
<
BlockLduSystem<vector, typename outerProduct<vector, Type>::type>
>
gradScheme<Type>::fvmGrad
(
    const GeometricField<Type, fvPatchField, volMesh>& vf
) const
{
    FatalErrorIn
    (
        "tmp<BlockLduSystem> gradScheme<Type>::fvmGrad\n"
        "(\n"
        "    GeometricField<Type, fvPatchField, volMesh>&"
        ")\n"
    )   << "Implicit gradient operator currently defined only for Gauss linear "
        << "and leastSquares (cell and face limiters are optional)."
        << abort(FatalError);

    typedef typename outerProduct<vector, Type>::type GradType;

    tmp<BlockLduSystem<vector, GradType> > tbs
    (
        new BlockLduSystem<vector, GradType>(vf.mesh())
    );

    return tbs;
}
Esempio n. 2
0
void TrimmedSurfaceConverter::_convert(
    TrimmedNurbsSurfaceObject::surface_type const& nurbspatch) {
  tml::converter2d conv2d;
  tml::converter3d conv3d;

  // first convert trimmed nurbs surface into bezierpatches
  std::vector<tml::beziersurface_from_nurbs<tml::point3d> > bezierpatches;
  conv3d.convert(nurbspatch, std::back_inserter(bezierpatches));

  // then convert all trimming nurbs curves into bezier curves
  std::vector<TrimDomain::contour_type> loops;

  for (TrimmedNurbsSurface::const_trimloop_iterator l =
           nurbspatch.trimloops().begin();
       l != nurbspatch.trimloops().end();
       ++l) {
    // first split nurbs loop into bezier loop
    TrimmedBezierSurface::curve_container loop;
    for (auto c = l->begin(); c != l->end(); ++c) {
      conv2d.convert(*c, std::back_inserter(loop));
    }

    // convert to pointer
    std::vector<TrimDomain::curve_ptr> loop_as_ptr;
    for (auto c = loop.begin(); c != loop.end(); ++c) {
      loop_as_ptr.push_back(
          TrimDomain::curve_ptr(new TrimDomain::curve_type(*c)));
    }

    loops.push_back(
        TrimDomain::contour_type(loop_as_ptr.begin(), loop_as_ptr.end()));
  }

  TrimmedBezierSurface::trimdomain_ptr domain(new TrimDomain);

  // add curves, set trimtype and which part of the nurbs patch the patch is
  std::for_each(
      loops.begin(), loops.end(), boost::bind(&TrimDomain::add, domain, _1));
  domain->type(nurbspatch.trimtype());
  domain->nurbsdomain(TrimDomain::bbox_type(
      TrimDomain::point_type(nurbspatch.umin(), nurbspatch.vmin()),
      TrimDomain::point_type(nurbspatch.umax(), nurbspatch.vmax())));

  // generate trimmed bezier patches from subpatches and trimming curves
  for (std::vector<tml::beziersurface_from_nurbs<tml::point3d> >::const_iterator
           b = bezierpatches.begin();
       b != bezierpatches.end();
       ++b) {
    boost::shared_ptr<TrimmedBezierSurface> tbs(
        new TrimmedBezierSurface(b->surface));

    tbs->domain(domain);

    tbs->bezierdomain(
        TrimDomain::bbox_type(TrimDomain::point_type(b->umin, b->vmin),
                              TrimDomain::point_type(b->umax, b->vmax)));

    // lock for write access into TrimmedBezierSurfaceObject
    boost::mutex::scoped_lock lock(_impl->target_access);
    _impl->target->add(tbs);
  }
}