578 {
584
585 auto rule = [](
int,
int,
int p) ->
int {
return 2 *
p + 1; };
590
591 auto common_data_ptr = boost::make_shared<CommonData>();
595 common_data_ptr->approxVals = boost::make_shared<VectorDouble>();
596 common_data_ptr->divApproxVals = boost::make_shared<MatrixDouble>();
597
604
610 common_data_ptr->approxVals));
611
614
621 common_data_ptr->approxVals));
623 new OpErrorSkel<FIELD_DIM>(common_data_ptr));
624
625 CHKERR VecZeroEntries(common_data_ptr->L2Vec);
626 CHKERR VecZeroEntries(common_data_ptr->resVec);
627
629
630 CHKERR VecAssemblyBegin(common_data_ptr->L2Vec);
631 CHKERR VecAssemblyEnd(common_data_ptr->L2Vec);
632 CHKERR VecAssemblyBegin(common_data_ptr->resVec);
633 CHKERR VecAssemblyEnd(common_data_ptr->resVec);
634 double nrm2;
635 CHKERR VecNorm(common_data_ptr->resVec, NORM_2, &nrm2);
636 const double *array;
637 CHKERR VecGetArrayRead(common_data_ptr->L2Vec, &array);
638 MOFEM_LOG_C(
"WORLD", Sev::inform,
"Error %6.4e Vec norm %6.4e\n",
639 std::sqrt(array[0]), nrm2);
640
641 constexpr double eps = 1e-8;
644 "Not converged solution err = %6.4e", nrm2);
645 if (std::sqrt(array[0]) >
eps)
647 "Error in approximation err = %6.4e", std::sqrt(array[0]));
648
649 CHKERR VecRestoreArrayRead(common_data_ptr->L2Vec, &array);
650
652}
#define MOFEM_LOG_C(channel, severity, format,...)
auto createDMVector(DM dm)
Get smart vector from DM.
MoFEMErrorCode loopFiniteElements(SmartPetscObj< DM > dm=nullptr)
Iterate finite elements.
boost::ptr_deque< 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 createVectorMPI(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.