v0.13.0
Public Types | Public Member Functions | Public Attributes | Private Attributes | List of all members
StdRDOperators::OpError Struct Reference

#include <users_modules/softmech/chemo_mech/src/rd_stdOperators.hpp>

Inheritance diagram for StdRDOperators::OpError:
[legend]
Collaboration diagram for StdRDOperators::OpError:
[legend]

Public Types

typedef boost::function< double(const double, const double, const double)> FVal
 
typedef boost::function< FTensor::Tensor1< double, 3 > const double, const double, const double)> FGrad
 

Public Member Functions

 OpError (FVal exact_value, FVal exact_lap, FGrad exact_grad, boost::shared_ptr< PreviousData > &prev_data, std::map< int, BlockData > &block_map, double &err)
 
MoFEMErrorCode doWork (int side, EntityType type, EntData &data)
 

Public Attributes

double & eRror
 

Private Attributes

FVal exactVal
 
FVal exactLap
 
FGrad exactGrad
 
boost::shared_ptr< PreviousDataprevData
 
std::map< int, BlockDatasetOfBlock
 
FTensor::Number< 0 > NX
 
FTensor::Number< 1 > NY
 

Detailed Description

Definition at line 551 of file rd_stdOperators.hpp.

Member Typedef Documentation

◆ FGrad

typedef boost::function<FTensor::Tensor1<double, 3> const double, const double, const double)> StdRDOperators::OpError::FGrad

Definition at line 556 of file rd_stdOperators.hpp.

◆ FVal

typedef boost::function<double(const double, const double, const double)> StdRDOperators::OpError::FVal

Definition at line 553 of file rd_stdOperators.hpp.

Constructor & Destructor Documentation

◆ OpError()

StdRDOperators::OpError::OpError ( FVal  exact_value,
FVal  exact_lap,
FGrad  exact_grad,
boost::shared_ptr< PreviousData > &  prev_data,
std::map< int, BlockData > &  block_map,
double &  err 
)

Definition at line 558 of file rd_stdOperators.hpp.

561  : OpEle("ERROR", OpEle::OPROW), exactVal(exact_value),
562  exactLap(exact_lap), exactGrad(exact_grad), prevData(prev_data),
563  setOfBlock(block_map), eRror(err) {}
FaceElementForcesAndSourcesCore::UserDataOperator OpEle
boost::shared_ptr< PreviousData > prevData
std::map< int, BlockData > setOfBlock

Member Function Documentation

◆ doWork()

MoFEMErrorCode StdRDOperators::OpError::doWork ( int  side,
EntityType  type,
EntData data 
)

Definition at line 564 of file rd_stdOperators.hpp.

564  {
566  const int nb_dofs = data.getFieldData().size();
567  // cout << "nb_error_dofs : " << nb_dofs << endl;
568  if (nb_dofs) {
569 
570  auto find_block_data = [&]() {
571  EntityHandle fe_ent = getFEEntityHandle();
572  BlockData *block_raw_ptr = nullptr;
573  for (auto &m : setOfBlock) {
574  if (m.second.block_ents.find(fe_ent) != m.second.block_ents.end()) {
575  block_raw_ptr = &m.second;
576  break;
577  }
578  }
579  return block_raw_ptr;
580  };
581 
582  auto block_data_ptr = find_block_data();
583  if (!block_data_ptr)
584  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "Block not found");
585 
586  auto &block_data = *block_data_ptr;
587 
588  auto t_value = getFTensor0FromVec(prevData->values);
589  auto t_grad = getFTensor1FromMat<2>(prevData->grads);
590  // cout << "t_grad : " << t_grad << endl;
591  // auto t_grad = getFTensor1FromMat<3>(prevData->grads);
592  data.getFieldData().clear();
593  const double vol = getMeasure();
594  const int nb_integration_pts = getGaussPts().size2();
595  auto t_w = getFTensor0IntegrationWeight();
596  double dt;
597  CHKERR TSGetTimeStep(getFEMethod()->ts, &dt);
598  double ct = getFEMethod()->ts_t - dt;
599  auto t_coords = getFTensor1CoordsAtGaussPts();
600 
602  // cout << "B0 : " << block_data.B0 << endl;
603 
604  for (int gg = 0; gg != nb_integration_pts; ++gg) {
605  const double a = vol * t_w;
606 
607  double mass_exact = exactVal(t_coords(NX), t_coords(NY), ct);
608  double flux_lap =
609  -block_data.B0 * exactLap(t_coords(NX), t_coords(NY), ct);
610  auto flux_exact = exactGrad(t_coords(NX), t_coords(NY), ct);
611 
612  // cout << "grad_exact : " << flux_exact << endl;
613  // cout << "grad_value : " << t_grad << endl;
614  // cout << "--------------------" << endl;
615 
616  double flux_error =
617  pow(block_data.B0, 2) * (pow(flux_exact(0) - t_grad(0), 2) +
618  pow(flux_exact(1) - t_grad(1), 2));
619 
620  double local_error = pow(mass_exact - t_value, 2); // + flux_error;
621 
622  data.getFieldData()[0] += a * local_error;
623  eRror += a * local_error;
624 
625  ++t_w;
626  ++t_value;
627  ++t_grad;
628  ++t_coords;
629  }
630 
631  data.getFieldDofs()[0]->getFieldData() = data.getFieldData()[0];
632  }
634  }
constexpr double a
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:359
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:44
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:429
#define CHKERR
Inline error check.
Definition: definitions.h:548
double dt
Definition: heat_method.cpp:40
FTensor::Index< 'j', 3 > j
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
Definition: Templates.hpp:149
FTensor::Index< 'm', 3 > m
const VectorDouble & getFieldData() const
get dofs values
const VectorDofs & getFieldDofs() const
get dofs data stature FEDofEntity
FTensor::Number< 1 > NY
FTensor::Number< 0 > NX

Member Data Documentation

◆ eRror

double& StdRDOperators::OpError::eRror

Definition at line 557 of file rd_stdOperators.hpp.

◆ exactGrad

FGrad StdRDOperators::OpError::exactGrad
private

Definition at line 639 of file rd_stdOperators.hpp.

◆ exactLap

FVal StdRDOperators::OpError::exactLap
private

Definition at line 638 of file rd_stdOperators.hpp.

◆ exactVal

FVal StdRDOperators::OpError::exactVal
private

Definition at line 637 of file rd_stdOperators.hpp.

◆ NX

FTensor::Number<0> StdRDOperators::OpError::NX
private

Definition at line 643 of file rd_stdOperators.hpp.

◆ NY

FTensor::Number<1> StdRDOperators::OpError::NY
private

Definition at line 644 of file rd_stdOperators.hpp.

◆ prevData

boost::shared_ptr<PreviousData> StdRDOperators::OpError::prevData
private

Definition at line 640 of file rd_stdOperators.hpp.

◆ setOfBlock

std::map<int, BlockData> StdRDOperators::OpError::setOfBlock
private

Definition at line 641 of file rd_stdOperators.hpp.


The documentation for this struct was generated from the following file: