11static char help[] =
"...\n\n";
30constexpr double a = 1;
31constexpr double a2 =
a *
a;
32[[maybe_unused]]
constexpr double a4 =
a2 *
a2;
34constexpr double A = 6371220;
40auto res_J = [](
const double x,
const double y,
const double z) {
41 const double res = (x * x + y * y + z * z -
a2);
45auto res_J_dx = [](
const double x,
const double y,
const double z) {
46 const double res =
res_J(x, y, z);
51auto lhs_J_dx2 = [](
const double x,
const double y,
const double z) {
52 const double res =
res_J(x, y, z);
55 (res * 2 + (4 * x * x)),
60 (2 * res + (4 * y * y)),
65 (2 * res + (4 * z * z))};
71 boost::shared_ptr<MatrixDouble> dot_x_ptr)
78 auto t_w = getFTensor0IntegrationWeight();
81 auto t_x0 = getFTensor1CoordsAtGaussPts();
82 auto t_x = getFTensor1FromMat<3>(*
xPtr);
83 auto t_dot_x = getFTensor1FromMat<3>(*
xDotPtr);
84 auto t_normal = getFTensor1NormalsAtGaussPts();
86 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
92 t_P(
i,
j) = t_n(
i) * t_n(
j);
95 auto t_J_res =
res_J_dx(t_x(0), t_x(1), t_x(2));
97 const double alpha = t_w;
98 auto t_nf = getFTensor1FromArray<3, 3>(locF);
99 double l = std::sqrt(t_normal(
i) * t_normal(
i));
103 alpha *
l * ((t_P(
i,
k) * t_J_res(
k) + t_Q(
i,
k) * t_dot_x(
k)));
106 for (; rr != nbRows / 3; ++rr) {
108 t_nf(
j) += t_row_base * t_res(
j);
113 for (; rr < nbRowBaseFunctions; ++rr) {
128 boost::shared_ptr<MatrixDouble>
xPtr;
135 boost::shared_ptr<MatrixDouble> dot_x_ptr)
146 auto t_w = getFTensor0IntegrationWeight();
149 auto t_x0 = getFTensor1CoordsAtGaussPts();
150 auto t_x = getFTensor1FromMat<3>(*
xPtr);
151 auto t_normal = getFTensor1NormalsAtGaussPts();
153 auto get_t_mat = [&](
const int rr) {
155 &locMat(rr + 0, 0), &locMat(rr + 0, 1), &locMat(rr + 0, 2),
157 &locMat(rr + 1, 0), &locMat(rr + 1, 1), &locMat(rr + 1, 2),
159 &locMat(rr + 2, 0), &locMat(rr + 2, 1), &locMat(rr + 2, 2)};
162 const double ts_a = getTSa();
164 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
170 t_P(
i,
j) = t_n(
i) * t_n(
j);
173 auto t_J_lhs =
lhs_J_dx2(t_x(0), t_x(1), t_x(2));
174 double l = std::sqrt(t_normal(
i) * t_normal(
i));
176 const double alpha = t_w;
179 (alpha *
l) * (t_P(
i,
k) * t_J_lhs(
k,
j) + t_Q(
i,
j) * ts_a);
182 for (; rr != nbRows / 3; rr++) {
185 auto t_mat = get_t_mat(3 * rr);
187 for (
int cc = 0; cc != nbCols / 3; cc++) {
189 const double rc = t_row_base * t_col_base;
190 t_mat(
i,
j) += rc * t_lhs(
i,
j);
198 for (; rr < nbRowBaseFunctions; ++rr)
211 boost::shared_ptr<MatrixDouble>
xPtr;
221 std::fill(&doEntities[MBEDGE], &doEntities[MBMAXTYPE],
false);
228 auto t_w = getFTensor0IntegrationWeight();
229 auto t_x = getFTensor1FromMat<3>(*
xPtr);
230 auto t_normal = getFTensor1NormalsAtGaussPts();
231 auto nb_integration_pts = getGaussPts().size2();
235 for (
int gg = 0; gg != nb_integration_pts; gg++) {
237 double l = std::sqrt(t_normal(
i) * t_normal(
i));
238 error += t_w *
l * std::abs((t_x(
i) * t_x(
i) -
A *
A));
253 boost::shared_ptr<MatrixDouble>
xPtr;
331 auto x_ptr = boost::make_shared<MatrixDouble>();
332 auto dot_x_ptr = boost::make_shared<MatrixDouble>();
333 auto det_ptr = boost::make_shared<VectorDouble>();
334 auto jac_ptr = boost::make_shared<MatrixDouble>();
335 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
337 auto def_ops = [&](
auto &pipeline) {
348 new OpRhs(
"HO_POSITIONS", x_ptr, dot_x_ptr));
350 new OpLhs(
"HO_POSITIONS", x_ptr, dot_x_ptr));
367 auto dm =
simple->getDM();
369 ts = pipeline_mng->createTSIM();
372 CHKERR TSSetMaxSteps(ts, 1);
373 CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP);
378 CHKERR TSSetSolution(ts, T);
379 CHKERR TSSetFromOptions(ts);
382 CHKERR TSGetTime(ts, &ftime);
393 auto x_ptr = boost::make_shared<MatrixDouble>();
394 auto det_ptr = boost::make_shared<VectorDouble>();
395 auto jac_ptr = boost::make_shared<MatrixDouble>();
396 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
402 boost::make_shared<PostProcBrokenMeshInMoab<DomainEle>>(
mField);
404 post_proc_fe->getOpPtrVector().push_back(
409 post_proc_fe->getOpPtrVector().push_back(
411 new OpPPMap(post_proc_fe->getPostProcMesh(),
412 post_proc_fe->getMapGaussPts(),
416 {{
"HO_POSITIONS", x_ptr}},
425 CHKERR post_proc_fe->writeFile(
"out_approx.h5m");
427 auto error_fe = boost::make_shared<DomainEle>(
mField);
429 error_fe->getOpPtrVector().push_back(
431 error_fe->getOpPtrVector().push_back(
433 error_fe->getOpPtrVector().push_back(
new OpError(
"HO_POSITIONS", x_ptr));
435 error_fe->preProcessHook = [&]() {
437 MOFEM_LOG(
"EXAMPLE", Sev::inform) <<
"Create vec ";
444 error_fe->postProcessHook = [&]() {
451 <<
"Error " << std::sqrt(error2 / (4 * M_PI *
A *
A));
462 "PARALLEL=WRITE_PART");
469int main(
int argc,
char *argv[]) {
472 const char param_file[] =
"param_file.petsc";
475 auto core_log = logging::core::get();
484 DMType dm_name =
"DMMOFEM";
489 moab::Core mb_instance;
490 moab::Interface &moab = mb_instance;
void simple(double P1[], double P2[], double P3[], double c[], const int N)
FTensor::Index< 'j', 3 > j
FTensor::Index< 'i', 3 > i
FTensor::Index< 'k', 3 > k
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
Tensor1< T, Tensor_Dim > normalize()
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode, RowColData rc=RowColData::COL)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
auto createDMVector(DM dm, RowColData rc=RowColData::COL)
Get smart vector from DM.
boost::ptr_deque< UserDataOperator > & getOpDomainLhsPipeline()
Get the Op Domain Lhs Pipeline object.
boost::ptr_deque< UserDataOperator > & getOpDomainRhsPipeline()
Get the Op Domain Rhs Pipeline object.
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
virtual MoFEMErrorCode loop_dofs(const Problem *problem_ptr, const std::string &field_name, RowColData rc, DofMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)=0
Make a loop over dofs.
FTensor::Index< 'l', 3 > l
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
constexpr auto field_name
static constexpr int approx_order
MoFEMErrorCode readMesh()
[Read mesh]
MoFEMErrorCode solveSystem()
[Push operators to pipeline]
MoFEM::Interface & mField
MoFEMErrorCode setupProblem()
[Read mesh]
ApproxSphere(MoFEM::Interface &m_field)
MoFEMErrorCode runProblem()
[Run programme]
MoFEMErrorCode setOPs()
[Set up problem]
MoFEMErrorCode getOptions()
[Run programme]
MoFEMErrorCode outputResults()
[Solve]
virtual int get_comm_size() const =0
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmWorld()
Get the strm world object.
Approximate field values for given petsc vector.
Specialization for MatrixDouble vector field values calculation.
Calculate normal vectors at Gauss points of face elements.
Post post-proc data at points from hash maps.
PipelineManager interface.
MoFEMErrorCode setDomainRhsIntegrationRule(RuleHookFun rule)
Set integration rule for domain right-hand side finite element.
MoFEMErrorCode setDomainLhsIntegrationRule(RuleHookFun rule)
Set integration rule for domain left-hand side finite element.
Projection of edge entities with one mid-node on hierarchical basis.
Simple interface for fast problem set-up.
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.
MoFEMErrorCode getOptions()
get options
MoFEMErrorCode getDM(DM *dm)
Get DM.
intrusive_ptr for managing petsc objects
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
OpError(const std::string field_name, boost::shared_ptr< MatrixDouble > x_ptr)
static SmartPetscObj< Vec > errorVec
boost::shared_ptr< MatrixDouble > xPtr
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
boost::shared_ptr< MatrixDouble > xPtr
boost::shared_ptr< MatrixDouble > xDotPtr
OpLhs(const std::string field_name, boost::shared_ptr< MatrixDouble > x_ptr, boost::shared_ptr< MatrixDouble > dot_x_ptr)
boost::shared_ptr< MatrixDouble > xPtr
boost::shared_ptr< MatrixDouble > xDotPtr
OpRhs(const std::string field_name, boost::shared_ptr< MatrixDouble > x_ptr, boost::shared_ptr< MatrixDouble > dot_x_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data)