v0.14.0
Loading...
Searching...
No Matches
field_evaluator.cpp

test segments distance

test segments distance

/** \file field_evaluator.cpp
* \example field_evaluator.cpp
* \brief test segments distance
*
* \ingroup field_evaluator
*/
#include <MoFEM.hpp>
using namespace MoFEM;
static char help[] = "testing field evaluator\n\n";
/**
* @brief Operator used to check consistency between local coordinates
* and global cooridnates for integrated points and evaluated points
*
*/
template <typename OP> struct MyOp : public OP {
MyOp(std::array<double, 12> &eval_points)
: OP("FIELD1", OP::OPROW),
getMatrixAdaptor(eval_points.data(), eval_points.size() / 3, 3)) {}
if (type == MBVERTEX) {
MOFEM_LOG("SELF", Sev::inform) << "FE " << OP::getFEEntityHandle();
MOFEM_LOG("SELF", Sev::inform) << "Integration pts" << std::endl;
MOFEM_LOG("SELF", Sev::inform) << OP::getGaussPts() << endl;
MOFEM_LOG("SELF", Sev::inform) << "Global coordinates " << endl;
MOFEM_LOG("SELF", Sev::inform) << OP::getCoordsAtGaussPts() << std::endl;
for (int gg = 0; gg != OP::getCoordsAtGaussPts().size1(); ++gg) {
int pt_number = OP::getGaussPts()(OP::getGaussPts().size1() - 1, gg);
MOFEM_LOG("SELF", Sev::inform) << "gg " << gg << std::endl;
MOFEM_LOG("SELF", Sev::inform) << "pt " << pt_number << std::endl;
ublas::matrix_row<MatrixDouble> coord_at_gauss_pt(
OP::getCoordsAtGaussPts(), gg);
ublas::matrix_row<MatrixShallowArrayAdaptor<double>> eval_coord(
evalPoints, pt_number);
MOFEM_LOG("SELF", Sev::inform) << "coord_at_gauss_pt ";
MOFEM_LOG("SELF", Sev::inform) << coord_at_gauss_pt << std::endl;
MOFEM_LOG("SELF", Sev::inform) << "eval_coord ";
MOFEM_LOG("SELF", Sev::inform) << eval_coord << std::endl;
double error = norm_2(coord_at_gauss_pt - eval_coord);
if (error > 1e-12)
SETERRQ2(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
"Difference at %d error = %3.4e", pt_number, error);
}
}
}
};
// Lambda function is used to set integration rule to -1, that indicates
// that finite element instace will use non-standard integration points.
auto get_rule = [](int order_row, int order_col, int order_data) {
return -1;
};
int main(int argc, char *argv[]) {
MoFEM::Core::Initialize(&argc, &argv, (char *)0, help);
try {
// Read mesh and create moab and mofem data structures
moab::Core mb_instance;
moab::Interface &moab = mb_instance;
MoFEM::Core core(moab, PETSC_COMM_WORLD);
MoFEM::Interface &m_field = core;
// Register DM Manager
DMType dm_name = "DMMOFEM";
// Simple interface
Simple *simple_interface;
CHKERR m_field.getInterface(simple_interface);
{
// get options from command line
CHKERR simple_interface->getOptions();
// load mesh file
CHKERR simple_interface->loadFile();
// add fields
CHKERR simple_interface->addDomainField("FIELD1", H1,
// set fields order
CHKERR simple_interface->setFieldOrder("FIELD1", 1);
// setup problem
CHKERR simple_interface->setUp();
FieldEvaluatorInterface *field_eval_ptr;
CHKERR m_field.getInterface(field_eval_ptr);
auto dm = simple_interface->getDM();
const MoFEM::Problem *prb_ptr;
if (simple_interface->getDim() == 3) {
std::array<double, 3> point = {0, 0, 0};
const double dist = 0.1;
std::array<double, 12> eval_points = {0.0, 0.0, 0.0, 0.0, 0.01, 0.0,
-0.1, 0.0, 0.0, 0.1, 0.0, 0.0};
using VolEle = VolumeElementForcesAndSourcesCore;
// Get pointer of FieldEvaluator data. Note finite element and method
// set integrating points is destroyed when this pointer is releases
auto data = field_eval_ptr->getData<VolEle>();
// Set operators and integration rule
if (auto fe_method = data->feMethodPtr.lock()) {
fe_method->getRuleHook = get_rule;
fe_method->getOpPtrVector().push_back(new MyOp<VolOp>(eval_points));
} else
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"Pointer to element does not exists");
// Build tree for particular element
CHKERR field_eval_ptr->buildTree3D(data,
simple_interface->getDomainFEName());
// Set points to set on finite elements
data->setEvalPoints(eval_points.data(), eval_points.size() / 3);
// Evaluate points on finite elements
CHKERR field_eval_ptr->evalFEAtThePoint3D(
&point[0], dist, prb_ptr->getName(),
simple_interface->getDomainFEName(), data, m_field.get_comm_rank(),
m_field.get_comm_rank(), nullptr, MF_EXIST, VERY_NOISY);
}
if (simple_interface->getDim() == 2) {
std::array<double, 3> point = {0, 0, 0};
const double dist = 0.1;
std::array<double, 12> eval_points = {
0.0, 0.0, 0.0,
0.0, 0.01, 0.0,
-0.1, 0.0, 0.0,
0.1, 0.0, 0.0};
// Get pointer of FieldEvaluator data. Note finite element and method
// set integrating points is destroyed when this pointer is releases
auto data = field_eval_ptr->getData<FaceEle>();
// Set operators and integration rule
if (auto fe_method = data->feMethodPtr.lock()) {
fe_method->getRuleHook = get_rule;
fe_method->getOpPtrVector().push_back(new MyOp<FaceOp>(eval_points));
} else
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"Pointer to element does not exists");
// Build tree for particular element
CHKERR field_eval_ptr->buildTree2D(data,
simple_interface->getDomainFEName());
// Set points to set on finite elements
data->setEvalPoints(eval_points.data(), eval_points.size() / 3);
// Evaluate points on finite elements
CHKERR field_eval_ptr->evalFEAtThePoint2D(
&point[0], dist, prb_ptr->getName(),
simple_interface->getDomainFEName(), data, m_field.get_comm_rank(),
m_field.get_comm_rank(), nullptr, MF_EXIST, VERY_NOISY);
}
}
}
return 0;
}
static char help[]
int main()
@ VERY_NOISY
#define CATCH_ERRORS
Catch errors.
@ MF_EXIST
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
Definition definitions.h:60
@ H1
continuous field
Definition definitions.h:85
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_ATOM_TEST_INVALID
Definition definitions.h:40
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
auto get_rule
PetscErrorCode DMMoFEMGetProblemPtr(DM dm, const MoFEM::Problem **problem_ptr)
Get pointer to problem data structure.
Definition DMMoFEM.cpp:412
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
Definition DMMoFEM.cpp:47
#define MOFEM_LOG(channel, severity)
Log.
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
ublas::matrix< double, ublas::row_major, ublas::shallow_array_adaptor< double > > MatrixShallowArrayAdaptor
Definition Types.hpp:119
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
auto getMatrixAdaptor(T1 ptr, const size_t n, const size_t m)
Get Matrix adaptor.
Definition Templates.hpp:57
virtual int get_comm_rank() const =0
Core (interface) class.
Definition Core.hpp:82
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition Core.cpp:72
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition Core.cpp:112
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
Field evaluator interface.
MoFEMErrorCode buildTree3D(boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
Build spatial tree.
MoFEMErrorCode buildTree2D(boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
Build spatial tree.
MoFEMErrorCode evalFEAtThePoint2D(const double *const point, const double distance, const std::string problem, const std::string finite_element, boost::shared_ptr< SetPtsData > data_ptr, int lower_rank, int upper_rank, boost::shared_ptr< CacheTuple > cache_ptr, MoFEMTypes bh=MF_EXIST, VERBOSITY_LEVELS verb=QUIET)
Evaluate field at artbitray position.
boost::shared_ptr< SPD > getData(const double *ptr=nullptr, const int nb_eval_points=0, const double eps=1e-12, VERBOSITY_LEVELS verb=QUIET)
Get the Data object.
MoFEMErrorCode evalFEAtThePoint3D(const double *const point, const double distance, const std::string problem, const std::string finite_element, boost::shared_ptr< SetPtsData > data_ptr, int lower_rank, int upper_rank, boost::shared_ptr< CacheTuple > cache_ptr, MoFEMTypes bh=MF_EXIST, VERBOSITY_LEVELS verb=QUIET)
Evaluate field at artbitray position.
RuleHookFun getRuleHook
Hook to get rule.
keeps basic data about problem
Simple interface for fast problem set-up.
Definition Simple.hpp:27
int getDim() const
Get the problem dimension.
Definition Simple.hpp:285
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name, LoadFileFunc loadFunc=defaultLoadFileFunc)
Load mesh file.
Definition Simple.cpp:194
MoFEMErrorCode addDomainField(const std::string &name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on domain.
Definition Simple.cpp:264
MoFEMErrorCode getOptions()
get options
Definition Simple.cpp:180
MoFEMErrorCode getDM(DM *dm)
Get DM.
Definition Simple.cpp:667
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
Definition Simple.cpp:473
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
Definition Simple.cpp:611
const std::string getDomainFEName() const
Get the Domain FE Name.
Definition Simple.hpp:341
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.
Operator used to check consistency between local coordinates and global cooridnates for integrated po...
MatrixShallowArrayAdaptor< double > evalPoints
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
MyOp(std::array< double, 12 > &eval_points)