Example #1
0
// Constructor for writing
VTKIO::VTKIO (const MeshBase& mesh, MeshData* mesh_data) :
  MeshOutput<MeshBase>(mesh),
  _mesh_data(mesh_data),
  _compress(false),
  _local_node_map()
{
  _vtk_grid = NULL;
  libmesh_experimental();
}
Example #2
0
// Constructor for reading
VTKIO::VTKIO (MeshBase & mesh, MeshData * mesh_data) :
  MeshInput<MeshBase> (mesh),
  MeshOutput<MeshBase>(mesh),
  _mesh_data(mesh_data),
  _compress(false),
  _local_node_map()
{
  _vtk_grid = libmesh_nullptr;
  libmesh_experimental();
}
  void RadialBasisInterpolation<KDDim,RBF>::interpolate_field_data (const std::vector<std::string> &field_names,
								    const std::vector<Point>  &tgt_pts,
								    std::vector<Number> &tgt_vals) const
  {
    START_LOG ("interpolate_field_data()", "RadialBasisInterpolation<>");

    libmesh_experimental();

    const unsigned int
      n_vars    = this->n_field_variables(),
      n_src_pts = this->_src_pts.size(),
      n_tgt_pts = tgt_pts.size();

    libmesh_assert_equal_to (_weights.size(),    this->_src_vals.size());
    libmesh_assert_equal_to (field_names.size(), this->n_field_variables());

    // If we already have field variables, we assume we are appending.
    // that means the names and ordering better be identical!
    if (this->_names.size() != field_names.size())
      {
	libMesh::err << "ERROR:  when adding field data to an existing list the\n"
		     << "varaible list must be the same!\n";
	libmesh_error();
      }
    for (unsigned int v=0; v<this->_names.size(); v++)
      if (_names[v] != field_names[v])
	{
	  libMesh::err << "ERROR:  when adding field data to an existing list the\n"
		       << "varaible list must be the same!\n";
	  libmesh_error();
	}


    RBF rbf(_r_bbox);

    tgt_vals.resize (n_tgt_pts*n_vars); /**/ std::fill (tgt_vals.begin(), tgt_vals.end(), Number(0.));

    for (unsigned int tgt=0; tgt<n_tgt_pts; tgt++)
      {
	const Point &p (tgt_pts[tgt]);

	for (unsigned int i=0; i<n_src_pts; i++)
	  {
	    const Point &x_i(_src_pts[i]);
	    const Real
	      r_i   = (p - x_i).size(),
	      phi_i = rbf(r_i);

	    for (unsigned int var=0; var<n_vars; var++)
	      tgt_vals[tgt*n_vars + var] += _weights[i*n_vars + var]*phi_i;
	  }
      }

    STOP_LOG ("interpolate_field_data()", "RadialBasisInterpolation<>");
  }
Example #4
0
RBParametrized::RBParametrized()
  :
  verbose_mode(false),
  parameters_initialized(false)
{
  libmesh_experimental();

  parameters.clear();
  parameters_min.clear();
  parameters_max.clear();
}
Example #5
0
// Constructor for writing
VTKIO::VTKIO (const MeshBase & mesh, MeshData * mesh_data) :
  MeshOutput<MeshBase>(mesh, /*is_parallel_format=*/true)
#ifdef LIBMESH_HAVE_VTK
  ,_vtk_grid(libmesh_nullptr)
  ,_mesh_data(mesh_data)
  ,_compress(false)
#endif
{
  // Ignore unused parameters when !LIBMESH_HAVE_VTK
  libmesh_ignore(mesh_data);
  libmesh_experimental();
}
Example #6
0
//------------------------------------------------------------------
// PointLocator methods
PointLocatorList::PointLocatorList (const MeshBase& mesh,
                                    const PointLocatorBase* master) :
    PointLocatorBase (mesh,master),
    _list            (NULL)
{
    // This code will only work if your mesh is the Voroni mesh of it's
    // own elements' centroids.  If your mesh is that regular you might
    // as well hand-code an O(1) algorithm for locating points within
    // it. - RHS
    libmesh_experimental();

    this->init();
}
void
MeshfreeSolutionTransfer::transfer(const Variable & from_var,
                                   const Variable & to_var)
{
  libmesh_experimental();

  System * from_sys = from_var.system();
  System * to_sys = to_var.system();

  EquationSystems & from_es = from_sys->get_equation_systems();

  MeshBase & from_mesh = from_es.get_mesh();

  InverseDistanceInterpolation<LIBMESH_DIM> idi
    (from_mesh.comm(), 4, 2);

  std::vector<Point>  & src_pts  (idi.get_source_points());
  std::vector<Number> & src_vals (idi.get_source_vals());

  std::vector<std::string> field_vars;
  field_vars.push_back(from_var.name());
  idi.set_field_variables(field_vars);

  // We now will loop over every node in the source mesh
  // and add it to a source point list, along with the solution
  {
    MeshBase::const_node_iterator nd  = from_mesh.local_nodes_begin();
    MeshBase::const_node_iterator end = from_mesh.local_nodes_end();

    for (; nd!=end; ++nd)
      {
        const Node * node = *nd;
        src_pts.push_back(*node);
        src_vals.push_back((*from_sys->solution)(node->dof_number(from_sys->number(),from_var.number(),0)));
      }
  }

  // We have only set local values - prepare for use by gathering remote gata
  idi.prepare_for_use();

  // Create a MeshlessInterpolationFunction that uses our
  // InverseDistanceInterpolation object.  Since each
  // MeshlessInterpolationFunction shares the same
  // InverseDistanceInterpolation object in a threaded environment we
  // must also provide a locking mechanism.
  Threads::spin_mutex mutex;
  MeshlessInterpolationFunction mif(idi, mutex);

  // project the solution
  to_sys->project_solution(&mif);
}
Example #8
0
DGFEMContext::DGFEMContext (const System &sys)
  : FEMContext(sys),
    _neighbor(NULL),
    _neighbor_dof_indices_var(sys.n_vars()),
    _dg_terms_active(false)
{
  libmesh_experimental();

  unsigned int nv = sys.n_vars();
  libmesh_assert (nv);

  _neighbor_subresiduals.reserve(nv);
  _elem_elem_subjacobians.resize(nv);
  _elem_neighbor_subjacobians.resize(nv);
  _neighbor_elem_subjacobians.resize(nv);
  _neighbor_neighbor_subjacobians.resize(nv);

  for (unsigned int i=0; i != nv; ++i)
  {
    _neighbor_subresiduals.push_back(new DenseSubVector<Number>(_neighbor_residual));
    _elem_elem_subjacobians[i].reserve(nv);
    _elem_neighbor_subjacobians[i].reserve(nv);
    _neighbor_elem_subjacobians[i].reserve(nv);
    _neighbor_neighbor_subjacobians[i].reserve(nv);

    for (unsigned int j=0; j != nv; ++j)
    {
      _elem_elem_subjacobians[i].push_back
        (new DenseSubMatrix<Number>(_elem_elem_jacobian));
      _elem_neighbor_subjacobians[i].push_back
        (new DenseSubMatrix<Number>(_elem_neighbor_jacobian));
      _neighbor_elem_subjacobians[i].push_back
        (new DenseSubMatrix<Number>(_neighbor_elem_jacobian));
      _neighbor_neighbor_subjacobians[i].push_back
        (new DenseSubMatrix<Number>(_neighbor_neighbor_jacobian));
    }
  }

  _neighbor_side_fe_var.resize(nv);
  for (unsigned int i=0; i != nv; ++i)
  {
    FEType fe_type = sys.variable_type(i);

    if ( _neighbor_side_fe[fe_type] == NULL )
    {
      _neighbor_side_fe[fe_type] = FEAbstract::build(dim, fe_type).release();
    }
    _neighbor_side_fe_var[i] = _neighbor_side_fe[fe_type];
  }
}
Example #9
0
void
DTKSolutionTransfer::transfer(const Variable & from_var, const Variable & to_var)
{
  libmesh_experimental();

  EquationSystems * from_es = &from_var.system()->get_equation_systems();
  EquationSystems * to_es = &to_var.system()->get_equation_systems();

  // Possibly make an Adapter for from_es
  if(adapters.find(from_es) == adapters.end())
    adapters[from_es] = new DTKAdapter(comm_default, *from_es);

  // Possibly make an Adapter for to_es
  if(adapters.find(to_es) == adapters.end())
    adapters[to_es] = new DTKAdapter(comm_default, *to_es);

  DTKAdapter * from_adapter = adapters[from_es];
  DTKAdapter * to_adapter = adapters[to_es];

  std::pair<EquationSystems *, EquationSystems *> from_to(from_es, to_es);

  // If we haven't created a map for this pair of EquationSystems yet, do it now
  if(dtk_maps.find(from_to) == dtk_maps.end())
  {
    libmesh_assert(from_es->get_mesh().mesh_dimension() == to_es->get_mesh().mesh_dimension());

    shared_domain_map_type * map = new shared_domain_map_type(comm_default, from_es->get_mesh().mesh_dimension(), true);
    dtk_maps[from_to] = map;

    // The tolerance here is for the "contains_point()" implementation in DTK.  Set a larger value for a looser tolerance...
    map->setup(from_adapter->get_mesh_manager(), to_adapter->get_target_coords(), 30*Teuchos::ScalarTraits<double>::eps());
  }

  DTKAdapter::RCP_Evaluator from_evaluator = from_adapter->get_variable_evaluator(from_var.name());
  Teuchos::RCP<DataTransferKit::FieldManager<DTKAdapter::FieldContainerType> > to_values = to_adapter->get_values_to_fill(to_var.name());

  dtk_maps[from_to]->apply(from_evaluator, to_values);

  if(dtk_maps[from_to]->getMissedTargetPoints().size())
    libMesh::out<<"Warning: Some points were missed in the transfer of "<<from_var.name()<<" to "<<to_var.name()<<"!"<<std::endl;

  to_adapter->update_variable_values(to_var.name());
}
Example #10
0
void MeshfreeInterpolation::add_field_data (const std::vector<std::string> &field_names,
                                            const std::vector<Point>  &pts,
                                            const std::vector<Number> &vals)
{
  libmesh_experimental();
  libmesh_assert_equal_to (field_names.size()*pts.size(), vals.size());

  // If we already have field variables, we assume we are appending.
  // that means the names and ordering better be identical!
  if (!_names.empty())
    {
      if (_names.size() != field_names.size())
        {
          libMesh::err << "ERROR:  when adding field data to an existing list the\n"
                       << "varaible list must be the same!\n";
          libmesh_error();
        }
      for (unsigned int v=0; v<_names.size(); v++)
        if (_names[v] != field_names[v])
          {
            libMesh::err << "ERROR:  when adding field data to an existing list the\n"
                         << "varaible list must be the same!\n";
            libmesh_error();
          }
    }

  // otherwise copy the names
  else
    _names = field_names;

  // append the data
  _src_pts.insert (_src_pts.end(),
                   pts.begin(),
                   pts.end());

  _src_vals.insert (_src_vals.end(),
                    vals.begin(),
                    vals.end());

  libmesh_assert_equal_to (_src_vals.size(),
                           _src_pts.size()*this->n_field_variables());
}
Example #11
0
PostscriptIO::PostscriptIO (const MeshBase& mesh_in)
  : MeshOutput<MeshBase> (mesh_in),
    shade_value(0.0),
    line_width(0.5),
    //_M(3,3),
    _offset(0., 0.),
    _scale(1.0),
    _current_point(0., 0.)
{
  // This code is still undergoing some development.
  libmesh_experimental();

  // Entries of transformation matrix from physical to Bezier coords.
  // _M(0,0) = -1./6.;    _M(0,1) = 1./6.;    _M(0,2) = 1.;
  // _M(1,0) = -1./6.;    _M(1,1) = 0.5  ;    _M(1,2) = 1./6.;
  // _M(2,0) = 0.    ;    _M(2,1) = 1.   ;    _M(2,2) = 0.;

  // Make sure there is enough room to store Bezier coefficients.
  _bezier_coeffs.resize(3);
}
std::pair<unsigned int, Real>
EigenSparseLinearSolver<T>::adjoint_solve (SparseMatrix<T> &matrix_in,
                                           NumericVector<T> &solution_in,
                                           NumericVector<T> &rhs_in,
                                           const double tol,
                                           const unsigned int m_its)
{

  START_LOG("adjoint_solve()", "EigenSparseLinearSolver");

  libmesh_experimental();
  EigenSparseMatrix<T> mat_trans(this->comm());
  matrix_in.get_transpose(mat_trans);

  std::pair<unsigned int, Real> retval = this->solve (mat_trans,
                                                      solution_in,
                                                      rhs_in,
                                                      tol,
                                                      m_its);

  STOP_LOG("adjoint_solve()", "EigenSparseLinearSolver");

  return retval;
}
Example #13
0
void InverseDistanceInterpolation<KDDim>::interpolate_field_data (const std::vector<std::string> &field_names,
                                                                  const std::vector<Point>  &tgt_pts,
                                                                  std::vector<Number> &tgt_vals) const
{
  libmesh_experimental();

  // forcibly initialize, if needed
#ifdef LIBMESH_HAVE_NANOFLANN
  if (_kd_tree.get() == NULL)
    const_cast<InverseDistanceInterpolation<KDDim>*>(this)->construct_kd_tree();
#endif

  START_LOG ("interpolate_field_data()", "InverseDistanceInterpolation<>");

  libmesh_assert_equal_to (field_names.size(), this->n_field_variables());

  // If we already have field variables, we assume we are appending.
  // that means the names and ordering better be identical!
  if (_names.size() != field_names.size())
    {
      libMesh::err << "ERROR:  when adding field data to an existing list the\n"
                   << "varaible list must be the same!\n";
      libmesh_error();
    }
  for (unsigned int v=0; v<_names.size(); v++)
    if (_names[v] != field_names[v])
      {
        libMesh::err << "ERROR:  when adding field data to an existing list the\n"
                     << "varaible list must be the same!\n";
        libmesh_error();
      }

  tgt_vals.resize (tgt_pts.size()*this->n_field_variables());

#ifdef LIBMESH_HAVE_NANOFLANN
  {
    std::vector<Number>::iterator out_it = tgt_vals.begin();

    const size_t num_results = std::min((size_t) _n_interp_pts, _src_pts.size());

    std::vector<size_t> ret_index(num_results);
    std::vector<Real>   ret_dist_sqr(num_results);

    for (std::vector<Point>::const_iterator tgt_it=tgt_pts.begin();
         tgt_it != tgt_pts.end(); ++tgt_it)
      {
        const Point &tgt(*tgt_it);
        const Real query_pt[] = { tgt(0), tgt(1), tgt(2) };

        _kd_tree->knnSearch(&query_pt[0], num_results, &ret_index[0], &ret_dist_sqr[0]);

        this->interpolate (tgt, ret_index, ret_dist_sqr, out_it);

        // libMesh::out << "knnSearch(): num_results=" << num_results << "\n";
        // for (size_t i=0;i<num_results;i++)
        //   libMesh::out << "idx[" << i << "]="
        //       << std::setw(6) << ret_index[i]
        //       << "\t dist["<< i << "]=" << ret_dist_sqr[i]
        //       << "\t val[" << std::setw(6) << ret_index[i] << "]=" << _src_vals[ret_index[i]]
        //       << std::endl;
        // libMesh::out << "\n";

        // libMesh::out << "ival=" << _vals[0] << '\n';
      }
  }
#else

  libMesh::err << "ERROR:  This functionality requires the library to be configured\n"
               << "with nanoflann KD-Tree approximate nearest neighbor support!\n"
               << std::endl;
  libmesh_error();

#endif

  STOP_LOG ("interpolate_field_data()", "InverseDistanceInterpolation<>");
}