583 {
589
590 auto rule = [](
int,
int,
int p) ->
int {
return 2 *
p + 1; };
595
596 auto common_data_ptr = boost::make_shared<CommonData>();
600 common_data_ptr->approxVals = boost::make_shared<VectorDouble>();
601 common_data_ptr->divApproxVals = boost::make_shared<MatrixDouble>();
602
609
615 common_data_ptr->approxVals));
616
619
626 common_data_ptr->approxVals));
628 new OpErrorSkel<FIELD_DIM>(common_data_ptr));
629
630 CHKERR VecZeroEntries(common_data_ptr->L2Vec);
631 CHKERR VecZeroEntries(common_data_ptr->resVec);
632
634
635 CHKERR VecAssemblyBegin(common_data_ptr->L2Vec);
636 CHKERR VecAssemblyEnd(common_data_ptr->L2Vec);
637 CHKERR VecAssemblyBegin(common_data_ptr->resVec);
638 CHKERR VecAssemblyEnd(common_data_ptr->resVec);
639 double nrm2;
640 CHKERR VecNorm(common_data_ptr->resVec, NORM_2, &nrm2);
641 const double *array;
642 CHKERR VecGetArrayRead(common_data_ptr->L2Vec, &array);
643 MOFEM_LOG_C(
"WORLD", Sev::inform,
"Error %6.4e Vec norm %6.4e\n",
644 std::sqrt(array[0]), nrm2);
645
646 constexpr double eps = 1e-8;
649 "Not converged solution err = %6.4e", nrm2);
650 if (std::sqrt(array[0]) >
eps)
652 "Error in approximation err = %6.4e", std::sqrt(array[0]));
653
654 CHKERR VecRestoreArrayRead(common_data_ptr->L2Vec, &array);
655
657}
#define MOFEM_LOG_C(channel, severity, format,...)
auto smartCreateDMVector(DM dm)
Get smart vector from DM.
MoFEMErrorCode loopFiniteElements(SmartPetscObj< DM > dm=nullptr)
Iterate finite elements.
boost::ptr_vector< UserDataOperator > & getOpBoundaryRhsPipeline()
Get the Op Boundary Rhs Pipeline object.
auto test_bit_child
lambda function used to select elements on which finite element pipelines are executed.
auto createSmartVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
Add operators pushing bases from local to physical configuration.
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
@ OPROW
operator doWork function is executed on FE rows
Get field gradients at integration pts for scalar filed rank 0, i.e. vector field.
Get value at integration points for scalar field.
MoFEMErrorCode setBoundaryRhsIntegrationRule(RuleHookFun rule)
boost::shared_ptr< FEMethod > & getBoundaryRhsFE()
MoFEMErrorCode getDM(DM *dm)
Get DM.