v0.14.0
Classes | Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | Friends | List of all members
Example Struct Reference

[Example] More...

Collaboration diagram for Example:
[legend]

Classes

struct  BoundaryOp
 
struct  CommonData
 [Example] More...
 
struct  DynamicFirstOrderConsConstantTimeScale
 
struct  DynamicFirstOrderConsSinusTimeScale
 
struct  OpCalcSurfaceAverageTemperature
 
struct  OpError
 
struct  OpError< 1 >
 
struct  OpFirst
 
struct  OpFluxRhs
 
struct  OpRadiationLhs
 
struct  OpRadiationRhs
 
struct  OpRhs
 
struct  OpSecond
 [Operator] More...
 
struct  OpZero
 [Common data] More...
 
struct  ScaledTimeScale
 

Public Member Functions

 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 [Run problem] More...
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 Example (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 

Private Types

enum  BoundingBox {
  CENTER_X = 0, CENTER_Y, MAX_X, MAX_Y,
  MIN_X, MIN_Y, LAST_BB
}
 

Private Member Functions

MoFEMErrorCode setupProblem ()
 [Run problem] More...
 
MoFEMErrorCode createCommonData ()
 [Set up problem] More...
 
MoFEMErrorCode bC ()
 [Create common data] More...
 
MoFEMErrorCode OPs ()
 [Boundary condition] More...
 
MoFEMErrorCode tsSolve ()
 
MoFEMErrorCode testOperators ()
 [Solve] More...
 
MoFEMErrorCode readMesh ()
 [Run problem] More...
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode boundaryCondition ()
 [Set up problem] More...
 
MoFEMErrorCode assembleSystem ()
 [Push operators to pipeline] More...
 
MoFEMErrorCode solveSystem ()
 [Solve] More...
 
MoFEMErrorCode outputResults ()
 [Solve] More...
 
MoFEMErrorCode checkResults ()
 [Postprocess results] More...
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode boundaryCondition ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode outputResults ()
 
MoFEMErrorCode checkResults ()
 
MoFEMErrorCode setUp ()
 [Run all] More...
 
MoFEMErrorCode createCommonData ()
 
MoFEMErrorCode setFieldValues ()
 [Create common data] More...
 
MoFEMErrorCode pushOperators ()
 [Set density distribution] More...
 
MoFEMErrorCode integrateElements ()
 [Push operators to pipeline] More...
 
MoFEMErrorCode postProcess ()
 [Integrate] More...
 
MoFEMErrorCode checkResults ()
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode setIntegrationRules ()
 [Set up problem] More...
 
MoFEMErrorCode createCommonData ()
 
MoFEMErrorCode boundaryCondition ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode outputResults ()
 
MoFEMErrorCode checkResults ()
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode assembleSystemIntensity ()
 [Calculate flux on boundary] More...
 
MoFEMErrorCode assembleSystemFlux ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode calculateFlux (double &calc_flux)
 [Set up problem] More...
 
MoFEMErrorCode outputResults (const int i)
 [Solve] More...
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode setIntegrationRules ()
 
MoFEMErrorCode createCommonData ()
 
MoFEMErrorCode boundaryCondition ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode outputResults ()
 
MoFEMErrorCode checkResults ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode createCommonData ()
 
MoFEMErrorCode bC ()
 
MoFEMErrorCode OPs ()
 
MoFEMErrorCode kspSolve ()
 [Push operators to pipeline] More...
 
MoFEMErrorCode postProcess ()
 
MoFEMErrorCode checkResults ()
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode setIntegrationRules ()
 
MoFEMErrorCode createCommonData ()
 
MoFEMErrorCode boundaryCondition ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode outputResults ()
 
MoFEMErrorCode checkResults ()
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode boundaryCondition ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode outputResults ()
 
MoFEMErrorCode checkResults ()
 
MoFEMErrorCode addMatBlockOps (boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pipeline, std::string field_name, std::string block_name, boost::shared_ptr< MatrixDouble > mat_D_Ptr, Sev sev)
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode createCommonData ()
 
MoFEMErrorCode boundaryCondition ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode outputResults ()
 
MoFEMErrorCode checkResults ()
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode boundaryCondition ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode gettingNorms ()
 [Solve] More...
 
MoFEMErrorCode outputResults ()
 
MoFEMErrorCode checkResults ()
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode boundaryCondition ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode outputResults ()
 
MoFEMErrorCode checkResults ()
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode createCommonData ()
 
MoFEMErrorCode boundaryCondition ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode outputResults ()
 
MoFEMErrorCode checkResults ()
 

Static Private Member Functions

static std::pair< int, int > getCoordsInImage (double x, double y)
 
static double rhsSource (const double x, const double y, const double)
 
static double lhsFlux (const double x, const double y, const double)
 
static int integrationRule (int, int, int p_data)
 

Private Attributes

MoFEM::InterfacemField
 
boost::shared_ptr< DomainElereactionFe
 
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uXScatter
 
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uYScatter
 
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uZScatter
 
SimplesimpleInterface
 
boost::shared_ptr< std::vector< unsigned char > > boundaryMarker
 
boost::shared_ptr< CommonDatacommonDataPtr
 
FieldApproximationBase base
 
FieldSpace space
 
boost::shared_ptr< VectorDouble > approxVals
 
boost::shared_ptr< MatrixDouble > approxGradVals
 
Range pinchNodes
 
PetscBool doEvalField
 
std::array< double, SPACE_DIMfieldEvalCoords
 
boost::shared_ptr< FieldEvaluatorInterface::SetPtsDatafieldEvalData
 
boost::shared_ptr< MatrixDouble > vectorFieldPtr
 
boost::shared_ptr< MatrixDouble > matDPtr
 
SmartPetscObj< Mat > M
 
SmartPetscObj< Mat > K
 
SmartPetscObj< EPS > ePS
 
std::array< SmartPetscObj< Vec >, 6 > rigidBodyMotion
 
boost::shared_ptr< FEMethoddomianLhsFEPtr
 
boost::shared_ptr< FEMethoddomianRhsFEPtr
 

Static Private Attributes

static std::vector< doublerZ
 
static std::vector< MatrixIntiI
 
static std::array< double, LAST_BBaveMaxMin
 
static int focalIndex
 
static int savitzkyGolayNormalisation
 
static const int * savitzkyGolayWeights
 
static ApproxFieldFunction< FIELD_DIMapproxFunction
 

Friends

struct TSPrePostProc
 

Detailed Description

[Example]

Examples
dynamic_first_order_con_law.cpp, eigen_elastic.cpp, heat_method.cpp, helmholtz.cpp, phase.cpp, plastic.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 177 of file plastic.cpp.

Member Enumeration Documentation

◆ BoundingBox

enum Example::BoundingBox
private
Enumerator
CENTER_X 
CENTER_Y 
MAX_X 
MAX_Y 
MIN_X 
MIN_Y 
LAST_BB 

Definition at line 98 of file phase.cpp.

98  {
99  CENTER_X = 0,
100  CENTER_Y,
101  MAX_X,
102  MAX_Y,
103  MIN_X,
104  MIN_Y,
105  LAST_BB
106  };

Constructor & Destructor Documentation

◆ Example() [1/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 179 of file plastic.cpp.

179 : mField(m_field) {}

◆ Example() [2/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 421 of file dynamic_first_order_con_law.cpp.

421 : mField(m_field) {}

◆ Example() [3/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 35 of file helmholtz.cpp.

35 : mField(m_field) {}

◆ Example() [4/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 25 of file integration.cpp.

25 : mField(m_field) {}

◆ Example() [5/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 50 of file plot_base.cpp.

50 : mField(m_field) {}

◆ Example() [6/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 81 of file phase.cpp.

81 : mField(m_field) {}

◆ Example() [7/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 53 of file approximaton.cpp.

53 : mField(m_field) {}

◆ Example() [8/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 45 of file radiation.cpp.

45 : mField(m_field) {}

◆ Example() [9/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 46 of file heat_method.cpp.

46 : mField(m_field) {}

◆ Example() [10/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 88 of file elastic.cpp.

88 : mField(m_field) {}

◆ Example() [11/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 49 of file eigen_elastic.cpp.

49 : mField(m_field) {}

◆ Example() [12/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 57 of file nonlinear_elastic.cpp.

57 : mField(m_field) {}

◆ Example() [13/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 55 of file nonlinear_dynamic_elastic.cpp.

55 : mField(m_field) {}

◆ Example() [14/14]

Example::Example ( MoFEM::Interface m_field)
inline

Definition at line 339 of file shallow_wave.cpp.

339 : mField(m_field) {}

Member Function Documentation

◆ addMatBlockOps()

MoFEMErrorCode Example::addMatBlockOps ( boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &  pipeline,
std::string  field_name,
std::string  block_name,
boost::shared_ptr< MatrixDouble >  mat_D_Ptr,
Sev  sev 
)
private

[Calculate elasticity tensor]

[Calculate elasticity tensor]

Definition at line 114 of file elastic.cpp.

117  {
119 
120  struct OpMatBlocks : public DomainEleOp {
121  OpMatBlocks(std::string field_name, boost::shared_ptr<MatrixDouble> m,
122  double bulk_modulus_K, double shear_modulus_G,
123  MoFEM::Interface &m_field, Sev sev,
124  std::vector<const CubitMeshSets *> meshset_vec_ptr)
126  bulkModulusKDefault(bulk_modulus_K),
127  shearModulusGDefault(shear_modulus_G) {
128  std::fill(&(doEntities[MBEDGE]), &(doEntities[MBMAXTYPE]), false);
129  CHK_THROW_MESSAGE(extractBlockData(m_field, meshset_vec_ptr, sev),
130  "Can not get data from block");
131  }
132 
133  MoFEMErrorCode doWork(int side, EntityType type,
136 
137  for (auto &b : blockData) {
138 
139  if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
140  CHKERR getMatDPtr(matDPtr, b.bulkModulusK, b.shearModulusG);
142  }
143  }
144 
145  CHKERR getMatDPtr(matDPtr, bulkModulusKDefault, shearModulusGDefault);
147  }
148 
149  private:
150  boost::shared_ptr<MatrixDouble> matDPtr;
151 
152  struct BlockData {
153  double bulkModulusK;
154  double shearModulusG;
155  Range blockEnts;
156  };
157 
158  double bulkModulusKDefault;
159  double shearModulusGDefault;
160  std::vector<BlockData> blockData;
161 
163  extractBlockData(MoFEM::Interface &m_field,
164  std::vector<const CubitMeshSets *> meshset_vec_ptr,
165  Sev sev) {
167 
168  for (auto m : meshset_vec_ptr) {
169  MOFEM_TAG_AND_LOG("WORLD", sev, "MatBlock") << *m;
170  std::vector<double> block_data;
171  CHKERR m->getAttributes(block_data);
172  if (block_data.size() < 2) {
173  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
174  "Expected that block has two attributes");
175  }
176  auto get_block_ents = [&]() {
177  Range ents;
178  CHKERR
179  m_field.get_moab().get_entities_by_handle(m->meshset, ents, true);
180  return ents;
181  };
182 
183  double young_modulus = block_data[0];
184  double poisson_ratio = block_data[1];
185  double bulk_modulus_K = young_modulus / (3 * (1 - 2 * poisson_ratio));
186  double shear_modulus_G = young_modulus / (2 * (1 + poisson_ratio));
187 
188  MOFEM_TAG_AND_LOG("WORLD", sev, "MatBlock")
189  << "E = " << young_modulus << " nu = " << poisson_ratio;
190 
191  blockData.push_back(
192  {bulk_modulus_K, shear_modulus_G, get_block_ents()});
193  }
194  MOFEM_LOG_CHANNEL("WORLD");
196  }
197 
198  MoFEMErrorCode getMatDPtr(boost::shared_ptr<MatrixDouble> mat_D_ptr,
199  double bulk_modulus_K, double shear_modulus_G) {
201  //! [Calculate elasticity tensor]
202  auto set_material_stiffness = [&]() {
208  double A = 1.;
209  if (SPACE_DIM == 2 && !is_plane_strain) {
210  A = 2 * shear_modulus_G /
211  (bulk_modulus_K + (4. / 3.) * shear_modulus_G);
212  }
213  auto t_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, 0>(*mat_D_ptr);
214  t_D(i, j, k, l) =
215  2 * shear_modulus_G * ((t_kd(i, k) ^ t_kd(j, l)) / 4.) +
216  A * (bulk_modulus_K - (2. / 3.) * shear_modulus_G) * t_kd(i, j) *
217  t_kd(k, l);
218  };
219  //! [Calculate elasticity tensor]
220  constexpr auto size_symm = (SPACE_DIM * (SPACE_DIM + 1)) / 2;
221  mat_D_ptr->resize(size_symm * size_symm, 1);
222  set_material_stiffness();
224  }
225  };
226 
227  pipeline.push_back(new OpMatBlocks(
228  field_name, mat_D_Ptr, bulk_modulus_K, shear_modulus_G, mField, sev,
229 
230  // Get blockset using regular expression
232 
233  (boost::format("%s(.*)") % block_name).str()
234 
235  ))
236 
237  ));
238 
240 }

◆ assembleSystem() [1/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [2/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [3/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [4/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [5/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [6/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [7/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [8/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [9/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [10/10]

MoFEMErrorCode Example::assembleSystem ( )
private

[Push operators to pipeline]

[Boundary condition]

[Applying essential BC]

[Push operators to pipeline]

[Integration rule]

[Integration rule]

[Push domain stiffness matrix to pipeline]

[Push domain stiffness matrix to pipeline]

[Push Internal forces]

[Push Internal forces]

[Push Body forces]

[Push Body forces]

[Push natural boundary conditions]

[Push natural boundary conditions]

Examples
dynamic_first_order_con_law.cpp, eigen_elastic.cpp, heat_method.cpp, helmholtz.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 647 of file dynamic_first_order_con_law.cpp.

647  {
649  auto *simple = mField.getInterface<Simple>();
650  auto *pipeline_mng = mField.getInterface<PipelineManager>();
651 
652  auto get_body_force = [this](const double, const double, const double) {
655  t_source(i) = 0.;
656  t_source(0) = 0.1;
657  t_source(1) = 1.;
658  return t_source;
659  };
660 
661  // specific time scaling
662  auto get_time_scale = [this](const double time) {
663  return sin(time * omega * M_PI);
664  };
665 
666  auto apply_rhs = [&](auto &pip) {
668 
670  "GEOMETRY");
671 
672  // Calculate Gradient of velocity
673  auto mat_v_grad_ptr = boost::make_shared<MatrixDouble>();
675  "V", mat_v_grad_ptr));
676 
677  auto gravity_vector_ptr = boost::make_shared<MatrixDouble>();
678  gravity_vector_ptr->resize(SPACE_DIM, 1);
679  auto set_body_force = [&]() {
682  auto t_force = getFTensor1FromMat<SPACE_DIM, 0>(*gravity_vector_ptr);
683  double unit_weight = 0.;
684  CHKERR PetscOptionsGetReal(PETSC_NULL, "", "-unit_weight", &unit_weight,
685  PETSC_NULL);
686  t_force(i) = 0;
687  if (SPACE_DIM == 2) {
688  t_force(1) = -unit_weight;
689  } else if (SPACE_DIM == 3) {
690  t_force(2) = unit_weight;
691  }
693  };
694 
695  CHKERR set_body_force();
696  pip.push_back(new OpBodyForce("V", gravity_vector_ptr,
697  [](double, double, double) { return 1.; }));
698 
699  // Calculate unknown F
700  auto mat_H_tensor_ptr = boost::make_shared<MatrixDouble>();
702  "F", mat_H_tensor_ptr));
703 
704  // // Calculate F
705  double tau = 0.2;
706  CHKERR PetscOptionsGetReal(PETSC_NULL, "", "-tau", &tau, PETSC_NULL);
707 
708  double xi = 0.;
709  CHKERR PetscOptionsGetReal(PETSC_NULL, "", "-xi", &xi, PETSC_NULL);
710 
711  // Calculate P stab
712  auto one = [&](const double, const double, const double) {
713  return 3. * bulk_modulus_K;
714  };
715  auto minus_one = [](const double, const double, const double) {
716  return -1.;
717  };
718 
719  auto mat_dot_F_tensor_ptr = boost::make_shared<MatrixDouble>();
721  "F_dot", mat_dot_F_tensor_ptr));
722 
723  // Calculate Gradient of Spatial Positions
724  auto mat_x_grad_ptr = boost::make_shared<MatrixDouble>();
726  "x_2", mat_x_grad_ptr));
727 
728  auto mat_F_tensor_ptr = boost::make_shared<MatrixDouble>();
730  mat_F_tensor_ptr, mat_H_tensor_ptr));
731 
732  auto mat_F_stab_ptr = boost::make_shared<MatrixDouble>();
733  pip.push_back(new OpCalculateFStab<SPACE_DIM, SPACE_DIM>(
734  mat_F_tensor_ptr, mat_F_stab_ptr, mat_dot_F_tensor_ptr, tau, xi,
735  mat_x_grad_ptr, mat_v_grad_ptr));
736 
737  PetscBool is_linear_elasticity = PETSC_TRUE;
738  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-is_linear_elasticity",
739  &is_linear_elasticity, PETSC_NULL);
740 
741  auto mat_P_stab_ptr = boost::make_shared<MatrixDouble>();
742  if (is_linear_elasticity) {
743  pip.push_back(new OpCalculatePiola<SPACE_DIM, SPACE_DIM>(
744  shear_modulus_G, bulk_modulus_K, mu, lamme_lambda, mat_P_stab_ptr,
745  mat_F_stab_ptr));
746  } else {
747  auto inv_F = boost::make_shared<MatrixDouble>();
748  auto det_ptr = boost::make_shared<VectorDouble>();
749 
750  pip.push_back(
751  new OpInvertMatrix<SPACE_DIM>(mat_F_stab_ptr, det_ptr, inv_F));
752 
753  // OpCalculatePiolaIncompressibleNH
755  shear_modulus_G, bulk_modulus_K, mu, lamme_lambda, mat_P_stab_ptr,
756  mat_F_stab_ptr, inv_F, det_ptr));
757  }
758 
759  pip.push_back(new OpGradTimesTensor2("V", mat_P_stab_ptr, minus_one));
760  pip.push_back(new OpRhsTestPiola("F", mat_v_grad_ptr, one));
761 
763  };
764 
765  CHKERR apply_rhs(pipeline_mng->getOpDomainExplicitRhsPipeline());
766 
767  auto integration_rule = [](int, int, int approx_order) {
768  return 2 * approx_order;
769  };
770  CHKERR pipeline_mng->setDomainExplicitRhsIntegrationRule(integration_rule);
771 
773 }

◆ assembleSystemFlux()

MoFEMErrorCode Example::assembleSystemFlux ( )
private

◆ assembleSystemIntensity()

MoFEMErrorCode Example::assembleSystemIntensity ( )
private

[Calculate flux on boundary]

[Push operators to pipeline]

Examples
phase.cpp.

Definition at line 433 of file phase.cpp.

433  {
435 
436  auto *pipeline_mng = mField.getInterface<PipelineManager>();
437 
438  pipeline_mng->getDomainLhsFE().reset();
439  pipeline_mng->getDomainRhsFE().reset();
440  pipeline_mng->getBoundaryRhsFE().reset();
441 
442  auto rule_vol = [](int, int, int order) { return 2 * (order + 1); };
443  pipeline_mng->setDomainLhsIntegrationRule(rule_vol);
444  pipeline_mng->setDomainRhsIntegrationRule(rule_vol);
445 
446  auto det_ptr = boost::make_shared<VectorDouble>();
447  auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
448  auto jac_ptr = boost::make_shared<MatrixDouble>();
449  pipeline_mng->getOpDomainLhsPipeline().push_back(new OpSetHOWeightsOnFace());
450  pipeline_mng->getOpDomainLhsPipeline().push_back(
451  new OpCalculateHOJacForFace(jac_ptr));
452  pipeline_mng->getOpDomainLhsPipeline().push_back(
453  new OpInvertMatrix<2>(jac_ptr, det_ptr, inv_jac_ptr));
454  pipeline_mng->getOpDomainLhsPipeline().push_back(new OpMakeHdivFromHcurl());
455  pipeline_mng->getOpDomainLhsPipeline().push_back(
457  pipeline_mng->getOpDomainLhsPipeline().push_back(
458  new OpSetInvJacHcurlFace(inv_jac_ptr));
459  pipeline_mng->getOpDomainLhsPipeline().push_back(new OpSetHOWeightsOnFace());
460 
461  pipeline_mng->getOpDomainLhsPipeline().push_back(
462  new OpHdivHdiv("S", "S", lhsFlux));
463  auto unity = []() { return 1; };
464  pipeline_mng->getOpDomainLhsPipeline().push_back(
465  new OpHdivU("S", "PHI", unity, true));
466 
467  pipeline_mng->getOpDomainRhsPipeline().push_back(new OpSetHOWeightsOnFace());
468  pipeline_mng->getOpDomainRhsPipeline().push_back(
469  new OpDomainSource("PHI", rhsSource));
470 
472 }

◆ bC() [1/2]

MoFEMErrorCode Example::bC ( )
private

◆ bC() [2/2]

MoFEMErrorCode Example::bC ( )
private

[Create common data]

[Boundary condition]

Examples
plastic.cpp.

Definition at line 512 of file plastic.cpp.

512  {
514 
515  auto simple = mField.getInterface<Simple>();
516  auto bc_mng = mField.getInterface<BcManager>();
517 
518  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), "REMOVE_X",
519  "U", 0, 0);
520  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), "REMOVE_Y",
521  "U", 1, 1);
522  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), "REMOVE_Z",
523  "U", 2, 2);
524  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(),
525  "REMOVE_ALL", "U", 0, 3);
526 
527 #ifdef ADD_CONTACT
528  for (auto b : {"FIX_X", "REMOVE_X"})
529  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
530  "SIGMA", 0, 0, false, true);
531  for (auto b : {"FIX_Y", "REMOVE_Y"})
532  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
533  "SIGMA", 1, 1, false, true);
534  for (auto b : {"FIX_Z", "REMOVE_Z"})
535  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
536  "SIGMA", 2, 2, false, true);
537  for (auto b : {"FIX_ALL", "REMOVE_ALL"})
538  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
539  "SIGMA", 0, 3, false, true);
540  CHKERR bc_mng->removeBlockDOFsOnEntities(
541  simple->getProblemName(), "NO_CONTACT", "SIGMA", 0, 3, false, true);
542 #endif
543 
544  CHKERR bc_mng->pushMarkDOFsOnEntities<DisplacementCubitBcData>(
545  simple->getProblemName(), "U");
546 
547  auto &bc_map = bc_mng->getBcMapByBlockName();
548  for (auto bc : bc_map)
549  MOFEM_LOG("PLASTICITY", Sev::verbose) << "Marker " << bc.first;
550 
552 }

◆ boundaryCondition() [1/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [2/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [3/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [4/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [5/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [6/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [7/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [8/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [9/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [10/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

[Set up problem]

[Create common data]

[Boundary condition]

[Applying essential BC]

[Define gravity vector]

Examples
dynamic_first_order_con_law.cpp, eigen_elastic.cpp, heat_method.cpp, helmholtz.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 536 of file dynamic_first_order_con_law.cpp.

536  {
538 
539  auto simple = mField.getInterface<Simple>();
540  auto bc_mng = mField.getInterface<BcManager>();
541  auto *pipeline_mng = mField.getInterface<PipelineManager>();
542  auto time_scale = boost::make_shared<TimeScale>();
543 
544  PetscBool sin_time_function = PETSC_FALSE;
545  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-sin_time_function",
546  &sin_time_function, PETSC_NULL);
547 
548  if (sin_time_function)
549  time_scale = boost::make_shared<DynamicFirstOrderConsSinusTimeScale>();
550  else
551  time_scale = boost::make_shared<DynamicFirstOrderConsConstantTimeScale>();
552 
553  pipeline_mng->getBoundaryExplicitRhsFE().reset();
555  pipeline_mng->getOpBoundaryExplicitRhsPipeline(), {NOSPACE}, "GEOMETRY");
556 
558  pipeline_mng->getOpBoundaryExplicitRhsPipeline(), mField, "V",
559  {time_scale}, "FORCE", Sev::inform);
560 
561  auto integration_rule = [](int, int, int approx_order) {
562  return 2 * approx_order;
563  };
564 
565  CHKERR pipeline_mng->setBoundaryExplicitRhsIntegrationRule(integration_rule);
566  CHKERR pipeline_mng->setDomainExplicitRhsIntegrationRule(integration_rule);
567 
568  CHKERR bc_mng->removeBlockDOFsOnEntities<DisplacementCubitBcData>(
569  simple->getProblemName(), "V");
570 
571  auto get_pre_proc_hook = [&]() {
573  mField, pipeline_mng->getDomainExplicitRhsFE(), {time_scale});
574  };
575  pipeline_mng->getDomainExplicitRhsFE()->preProcessHook = get_pre_proc_hook();
576 
578 }

◆ calculateFlux()

MoFEMErrorCode Example::calculateFlux ( double calc_flux)
private

[Set up problem]

[Calculate flux on boundary]

Examples
phase.cpp.

Definition at line 402 of file phase.cpp.

402  {
404  auto pipeline_mng = mField.getInterface<PipelineManager>();
405 
406  pipeline_mng->getDomainLhsFE().reset();
407  pipeline_mng->getDomainRhsFE().reset();
408  pipeline_mng->getBoundaryRhsFE().reset();
409 
410  auto rule_vol = [](int, int, int order) { return 2 * (order + 1); };
411  pipeline_mng->setBoundaryRhsIntegrationRule(rule_vol);
412 
413  auto flux_ptr = boost::make_shared<MatrixDouble>();
414  pipeline_mng->getOpBoundaryRhsPipeline().push_back(
416  pipeline_mng->getOpBoundaryRhsPipeline().push_back(
417  new OpCalculateHVecVectorField<3>("S", flux_ptr));
418  pipeline_mng->getOpBoundaryRhsPipeline().push_back(
419  new BoundaryOp(flux_ptr, calc_flux));
420 
421  calc_flux = 0;
422  CHKERR pipeline_mng->loopFiniteElements();
423  double global_flux_assembeld = 0;
424  MPI_Allreduce(&calc_flux, &global_flux_assembeld, 1, MPI_DOUBLE, MPI_SUM,
425  mField.get_comm());
426  calc_flux = global_flux_assembeld;
427 
429 }

◆ checkResults() [1/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [2/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [3/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [4/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [5/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [6/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [7/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [8/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [9/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [10/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [11/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [12/12]

MoFEMErrorCode Example::checkResults ( )
private

[Postprocess results]

[Postprocessing results]

[Print results]

[Check]

[Check results]

[Test example]

Examples
dynamic_first_order_con_law.cpp, eigen_elastic.cpp, heat_method.cpp, helmholtz.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 1205 of file dynamic_first_order_con_law.cpp.

1205  {
1208 }

◆ createCommonData() [1/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [2/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [3/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [4/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [5/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [6/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [7/8]

MoFEMErrorCode Example::createCommonData ( )
private

[Set up problem]

[Set integration rule]

[Create common data]

< true if tau order is set

< true if tau order is set

Examples
eigen_elastic.cpp, heat_method.cpp, plastic.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 404 of file plastic.cpp.

404  {
406 
407  auto get_command_line_parameters = [&]() {
409 
410  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-scale", &scale, PETSC_NULL);
411  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-young_modulus",
412  &young_modulus, PETSC_NULL);
413  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-poisson_ratio",
414  &poisson_ratio, PETSC_NULL);
415  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-hardening", &H, PETSC_NULL);
416  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-hardening_viscous", &visH,
417  PETSC_NULL);
418  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-yield_stress", &sigmaY,
419  PETSC_NULL);
420  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-cn0", &cn0, PETSC_NULL);
421  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-cn1", &cn1, PETSC_NULL);
422  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-zeta", &zeta, PETSC_NULL);
423  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-Qinf", &Qinf, PETSC_NULL);
424  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-b_iso", &b_iso, PETSC_NULL);
425  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-C1_k", &C1_k, PETSC_NULL);
426  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-large_strains",
427  &is_large_strains, PETSC_NULL);
428  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-set_timer", &set_timer,
429  PETSC_NULL);
430 
431  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-order", &order, PETSC_NULL);
432  PetscBool tau_order_is_set; ///< true if tau order is set
433  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-tau_order", &tau_order,
434  &tau_order_is_set);
435  PetscBool ep_order_is_set; ///< true if tau order is set
436  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-ep_order", &ep_order,
437  &ep_order_is_set);
438  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-geom_order", &geom_order,
439  PETSC_NULL);
440 
441  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-rho", &rho, PETSC_NULL);
442  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-alpha_damping",
443  &alpha_damping, PETSC_NULL);
444 
445  MOFEM_LOG("PLASTICITY", Sev::inform) << "Young modulus " << young_modulus;
446  MOFEM_LOG("PLASTICITY", Sev::inform) << "Poisson ratio " << poisson_ratio;
447  MOFEM_LOG("PLASTICITY", Sev::inform) << "Yield stress " << sigmaY;
448  MOFEM_LOG("PLASTICITY", Sev::inform) << "Hardening " << H;
449  MOFEM_LOG("PLASTICITY", Sev::inform) << "Viscous hardening " << visH;
450  MOFEM_LOG("PLASTICITY", Sev::inform) << "Saturation yield stress " << Qinf;
451  MOFEM_LOG("PLASTICITY", Sev::inform) << "Saturation exponent " << b_iso;
452  MOFEM_LOG("PLASTICITY", Sev::inform) << "Kinematic hardening " << C1_k;
453  MOFEM_LOG("PLASTICITY", Sev::inform) << "cn0 " << cn0;
454  MOFEM_LOG("PLASTICITY", Sev::inform) << "cn1 " << cn1;
455  MOFEM_LOG("PLASTICITY", Sev::inform) << "zeta " << zeta;
456 
457  if (tau_order_is_set == PETSC_FALSE)
458  tau_order = order - 2;
459  if (ep_order_is_set == PETSC_FALSE)
460  ep_order = order - 1;
461 
462  MOFEM_LOG("PLASTICITY", Sev::inform) << "Approximation order " << order;
463  MOFEM_LOG("PLASTICITY", Sev::inform)
464  << "Ep approximation order " << ep_order;
465  MOFEM_LOG("PLASTICITY", Sev::inform)
466  << "Tau approximation order " << tau_order;
467  MOFEM_LOG("PLASTICITY", Sev::inform)
468  << "Geometry approximation order " << geom_order;
469 
470  MOFEM_LOG("PLASTICITY", Sev::inform) << "Density " << rho;
471  MOFEM_LOG("PLASTICITY", Sev::inform) << "alpha_damping " << alpha_damping;
472 
473  PetscBool is_scale = PETSC_TRUE;
474  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-is_scale", &is_scale,
475  PETSC_NULL);
476  if (is_scale) {
477  scale /= young_modulus;
478  }
479 
480  MOFEM_LOG("PLASTICITY", Sev::inform) << "Scale " << scale;
481 
482 #ifdef ADD_CONTACT
483  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-cn_contact",
484  &ContactOps::cn_contact, PETSC_NULL);
485  MOFEM_LOG("CONTACT", Sev::inform)
486  << "cn_contact " << ContactOps::cn_contact;
487 #endif // ADD_CONTACT
488 
489  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-quasi_static",
490  &is_quasi_static, PETSC_NULL);
491  MOFEM_LOG("PLASTICITY", Sev::inform)
492  << "Is quasi static: " << (is_quasi_static ? "true" : "false");
493 
495  };
496 
497  CHKERR get_command_line_parameters();
498 
499 #ifdef ADD_CONTACT
500  #ifdef PYTHON_SDF
501  sdfPythonPtr = boost::make_shared<ContactOps::SDFPython>();
502  CHKERR sdfPythonPtr->sdfInit("sdf.py");
503  ContactOps::sdfPythonWeakPtr = sdfPythonPtr;
504  #endif
505 #endif // ADD_CONTACT
506 
508 }

◆ createCommonData() [8/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ getCoordsInImage()

std::pair< int, int > Example::getCoordsInImage ( double  x,
double  y 
)
staticprivate
Examples
phase.cpp.

Definition at line 131 of file phase.cpp.

131  {
132 
133  auto &m = iI[focalIndex];
134  x -= aveMaxMin[MIN_X];
135  y -= aveMaxMin[MIN_Y];
136  x *= (m.size1() - 1) / (aveMaxMin[MAX_X] - aveMaxMin[MIN_X]);
137  y *= (m.size2() - 1) / (aveMaxMin[MAX_Y] - aveMaxMin[MIN_Y]);
138  const auto p = std::make_pair<int, int>(std::round(x), std::round(y));
139 
140 #ifndef NDEBUG
141  if (p.first < 0 && p.first >= m.size1())
142  THROW_MESSAGE("Wrong index");
143  if (p.second < 0 && p.second >= m.size2())
144  THROW_MESSAGE("Wrong index");
145 #endif
146 
147  return p;
148 }

◆ gettingNorms()

MoFEMErrorCode Example::gettingNorms ( )
private

[Solve]

[Getting norms]

Definition at line 381 of file nonlinear_elastic.cpp.

381  {
383 
384  auto simple = mField.getInterface<Simple>();
385  auto dm = simple->getDM();
386 
387  auto T = createDMVector(simple->getDM());
388  CHKERR DMoFEMMeshToLocalVector(simple->getDM(), T, INSERT_VALUES,
389  SCATTER_FORWARD);
390  double nrm2;
391  CHKERR VecNorm(T, NORM_2, &nrm2);
392  MOFEM_LOG("EXAMPLE", Sev::inform) << "Solution norm " << nrm2;
393 
394  auto post_proc_norm_fe = boost::make_shared<DomainEle>(mField);
395 
396  auto post_proc_norm_rule_hook = [](int, int, int p) -> int { return 2 * p; };
397  post_proc_norm_fe->getRuleHook = post_proc_norm_rule_hook;
398 
400  post_proc_norm_fe->getOpPtrVector(), {H1});
401 
402  enum NORMS { U_NORM_L2 = 0, PIOLA_NORM, LAST_NORM };
403  auto norms_vec =
405  (mField.get_comm_rank() == 0) ? LAST_NORM : 0, LAST_NORM);
406  CHKERR VecZeroEntries(norms_vec);
407 
408  auto u_ptr = boost::make_shared<MatrixDouble>();
409  post_proc_norm_fe->getOpPtrVector().push_back(
411 
412  post_proc_norm_fe->getOpPtrVector().push_back(
413  new OpCalcNormL2Tensor1<SPACE_DIM>(u_ptr, norms_vec, U_NORM_L2));
414 
415  auto common_ptr = commonDataFactory<SPACE_DIM, GAUSS, DomainEleOp>(
416  mField, post_proc_norm_fe->getOpPtrVector(), "U", "MAT_ELASTIC",
417  Sev::inform);
418 
419  post_proc_norm_fe->getOpPtrVector().push_back(
421  common_ptr->getMatFirstPiolaStress(), norms_vec, PIOLA_NORM));
422 
423  CHKERR DMoFEMLoopFiniteElements(dm, simple->getDomainFEName(),
424  post_proc_norm_fe);
425 
426  CHKERR VecAssemblyBegin(norms_vec);
427  CHKERR VecAssemblyEnd(norms_vec);
428 
429  MOFEM_LOG_CHANNEL("SELF"); // Clear channel from old tags
430  if (mField.get_comm_rank() == 0) {
431  const double *norms;
432  CHKERR VecGetArrayRead(norms_vec, &norms);
433  MOFEM_TAG_AND_LOG("SELF", Sev::inform, "example")
434  << "norm_u: " << std::scientific << std::sqrt(norms[U_NORM_L2]);
435  MOFEM_TAG_AND_LOG("SELF", Sev::inform, "example")
436  << "norm_piola: " << std::scientific << std::sqrt(norms[PIOLA_NORM]);
437  CHKERR VecRestoreArrayRead(norms_vec, &norms);
438  }
439 
441 }

◆ integrateElements()

MoFEMErrorCode Example::integrateElements ( )
private

[Push operators to pipeline]

[Integrate]

Definition at line 218 of file integration.cpp.

218  {
220  // Zero global vector
221  CHKERR VecZeroEntries(commonDataPtr->petscVec);
222 
223  // Integrate elements by executing operators in the pipeline
225  CHKERR pipeline_mng->loopFiniteElements();
226 
227  // Assemble MPI vector
228  CHKERR VecAssemblyBegin(commonDataPtr->petscVec);
229  CHKERR VecAssemblyEnd(commonDataPtr->petscVec);
231 }

◆ integrationRule()

static int Example::integrationRule ( int  ,
int  ,
int  p_data 
)
inlinestaticprivate

Definition at line 52 of file radiation.cpp.

52 { return 2 * p_data; };

◆ kspSolve()

MoFEMErrorCode Example::kspSolve ( )
private

[Push operators to pipeline]

[Solve]

Definition at line 230 of file radiation.cpp.

230  {
234  auto ts = pipeline_mng->createTSIM();
235 
236  double ftime = 1;
237  CHKERR TSSetDuration(ts, PETSC_DEFAULT, ftime);
238  CHKERR TSSetFromOptions(ts);
239  CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP);
240 
241  auto T = createDMVector(simple->getDM());
242  CHKERR DMoFEMMeshToLocalVector(simple->getDM(), T, INSERT_VALUES,
243  SCATTER_FORWARD);
244 
245  CHKERR TSSolve(ts, T);
246  CHKERR TSGetTime(ts, &ftime);
247 
248  PetscInt steps, snesfails, rejects, nonlinits, linits;
249  CHKERR TSGetTimeStepNumber(ts, &steps);
250  CHKERR TSGetSNESFailures(ts, &snesfails);
251  CHKERR TSGetStepRejections(ts, &rejects);
252  CHKERR TSGetSNESIterations(ts, &nonlinits);
253  CHKERR TSGetKSPIterations(ts, &linits);
254  MOFEM_LOG_C("EXAMPLE", Sev::inform,
255  "steps %d (%d rejected, %d SNES fails), ftime %g, nonlinits "
256  "%d, linits %d",
257  steps, rejects, snesfails, ftime, nonlinits, linits);
258 
260 }

◆ lhsFlux()

double Example::lhsFlux ( const double  x,
const double  y,
const double   
)
staticprivate
Examples
phase.cpp.

Definition at line 165 of file phase.cpp.

165  {
166  const auto idx = getCoordsInImage(x, y);
167  const auto &m = iI[focalIndex];
168  return 1. / m(idx.first, idx.second);
169 }

◆ OPs() [1/2]

MoFEMErrorCode Example::OPs ( )
private

◆ OPs() [2/2]

MoFEMErrorCode Example::OPs ( )
private

[Boundary condition]

[Push operators to pipeline]

[Only used for dynamics]

[Only used for dynamics]

[Only used for dynamics]

[Only used for dynamics]

Examples
plastic.cpp.

Definition at line 556 of file plastic.cpp.

556  {
558  auto pip_mng = mField.getInterface<PipelineManager>();
559 
560  auto integration_rule_bc = [](int, int, int ao) { return 2 * ao; };
561 
562  auto vol_rule = [](int, int, int ao) { return 2 * ao + geom_order - 1; };
563 
564  auto add_boundary_ops_lhs_mechanical = [&](auto &pip) {
566 
568  "GEOMETRY");
569  pip.push_back(new OpSetHOWeightsOnSubDim<SPACE_DIM>());
570 
571  // Add Natural BCs to LHS
573  pip, mField, "U", Sev::inform);
574 
575 #ifdef ADD_CONTACT
576  auto simple = mField.getInterface<Simple>();
577  CHKERR
578  ContactOps::opFactoryBoundaryLhs<SPACE_DIM, AT, GAUSS, BoundaryEleOp>(
579  pip, "SIGMA", "U");
580  CHKERR
581  ContactOps::opFactoryBoundaryToDomainLhs<SPACE_DIM, AT, IT, DomainEle>(
582  mField, pip, simple->getDomainFEName(), "SIGMA", "U", "GEOMETRY",
583  vol_rule);
584 #endif // ADD_CONTACT
585 
587  };
588 
589  auto add_boundary_ops_rhs_mechanical = [&](auto &pip) {
591 
593  "GEOMETRY");
594  pip.push_back(new OpSetHOWeightsOnSubDim<SPACE_DIM>());
595 
596  // Add Natural BCs to RHS
598  pip, mField, "U", {boost::make_shared<ScaledTimeScale>()}, Sev::inform);
599 
600 #ifdef ADD_CONTACT
601  CHKERR ContactOps::opFactoryBoundaryRhs<SPACE_DIM, AT, IT, BoundaryEleOp>(
602  pip, "SIGMA", "U");
603 #endif // ADD_CONTACT
604 
606  };
607 
608  auto add_domain_ops_lhs = [this](auto &pip) {
611  "GEOMETRY");
612 
613  if (is_quasi_static == PETSC_FALSE) {
614 
615  //! [Only used for dynamics]
618  //! [Only used for dynamics]
619 
620  auto get_inertia_and_mass_damping = [this](const double, const double,
621  const double) {
622  auto *pip = mField.getInterface<PipelineManager>();
623  auto &fe_domain_lhs = pip->getDomainLhsFE();
624  return (rho / scale) * fe_domain_lhs->ts_aa +
625  (alpha_damping / scale) * fe_domain_lhs->ts_a;
626  };
627  pip.push_back(new OpMass("U", "U", get_inertia_and_mass_damping));
628  }
629 
630  CHKERR PlasticOps::opFactoryDomainLhs<SPACE_DIM, AT, IT, DomainEleOp>(
631  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU");
632 
634  };
635 
636  auto add_domain_ops_rhs = [this](auto &pip) {
638 
640  "GEOMETRY");
641 
643  pip, mField, "U",
644  {boost::make_shared<ScaledTimeScale>("body_force_hist.txt")},
645  Sev::inform);
646 
647  // only in case of dynamics
648  if (is_quasi_static == PETSC_FALSE) {
649 
650  //! [Only used for dynamics]
652  AT>::LinearForm<IT>::OpBaseTimesVector<1, SPACE_DIM, 1>;
653  //! [Only used for dynamics]
654 
655  auto mat_acceleration = boost::make_shared<MatrixDouble>();
657  "U", mat_acceleration));
658  pip.push_back(
659  new OpInertiaForce("U", mat_acceleration, [](double, double, double) {
660  return rho / scale;
661  }));
662  if (alpha_damping > 0) {
663  auto mat_velocity = boost::make_shared<MatrixDouble>();
664  pip.push_back(
665  new OpCalculateVectorFieldValuesDot<SPACE_DIM>("U", mat_velocity));
666  pip.push_back(
667  new OpInertiaForce("U", mat_velocity, [](double, double, double) {
668  return alpha_damping / scale;
669  }));
670  }
671  }
672 
673  CHKERR PlasticOps::opFactoryDomainRhs<SPACE_DIM, AT, IT, DomainEleOp>(
674  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU");
675 
676 #ifdef ADD_CONTACT
677  CHKERR ContactOps::opFactoryDomainRhs<SPACE_DIM, AT, IT, DomainEleOp>(
678  pip, "SIGMA", "U");
679 #endif // ADD_CONTACT
680 
682  };
683 
684  CHKERR add_domain_ops_lhs(pip_mng->getOpDomainLhsPipeline());
685  CHKERR add_domain_ops_rhs(pip_mng->getOpDomainRhsPipeline());
686 
687  // Boundary
688  CHKERR add_boundary_ops_lhs_mechanical(pip_mng->getOpBoundaryLhsPipeline());
689  CHKERR add_boundary_ops_rhs_mechanical(pip_mng->getOpBoundaryRhsPipeline());
690 
691  CHKERR pip_mng->setDomainRhsIntegrationRule(vol_rule);
692  CHKERR pip_mng->setDomainLhsIntegrationRule(vol_rule);
693 
694  CHKERR pip_mng->setBoundaryLhsIntegrationRule(integration_rule_bc);
695  CHKERR pip_mng->setBoundaryRhsIntegrationRule(integration_rule_bc);
696 
697  auto create_reaction_pipeline = [&](auto &pip) {
700  "GEOMETRY");
701  CHKERR PlasticOps::opFactoryDomainReactions<SPACE_DIM, AT, IT, DomainEleOp>(
702  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU");
704  };
705 
706  reactionFe = boost::make_shared<DomainEle>(mField);
707  reactionFe->getRuleHook = vol_rule;
708  CHKERR create_reaction_pipeline(reactionFe->getOpPtrVector());
709  reactionFe->postProcessHook =
711 
713 }

◆ outputResults() [1/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [2/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [3/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [4/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [5/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [6/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [7/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [8/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [9/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [10/11]

MoFEMErrorCode Example::outputResults ( )
private

[Solve]

[Getting norms]

[Postprocess results]

[Postprocessing results]

[Postprocess clean]

[Postprocess clean]

[Postprocess initialise]

[Postprocess initialise]

Examples
dynamic_first_order_con_law.cpp, eigen_elastic.cpp, heat_method.cpp, helmholtz.cpp, phase.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 1183 of file dynamic_first_order_con_law.cpp.

1183  {
1185  PetscBool test_flg = PETSC_FALSE;
1186  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-test", &test_flg, PETSC_NULL);
1187  if (test_flg) {
1188  auto *simple = mField.getInterface<Simple>();
1189  auto T = createDMVector(simple->getDM());
1190  CHKERR DMoFEMMeshToLocalVector(simple->getDM(), T, INSERT_VALUES,
1191  SCATTER_FORWARD);
1192  double nrm2;
1193  CHKERR VecNorm(T, NORM_2, &nrm2);
1194  MOFEM_LOG("EXAMPLE", Sev::inform) << "Regression norm " << nrm2;
1195  constexpr double regression_value = 0.0194561;
1196  if (fabs(nrm2 - regression_value) > 1e-2)
1197  SETERRQ(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
1198  "Regression test failed; wrong norm value.");
1199  }
1201 }

◆ outputResults() [11/11]

MoFEMErrorCode Example::outputResults ( const int  i)
private

[Solve]

[Postprocess results]

Definition at line 504 of file phase.cpp.

504  {
507  pipeline_mng->getDomainLhsFE().reset();
508  pipeline_mng->getDomainRhsFE().reset();
509  pipeline_mng->getBoundaryRhsFE().reset();
510 
512 
513  auto post_proc_fe = boost::make_shared<PostProcEle>(mField);
514  auto jac_ptr = boost::make_shared<MatrixDouble>();
515  post_proc_fe->getOpPtrVector().push_back(
516  new OpCalculateHOJacForFace(jac_ptr));
517  post_proc_fe->getOpPtrVector().push_back(new OpMakeHdivFromHcurl());
518  post_proc_fe->getOpPtrVector().push_back(
520 
521  auto s_ptr = boost::make_shared<VectorDouble>();
522  auto phi_ptr = boost::make_shared<MatrixDouble>();
523  post_proc_fe->getOpPtrVector().push_back(
524  new OpCalculateScalarFieldValues("S", s_ptr));
525  post_proc_fe->getOpPtrVector().push_back(
526  new OpCalculateHVecVectorField<3>("PHI", phi_ptr));
527 
529 
530  post_proc_fe->getOpPtrVector().push_back(
531 
532  new OpPPMap(post_proc_fe->getPostProcMesh(),
533  post_proc_fe->getMapGaussPts(),
534 
535  OpPPMap::DataMapVec{{"S", s_ptr}},
536 
537  OpPPMap::DataMapMat{{"PHI", phi_ptr}},
538 
540 
542 
543  )
544 
545  );
546 
547  // post_proc_fe->addFieldValuesPostProc("S");
548  // post_proc_fe->addFieldValuesPostProc("PHI");
549 
550 
551  pipeline_mng->getDomainRhsFE() = post_proc_fe;
552  CHKERR pipeline_mng->loopFiniteElements();
553  CHKERR post_proc_fe->writeFile("out_" + boost::lexical_cast<std::string>(i) +
554  ".h5m");
556 }

◆ postProcess() [1/2]

MoFEMErrorCode Example::postProcess ( )
private

[Integrate]

[Solve]

[Print results]

[Postprocess results]

Definition at line 235 of file integration.cpp.

235  {
237  const double *array;
238  CHKERR VecGetArrayRead(commonDataPtr->petscVec, &array);
239  if (mField.get_comm_rank() == 0) {
240  MOFEM_LOG_C("SELF", Sev::inform, "Mass %6.4e", array[CommonData::ZERO]);
241  MOFEM_LOG_C("SELF", Sev::inform,
242  "First moment of inertia [ %6.4e, %6.4e, %6.4e ]",
244  array[CommonData::FIRST_Z]);
245  MOFEM_LOG_C("SELF", Sev::inform,
246  "Second moment of inertia [ %6.4e, %6.4e, %6.4e; %6.4e %6.4e; "
247  "%6.4e ]",
251  }
252  CHKERR VecRestoreArrayRead(commonDataPtr->petscVec, &array);
254 }

◆ postProcess() [2/2]

MoFEMErrorCode Example::postProcess ( )
private

◆ pushOperators()

MoFEMErrorCode Example::pushOperators ( )
private

[Set density distribution]

[Push operators to pipeline]

Definition at line 188 of file integration.cpp.

188  {
191 
192  // Push an operator which calculates values of density at integration points
193  pipeline_mng->getOpDomainRhsPipeline().push_back(
195  "rho", commonDataPtr->getRhoAtIntegrationPtsPtr()));
196 
197  // Push an operator to pipeline to calculate zero moment of inertia (mass)
198  pipeline_mng->getOpDomainRhsPipeline().push_back(new OpZero(commonDataPtr));
199 
200  // Push an operator to the pipeline to calculate first moment of inertaia
201  pipeline_mng->getOpDomainRhsPipeline().push_back(new OpFirst(commonDataPtr));
202 
203  // Push an operator to the pipeline to calculate second moment of inertaia
204  pipeline_mng->getOpDomainRhsPipeline().push_back(new OpSecond(commonDataPtr));
205 
206  // Set integration rule. Integration rule is equal to the polynomial order of
207  // the density field plus 2, since under the integral of the second moment of
208  // inertia term x*x is present
209  auto integration_rule = [](int, int, int p_data) { return p_data + 2; };
210 
211  // Add integration rule to the element
214 }

◆ readMesh() [1/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [2/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [3/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [4/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [5/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [6/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [7/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [8/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [9/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [10/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [11/11]

MoFEMErrorCode Example::readMesh ( )
private

[Run problem]

[Run programme]

[run problem]

[Read mesh]

Examples
dynamic_first_order_con_law.cpp, eigen_elastic.cpp, heat_method.cpp, helmholtz.cpp, phase.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 463 of file dynamic_first_order_con_law.cpp.

463  {
465  auto simple = mField.getInterface<Simple>();
466 
467  CHKERR simple->getOptions();
468  CHKERR simple->loadFile();
470 }

◆ rhsSource()

double Example::rhsSource ( const double  x,
const double  y,
const double   
)
staticprivate
Examples
phase.cpp.

Definition at line 150 of file phase.cpp.

150  {
151  const auto idx = getCoordsInImage(x, y);
152 
153  double v = 0;
154  for (auto w = 0; w != window_savitzky_golay; ++w) {
155  const auto i = focalIndex - (window_savitzky_golay - 1) / 2 + w;
156  const auto &intensity = iI[i];
157  v += intensity(idx.first, idx.second) * savitzkyGolayWeights[w];
158  }
159  v = static_cast<double>(v) / savitzkyGolayNormalisation;
160 
161  const auto dz = rZ[focalIndex + 1] - rZ[focalIndex - 1];
162  return -k * v / dz;
163 }

◆ runProblem() [1/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [2/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [3/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [4/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [5/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [6/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [7/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [8/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [9/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [10/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [11/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [12/14]

MoFEMErrorCode Example::runProblem ( )

[Run problem]

[Create common data]

[Run programme]

[Operator]

[run problem]

[Run all]

[Run problem]

Examples
dynamic_first_order_con_law.cpp, eigen_elastic.cpp, heat_method.cpp, helmholtz.cpp, phase.cpp, plastic.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 214 of file plastic.cpp.

214  {
218  CHKERR bC();
219  CHKERR OPs();
220  PetscBool test_ops = PETSC_FALSE;
221  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-test_operators", &test_ops,
222  PETSC_NULL);
223  if (test_ops == PETSC_FALSE) {
224  CHKERR tsSolve();
225  } else {
227  }
229 }

◆ runProblem() [13/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [14/14]

MoFEMErrorCode Example::runProblem ( )

◆ setFieldValues()

MoFEMErrorCode Example::setFieldValues ( )
private

[Create common data]

[Set density distribution]

Definition at line 172 of file integration.cpp.

172  {
174  auto set_density = [&](VectorAdaptor &&field_data, double *xcoord,
175  double *ycoord, double *zcoord) {
177  field_data[0] = 1;
179  };
180  FieldBlas *field_blas;
181  CHKERR mField.getInterface(field_blas);
182  CHKERR field_blas->setVertexDofs(set_density, "rho");
184 }

◆ setIntegrationRules() [1/3]

MoFEMErrorCode Example::setIntegrationRules ( )
private

◆ setIntegrationRules() [2/3]

MoFEMErrorCode Example::setIntegrationRules ( )
private

[Set up problem]

[Set integration rule]

Examples
heat_method.cpp, and plot_base.cpp.

Definition at line 229 of file plot_base.cpp.

229  {
232 }

◆ setIntegrationRules() [3/3]

MoFEMErrorCode Example::setIntegrationRules ( )
private

◆ setUp()

MoFEMErrorCode Example::setUp ( )
private

[Run all]

[Set up problem]

Definition at line 137 of file integration.cpp.

137  {
140  CHKERR simple->getOptions();
141  CHKERR simple->loadFile();
142  // Add field
143  CHKERR simple->addDomainField("rho", H1, AINSWORTH_LEGENDRE_BASE, 1);
144  constexpr int order = 1;
145  CHKERR simple->setFieldOrder("rho", order);
146  CHKERR simple->setUp();
148 }

◆ setupProblem() [1/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [2/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [3/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [4/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [5/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [6/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [7/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [8/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [9/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [10/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [11/13]

MoFEMErrorCode Example::setupProblem ( )
private

[Run problem]

[Read mesh]

[Set up problem]

Examples
dynamic_first_order_con_law.cpp, eigen_elastic.cpp, heat_method.cpp, helmholtz.cpp, phase.cpp, plastic.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 233 of file plastic.cpp.

233  {
236 
237  Range domain_ents;
238  CHKERR mField.get_moab().get_entities_by_dimension(0, SPACE_DIM, domain_ents,
239  true);
240  auto get_ents_by_dim = [&](const auto dim) {
241  if (dim == SPACE_DIM) {
242  return domain_ents;
243  } else {
244  Range ents;
245  if (dim == 0)
246  CHKERR mField.get_moab().get_connectivity(domain_ents, ents, true);
247  else
248  CHKERR mField.get_moab().get_entities_by_dimension(0, dim, ents, true);
249  return ents;
250  }
251  };
252 
253  auto get_base = [&]() {
254  auto domain_ents = get_ents_by_dim(SPACE_DIM);
255  if (domain_ents.empty())
256  CHK_THROW_MESSAGE(MOFEM_NOT_FOUND, "Empty mesh");
257  const auto type = type_from_handle(domain_ents[0]);
258  switch (type) {
259  case MBQUAD:
260  return DEMKOWICZ_JACOBI_BASE;
261  case MBHEX:
262  return DEMKOWICZ_JACOBI_BASE;
263  case MBTRI:
265  case MBTET:
267  default:
268  CHK_THROW_MESSAGE(MOFEM_NOT_FOUND, "Element type not handled");
269  }
270  return NOBASE;
271  };
272 
273  const auto base = get_base();
274  MOFEM_LOG("PLASTICITY", Sev::inform)
275  << "Base " << ApproximationBaseNames[base];
276 
277  CHKERR simple->addDomainField("U", H1, base, SPACE_DIM);
278  CHKERR simple->addDomainField("EP", L2, base, size_symm);
279  CHKERR simple->addDomainField("TAU", L2, base, 1);
280  CHKERR simple->addBoundaryField("U", H1, base, SPACE_DIM);
281 
282  CHKERR simple->addDataField("GEOMETRY", H1, base, SPACE_DIM);
283 
284  PetscBool order_edge = PETSC_FALSE;
285  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-order_edge", &order_edge,
286  PETSC_NULL);
287  PetscBool order_face = PETSC_FALSE;
288  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-order_face", &order_face,
289  PETSC_NULL);
290  PetscBool order_volume = PETSC_FALSE;
291  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-order_volume", &order_volume,
292  PETSC_NULL);
293 
294  if (order_edge || order_face || order_volume) {
295 
296  MOFEM_LOG("PLASTICITY", Sev::inform) << "Order edge " << order_edge
297  ? "true"
298  : "false";
299  MOFEM_LOG("PLASTICITY", Sev::inform) << "Order face " << order_face
300  ? "true"
301  : "false";
302  MOFEM_LOG("PLASTICITY", Sev::inform) << "Order volume " << order_volume
303  ? "true"
304  : "false";
305 
306  auto ents = get_ents_by_dim(0);
307  if (order_edge)
308  ents.merge(get_ents_by_dim(1));
309  if (order_face)
310  ents.merge(get_ents_by_dim(2));
311  if (order_volume)
312  ents.merge(get_ents_by_dim(3));
313  CHKERR simple->setFieldOrder("U", order, &ents);
314  } else {
315  CHKERR simple->setFieldOrder("U", order);
316  }
317  CHKERR simple->setFieldOrder("EP", ep_order);
318  CHKERR simple->setFieldOrder("TAU", tau_order);
319 
320  CHKERR simple->setFieldOrder("GEOMETRY", geom_order);
321 
322 #ifdef ADD_CONTACT
323  CHKERR simple->addDomainField("SIGMA", CONTACT_SPACE, DEMKOWICZ_JACOBI_BASE,
324  SPACE_DIM);
325  CHKERR simple->addBoundaryField("SIGMA", CONTACT_SPACE, DEMKOWICZ_JACOBI_BASE,
326  SPACE_DIM);
327 
328  auto get_skin = [&]() {
329  Range body_ents;
330  CHKERR mField.get_moab().get_entities_by_dimension(0, SPACE_DIM, body_ents);
331  Skinner skin(&mField.get_moab());
332  Range skin_ents;
333  CHKERR skin.find_skin(0, body_ents, false, skin_ents);
334  return skin_ents;
335  };
336 
337  auto filter_blocks = [&](auto skin) {
338  bool is_contact_block = true;
339  Range contact_range;
340  for (auto m :
342 
343  (boost::format("%s(.*)") % "CONTACT").str()
344 
345  ))
346 
347  ) {
348  is_contact_block =
349  true; ///< blocs interation is collective, so that is set irrespective
350  ///< if there are entities in given rank or not in the block
351  MOFEM_LOG("CONTACT", Sev::inform)
352  << "Find contact block set: " << m->getName();
353  auto meshset = m->getMeshset();
354  Range contact_meshset_range;
355  CHKERR mField.get_moab().get_entities_by_dimension(
356  meshset, SPACE_DIM - 1, contact_meshset_range, true);
357 
358  CHKERR mField.getInterface<CommInterface>()->synchroniseEntities(
359  contact_meshset_range);
360  contact_range.merge(contact_meshset_range);
361  }
362  if (is_contact_block) {
363  MOFEM_LOG("SYNC", Sev::inform)
364  << "Nb entities in contact surface: " << contact_range.size();
366  skin = intersect(skin, contact_range);
367  }
368  return skin;
369  };
370 
371  auto filter_true_skin = [&](auto skin) {
372  Range boundary_ents;
373  ParallelComm *pcomm =
374  ParallelComm::get_pcomm(&mField.get_moab(), MYPCOMM_INDEX);
375  CHKERR pcomm->filter_pstatus(skin, PSTATUS_SHARED | PSTATUS_MULTISHARED,
376  PSTATUS_NOT, -1, &boundary_ents);
377  return boundary_ents;
378  };
379 
380  auto boundary_ents = filter_true_skin(filter_blocks(get_skin()));
381  CHKERR simple->setFieldOrder("SIGMA", 0);
382  CHKERR simple->setFieldOrder("SIGMA", order - 1, &boundary_ents);
383 #endif
384 
385  CHKERR simple->setUp();
386  CHKERR simple->addFieldToEmptyFieldBlocks("U", "TAU");
387 
388  auto project_ho_geometry = [&]() {
389  Projection10NodeCoordsOnField ent_method(mField, "GEOMETRY");
390  return mField.loop_dofs("GEOMETRY", ent_method);
391  };
392  PetscBool project_geometry = PETSC_TRUE;
393  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-project_geometry",
394  &project_geometry, PETSC_NULL);
395  if (project_geometry) {
396  CHKERR project_ho_geometry();
397  }
398 
400 }

◆ setupProblem() [12/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [13/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ solveSystem() [1/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [2/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [3/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [4/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [5/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [6/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [7/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [8/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [9/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [10/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [11/11]

MoFEMErrorCode Example::solveSystem ( )
private

[Solve]

[Push operators to pipeline]

[Solve]

< Mass matrix

< Linear solver

Examples
dynamic_first_order_con_law.cpp, eigen_elastic.cpp, heat_method.cpp, helmholtz.cpp, phase.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 893 of file dynamic_first_order_con_law.cpp.

893  {
895  auto *simple = mField.getInterface<Simple>();
896  auto *pipeline_mng = mField.getInterface<PipelineManager>();
897 
898  auto dm = simple->getDM();
899 
900  auto calculate_stress_ops = [&](auto &pip) {
902 
903  auto v_ptr = boost::make_shared<MatrixDouble>();
904  pip.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("V", v_ptr));
905  auto X_ptr = boost::make_shared<MatrixDouble>();
906  pip.push_back(
907  new OpCalculateVectorFieldValues<SPACE_DIM>("GEOMETRY", X_ptr));
908 
909  auto x_ptr = boost::make_shared<MatrixDouble>();
910  pip.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("x_1", x_ptr));
911 
912  // Calculate unknown F
913  auto mat_H_tensor_ptr = boost::make_shared<MatrixDouble>();
915  "F", mat_H_tensor_ptr));
916 
917  auto u_ptr = boost::make_shared<MatrixDouble>();
918  pip.push_back(new OpCalculateDisplacement<SPACE_DIM>(x_ptr, X_ptr, u_ptr));
919  // Calculate P
920 
921  auto mat_F_ptr = boost::make_shared<MatrixDouble>();
923  mat_F_ptr, mat_H_tensor_ptr));
924 
925  PetscBool is_linear_elasticity = PETSC_TRUE;
926  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-is_linear_elasticity",
927  &is_linear_elasticity, PETSC_NULL);
928 
929  auto mat_P_ptr = boost::make_shared<MatrixDouble>();
930  if (is_linear_elasticity) {
931  pip.push_back(new OpCalculatePiola<SPACE_DIM, SPACE_DIM>(
933  mat_F_ptr));
934  } else {
935  auto inv_F = boost::make_shared<MatrixDouble>();
936  auto det_ptr = boost::make_shared<VectorDouble>();
937 
938  pip.push_back(new OpInvertMatrix<SPACE_DIM>(mat_F_ptr, det_ptr, inv_F));
939 
942  mat_F_ptr, inv_F, det_ptr));
943  }
944 
945  auto mat_v_grad_ptr = boost::make_shared<MatrixDouble>();
947  "V", mat_v_grad_ptr));
948 
949  return boost::make_tuple(v_ptr, X_ptr, x_ptr, mat_P_ptr, mat_F_ptr, u_ptr);
950  };
951 
952  auto post_proc_boundary = [&]() {
953  auto boundary_post_proc_fe = boost::make_shared<PostProcFaceEle>(mField);
954 
956  boundary_post_proc_fe->getOpPtrVector(), {}, "GEOMETRY");
957  auto op_loop_side =
958  new OpLoopSide<SideEle>(mField, simple->getDomainFEName(), SPACE_DIM);
959  // push ops to side element, through op_loop_side operator
960  auto [boundary_v_ptr, boundary_X_ptr, boundary_x_ptr, boundary_mat_P_ptr,
961  boundary_mat_F_ptr, boundary_u_ptr] =
962  calculate_stress_ops(op_loop_side->getOpPtrVector());
963  boundary_post_proc_fe->getOpPtrVector().push_back(op_loop_side);
964 
966 
967  boundary_post_proc_fe->getOpPtrVector().push_back(
968 
969  new OpPPMap(
970 
971  boundary_post_proc_fe->getPostProcMesh(),
972  boundary_post_proc_fe->getMapGaussPts(),
973 
975 
976  OpPPMap::DataMapMat{{"V", boundary_v_ptr},
977  {"GEOMETRY", boundary_X_ptr},
978  {"x", boundary_x_ptr},
979  {"U", boundary_u_ptr}},
980 
981  OpPPMap::DataMapMat{{"FIRST_PIOLA", boundary_mat_P_ptr},
982  {"F", boundary_mat_F_ptr}},
983 
985 
986  )
987 
988  );
989  return boundary_post_proc_fe;
990  };
991 
992  // Add monitor to time solver
993 
994  double rho = 1.;
995  CHKERR PetscOptionsGetReal(PETSC_NULL, "", "-density", &rho, PETSC_NULL);
996  auto get_rho = [rho](const double, const double, const double) {
997  return rho;
998  };
999 
1000  SmartPetscObj<Mat> M; ///< Mass matrix
1001  SmartPetscObj<KSP> ksp; ///< Linear solver
1002 
1003  auto ts_pre_post_proc = boost::make_shared<TSPrePostProc>();
1004  tsPrePostProc = ts_pre_post_proc;
1005 
1007  CHKERR MatZeroEntries(M);
1008 
1009  boost::shared_ptr<DomainEle> vol_mass_ele(new DomainEle(mField));
1010 
1011  vol_mass_ele->B = M;
1012 
1013  auto integration_rule = [](int, int, int approx_order) {
1014  return 2 * approx_order;
1015  };
1016 
1017  vol_mass_ele->getRuleHook = integration_rule;
1018 
1019  vol_mass_ele->getOpPtrVector().push_back(new OpMassV("V", "V", get_rho));
1020  vol_mass_ele->getOpPtrVector().push_back(new OpMassF("F", "F"));
1021 
1022  CHKERR DMoFEMLoopFiniteElements(dm, simple->getDomainFEName(), vol_mass_ele);
1023  CHKERR MatAssemblyBegin(M, MAT_FINAL_ASSEMBLY);
1024  CHKERR MatAssemblyEnd(M, MAT_FINAL_ASSEMBLY);
1025 
1026  auto lumpVec = createDMVector(simple->getDM());
1027  CHKERR MatGetRowSum(M, lumpVec);
1028 
1029  CHKERR MatZeroEntries(M);
1030  CHKERR MatDiagonalSet(M, lumpVec, INSERT_VALUES);
1031 
1032  // Create and septup KSP (linear solver), we need this to calculate g(t,u) =
1033  // M^-1G(t,u)
1034  ksp = createKSP(mField.get_comm());
1035  CHKERR KSPSetOperators(ksp, M, M);
1036  CHKERR KSPSetFromOptions(ksp);
1037  CHKERR KSPSetUp(ksp);
1038 
1039  auto solve_boundary_for_g = [&]() {
1041  if (*(pipeline_mng->getBoundaryExplicitRhsFE()->vecAssembleSwitch)) {
1042 
1043  CHKERR VecGhostUpdateBegin(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F,
1044  ADD_VALUES, SCATTER_REVERSE);
1045  CHKERR VecGhostUpdateEnd(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F,
1046  ADD_VALUES, SCATTER_REVERSE);
1047  CHKERR VecAssemblyBegin(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F);
1048  CHKERR VecAssemblyEnd(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F);
1049  *(pipeline_mng->getBoundaryExplicitRhsFE()->vecAssembleSwitch) = false;
1050 
1051  auto D =
1052  smartVectorDuplicate(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F);
1053  CHKERR KSPSolve(ksp, pipeline_mng->getBoundaryExplicitRhsFE()->ts_F, D);
1054  CHKERR VecGhostUpdateBegin(D, INSERT_VALUES, SCATTER_FORWARD);
1055  CHKERR VecGhostUpdateEnd(D, INSERT_VALUES, SCATTER_FORWARD);
1056  CHKERR VecCopy(D, pipeline_mng->getBoundaryExplicitRhsFE()->ts_F);
1057  }
1058 
1060  };
1061 
1062  pipeline_mng->getBoundaryExplicitRhsFE()->postProcessHook =
1063  solve_boundary_for_g;
1064 
1066  ts = pipeline_mng->createTSEX(dm);
1067 
1068  // Field eval
1069  PetscBool field_eval_flag = PETSC_TRUE;
1070  boost::shared_ptr<MatrixDouble> velocity_field_ptr;
1071  boost::shared_ptr<MatrixDouble> geometry_field_ptr;
1072  boost::shared_ptr<MatrixDouble> spatial_position_field_ptr;
1073  boost::shared_ptr<SetPtsData> field_eval_data;
1074 
1075  std::array<double, 3> field_eval_coords = {0.5, 0.5, 5.};
1076  int dim = 3;
1077  CHKERR PetscOptionsGetRealArray(NULL, NULL, "-field_eval_coords",
1078  field_eval_coords.data(), &dim,
1079  &field_eval_flag);
1080 
1081  if (field_eval_flag) {
1082  field_eval_data =
1083  mField.getInterface<FieldEvaluatorInterface>()->getData<DomainEle>();
1084  if (SPACE_DIM == 3) {
1086  field_eval_data, simple->getDomainFEName());
1087  } else {
1089  field_eval_data, simple->getDomainFEName());
1090  }
1091 
1092  field_eval_data->setEvalPoints(field_eval_coords.data(), 1);
1093 
1094  auto no_rule = [](int, int, int) { return -1; };
1095 
1096  auto fe_ptr = field_eval_data->feMethodPtr.lock();
1097  fe_ptr->getRuleHook = no_rule;
1098  velocity_field_ptr = boost::make_shared<MatrixDouble>();
1099  geometry_field_ptr = boost::make_shared<MatrixDouble>();
1100  spatial_position_field_ptr = boost::make_shared<MatrixDouble>();
1101  fe_ptr->getOpPtrVector().push_back(
1102  new OpCalculateVectorFieldValues<SPACE_DIM>("V", velocity_field_ptr));
1103  fe_ptr->getOpPtrVector().push_back(
1105  geometry_field_ptr));
1106  fe_ptr->getOpPtrVector().push_back(
1108  "x_2", spatial_position_field_ptr));
1109  }
1110 
1111  auto post_proc_domain = [&]() {
1112  auto post_proc_fe_vol = boost::make_shared<PostProcEle>(mField);
1113 
1115 
1116  auto [boundary_v_ptr, boundary_X_ptr, boundary_x_ptr, boundary_mat_P_ptr,
1117  boundary_mat_F_ptr, boundary_u_ptr] =
1118  calculate_stress_ops(post_proc_fe_vol->getOpPtrVector());
1119 
1120  post_proc_fe_vol->getOpPtrVector().push_back(
1121 
1122  new OpPPMap(
1123 
1124  post_proc_fe_vol->getPostProcMesh(),
1125  post_proc_fe_vol->getMapGaussPts(),
1126 
1127  {},
1128 
1129  {{"V", boundary_v_ptr},
1130  {"GEOMETRY", boundary_X_ptr},
1131  {"x", boundary_x_ptr},
1132  {"U", boundary_u_ptr}},
1133 
1134  {{"FIRST_PIOLA", boundary_mat_P_ptr}, {"F", boundary_mat_F_ptr}},
1135 
1136  {}
1137 
1138  )
1139 
1140  );
1141  return post_proc_fe_vol;
1142  };
1143 
1144  boost::shared_ptr<FEMethod> null_fe;
1145  auto monitor_ptr = boost::make_shared<Monitor>(
1146  SmartPetscObj<DM>(dm, true), mField, post_proc_domain(),
1147  post_proc_boundary(), velocity_field_ptr, spatial_position_field_ptr,
1148  geometry_field_ptr, field_eval_coords, field_eval_data);
1149 
1150  CHKERR DMMoFEMTSSetMonitor(dm, ts, simple->getDomainFEName(), null_fe,
1151  null_fe, monitor_ptr);
1152 
1153  double ftime = 1;
1154  // CHKERR TSSetMaxTime(ts, ftime);
1155  CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP);
1156 
1157  auto T = createDMVector(simple->getDM());
1158  CHKERR DMoFEMMeshToLocalVector(simple->getDM(), T, INSERT_VALUES,
1159  SCATTER_FORWARD);
1160  CHKERR TSSetSolution(ts, T);
1161  CHKERR TSSetFromOptions(ts);
1162 
1163  auto fb = mField.getInterface<FieldBlas>();
1164 
1165  CHKERR TSSetPostStage(ts, TSPrePostProc::tsPostStage);
1166  CHKERR TSSetPostStep(ts, TSPrePostProc::tsPostStep);
1167  CHKERR TSSetPreStep(ts, TSPrePostProc::tsPreStep);
1168 
1169  boost::shared_ptr<ForcesAndSourcesCore> null;
1170 
1171  if (auto ptr = tsPrePostProc.lock()) {
1172  ptr->fsRawPtr = this;
1173  CHKERR TSSetUp(ts);
1174  CHKERR TSSolve(ts, NULL);
1175  CHKERR TSGetTime(ts, &ftime);
1176  }
1177 
1179 }

◆ testOperators()

MoFEMErrorCode Example::testOperators ( )
private

[Solve]

[TestOperators]

Examples
plastic.cpp.

Definition at line 1214 of file plastic.cpp.

1214  {
1216 
1217  // get operators tester
1218  auto simple = mField.getInterface<Simple>();
1219  auto opt = mField.getInterface<OperatorsTester>(); // get interface to
1220  // OperatorsTester
1221  auto pip = mField.getInterface<PipelineManager>(); // get interface to
1222  // pipeline manager
1223 
1224  constexpr double eps = 1e-9;
1225 
1226  auto x = opt->setRandomFields(simple->getDM(), {
1227 
1228  {"U", {-1e-6, 1e-6}},
1229 
1230  {"EP", {-1e-6, 1e-6}},
1231 
1232  {"TAU", {0, 1e-4}}
1233 
1234  });
1235 
1236  auto dot_x_plastic_active =
1237  opt->setRandomFields(simple->getDM(), {
1238 
1239  {"U", {-1, 1}},
1240 
1241  {"EP", {-1, 1}},
1242 
1243  {"TAU", {0.1, 1}}
1244 
1245  });
1246  auto diff_x_plastic_active =
1247  opt->setRandomFields(simple->getDM(), {
1248 
1249  {"U", {-1, 1}},
1250 
1251  {"EP", {-1, 1}},
1252 
1253  {"TAU", {-1, 1}}
1254 
1255  });
1256 
1257  auto dot_x_elastic =
1258  opt->setRandomFields(simple->getDM(), {
1259 
1260  {"U", {-1, 1}},
1261 
1262  {"EP", {-1, 1}},
1263 
1264  {"TAU", {-1, -0.1}}
1265 
1266  });
1267  auto diff_x_elastic =
1268  opt->setRandomFields(simple->getDM(), {
1269 
1270  {"U", {-1, 1}},
1271 
1272  {"EP", {-1, 1}},
1273 
1274  {"TAU", {-1, 1}}
1275 
1276  });
1277 
1278  auto test_domain_ops = [&](auto fe_name, auto lhs_pipeline, auto rhs_pipeline,
1279  auto dot_x, auto diff_x) {
1281 
1282  auto diff_res = opt->checkCentralFiniteDifference(
1283  simple->getDM(), fe_name, rhs_pipeline, lhs_pipeline, x, dot_x,
1284  SmartPetscObj<Vec>(), diff_x, 0, 0.5, eps);
1285 
1286  // Calculate norm of difference between directional derivative calculated
1287  // from finite difference, and tangent matrix.
1288  double fnorm;
1289  CHKERR VecNorm(diff_res, NORM_2, &fnorm);
1290  MOFEM_LOG_C("PLASTICITY", Sev::inform,
1291  "Test consistency of tangent matrix %3.4e", fnorm);
1292 
1293  constexpr double err = 1e-5;
1294  if (fnorm > err)
1295  SETERRQ1(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
1296  "Norm of directional derivative too large err = %3.4e", fnorm);
1297 
1299  };
1300 
1301  MOFEM_LOG("PLASTICITY", Sev::inform) << "Elastic active";
1302  CHKERR test_domain_ops(simple->getDomainFEName(), pip->getDomainLhsFE(),
1303  pip->getDomainRhsFE(), dot_x_elastic, diff_x_elastic);
1304 
1305  MOFEM_LOG("PLASTICITY", Sev::inform) << "Plastic active";
1306  CHKERR test_domain_ops(simple->getDomainFEName(), pip->getDomainLhsFE(),
1307  pip->getDomainRhsFE(), dot_x_plastic_active,
1308  diff_x_plastic_active);
1309 
1310 
1311 
1313 };

◆ tsSolve()

MoFEMErrorCode Example::tsSolve ( )
private
Examples
plastic.cpp.

Definition at line 740 of file plastic.cpp.

740  {
742 
745  ISManager *is_manager = mField.getInterface<ISManager>();
746 
747  auto snes_ctx_ptr = getDMSnesCtx(simple->getDM());
748 
749  auto set_section_monitor = [&](auto solver) {
751  SNES snes;
752  CHKERR TSGetSNES(solver, &snes);
753  CHKERR SNESMonitorSet(snes,
754  (MoFEMErrorCode(*)(SNES, PetscInt, PetscReal,
755  void *))MoFEMSNESMonitorFields,
756  (void *)(snes_ctx_ptr.get()), nullptr);
758  };
759 
760  auto create_post_process_elements = [&]() {
761  auto pp_fe = boost::make_shared<PostProcEle>(mField);
762 
763  auto push_vol_ops = [this](auto &pip) {
765  "GEOMETRY");
766 
767  auto [common_plastic_ptr, common_hencky_ptr] =
768  PlasticOps::createCommonPlasticOps<SPACE_DIM, IT, DomainEleOp>(
769  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU", 1., Sev::inform);
770 
771  if (common_hencky_ptr) {
772  if (common_plastic_ptr->mGradPtr != common_hencky_ptr->matGradPtr)
773  CHK_THROW_MESSAGE(MOFEM_DATA_INCONSISTENCY, "Wrong pointer for grad");
774  }
775 
776  return std::make_pair(common_plastic_ptr, common_hencky_ptr);
777  };
778 
779  auto push_vol_post_proc_ops = [this](auto &pp_fe, auto &&p) {
781 
782  auto &pip = pp_fe->getOpPtrVector();
783 
784  auto [common_plastic_ptr, common_hencky_ptr] = p;
785 
787 
788  auto x_ptr = boost::make_shared<MatrixDouble>();
789  pip.push_back(
790  new OpCalculateVectorFieldValues<SPACE_DIM>("GEOMETRY", x_ptr));
791  auto u_ptr = boost::make_shared<MatrixDouble>();
792  pip.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
793 
794  if (is_large_strains) {
795 
796  pip.push_back(
797 
798  new OpPPMap(
799 
800  pp_fe->getPostProcMesh(), pp_fe->getMapGaussPts(),
801 
802  {{"PLASTIC_SURFACE",
803  common_plastic_ptr->getPlasticSurfacePtr()},
804  {"PLASTIC_MULTIPLIER",
805  common_plastic_ptr->getPlasticTauPtr()}},
806 
807  {{"U", u_ptr}, {"GEOMETRY", x_ptr}},
808 
809  {{"GRAD", common_hencky_ptr->matGradPtr},
810  {"FIRST_PIOLA", common_hencky_ptr->getMatFirstPiolaStress()}},
811 
812  {{"PLASTIC_STRAIN", common_plastic_ptr->getPlasticStrainPtr()},
813  {"PLASTIC_FLOW", common_plastic_ptr->getPlasticFlowPtr()}}
814 
815  )
816 
817  );
818 
819  } else {
820 
821  pip.push_back(
822 
823  new OpPPMap(
824 
825  pp_fe->getPostProcMesh(), pp_fe->getMapGaussPts(),
826 
827  {{"PLASTIC_SURFACE",
828  common_plastic_ptr->getPlasticSurfacePtr()},
829  {"PLASTIC_MULTIPLIER",
830  common_plastic_ptr->getPlasticTauPtr()}},
831 
832  {{"U", u_ptr}, {"GEOMETRY", x_ptr}},
833 
834  {},
835 
836  {{"STRAIN", common_plastic_ptr->mStrainPtr},
837  {"STRESS", common_plastic_ptr->mStressPtr},
838  {"PLASTIC_STRAIN", common_plastic_ptr->getPlasticStrainPtr()},
839  {"PLASTIC_FLOW", common_plastic_ptr->getPlasticFlowPtr()}}
840 
841  )
842 
843  );
844  }
845 
847  };
848 
849  auto vol_post_proc = [this, push_vol_post_proc_ops, push_vol_ops]() {
850  PetscBool post_proc_vol = PETSC_FALSE;
851  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-post_proc_vol",
852  &post_proc_vol, PETSC_NULL);
853  if (post_proc_vol == PETSC_FALSE)
854  return boost::shared_ptr<PostProcEle>();
855  auto pp_fe = boost::make_shared<PostProcEle>(mField);
857  push_vol_post_proc_ops(pp_fe, push_vol_ops(pp_fe->getOpPtrVector())),
858  "push_vol_post_proc_ops");
859  return pp_fe;
860  };
861 
862  auto skin_post_proc = [this, push_vol_post_proc_ops, push_vol_ops]() {
863  PetscBool post_proc_skin = PETSC_TRUE;
864  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-post_proc_skin",
865  &post_proc_skin, PETSC_NULL);
866  if (post_proc_skin == PETSC_FALSE)
867  return boost::shared_ptr<SkinPostProcEle>();
868 
869  auto simple = mField.getInterface<Simple>();
870  auto pp_fe = boost::make_shared<SkinPostProcEle>(mField);
871  auto op_side = new OpLoopSide<SideEle>(mField, simple->getDomainFEName(),
872  SPACE_DIM, Sev::verbose);
873  pp_fe->getOpPtrVector().push_back(op_side);
874  CHK_MOAB_THROW(push_vol_post_proc_ops(
875  pp_fe, push_vol_ops(op_side->getOpPtrVector())),
876  "push_vol_post_proc_ops");
877  return pp_fe;
878  };
879 
880  return std::make_pair(vol_post_proc(), skin_post_proc());
881  };
882 
883  auto scatter_create = [&](auto D, auto coeff) {
885  CHKERR is_manager->isCreateProblemFieldAndRank(simple->getProblemName(),
886  ROW, "U", coeff, coeff, is);
887  int loc_size;
888  CHKERR ISGetLocalSize(is, &loc_size);
889  Vec v;
890  CHKERR VecCreateMPI(mField.get_comm(), loc_size, PETSC_DETERMINE, &v);
891  VecScatter scatter;
892  CHKERR VecScatterCreate(D, is, v, PETSC_NULL, &scatter);
893  return std::make_tuple(SmartPetscObj<Vec>(v),
894  SmartPetscObj<VecScatter>(scatter));
895  };
896 
897  auto set_time_monitor = [&](auto dm, auto solver) {
899  boost::shared_ptr<Monitor> monitor_ptr(
900  new Monitor(dm, create_post_process_elements(), reactionFe, uXScatter,
901  uYScatter, uZScatter));
902  boost::shared_ptr<ForcesAndSourcesCore> null;
903  CHKERR DMMoFEMTSSetMonitor(dm, solver, simple->getDomainFEName(),
904  monitor_ptr, null, null);
906  };
907 
908  auto set_schur_pc = [&](auto solver,
909  boost::shared_ptr<SetUpSchur> &schur_ptr) {
911 
912  auto name_prb = simple->getProblemName();
913 
914  // create sub dm for Schur complement
915  auto create_schur_dm = [&](SmartPetscObj<DM> base_dm,
916  SmartPetscObj<DM> &dm_sub) {
918  dm_sub = createDM(mField.get_comm(), "DMMOFEM");
919  CHKERR DMMoFEMCreateSubDM(dm_sub, base_dm, "SCHUR");
920  CHKERR DMMoFEMSetSquareProblem(dm_sub, PETSC_TRUE);
921  CHKERR DMMoFEMAddElement(dm_sub, simple->getDomainFEName());
922  CHKERR DMMoFEMAddElement(dm_sub, simple->getBoundaryFEName());
923  for (auto f : {"U"}) {
924  CHKERR DMMoFEMAddSubFieldRow(dm_sub, f);
925  CHKERR DMMoFEMAddSubFieldCol(dm_sub, f);
926  }
927  CHKERR DMSetUp(dm_sub);
928 
930  };
931 
932  auto create_block_dm = [&](SmartPetscObj<DM> base_dm,
933  SmartPetscObj<DM> &dm_sub) {
935  dm_sub = createDM(mField.get_comm(), "DMMOFEM");
936  CHKERR DMMoFEMCreateSubDM(dm_sub, base_dm, "BLOCK");
937  CHKERR DMMoFEMSetSquareProblem(dm_sub, PETSC_TRUE);
938  CHKERR DMMoFEMAddElement(dm_sub, simple->getDomainFEName());
939  CHKERR DMMoFEMAddElement(dm_sub, simple->getBoundaryFEName());
940 #ifdef ADD_CONTACT
941  for (auto f : {"SIGMA", "EP", "TAU"}) {
942  CHKERR DMMoFEMAddSubFieldRow(dm_sub, f);
943  CHKERR DMMoFEMAddSubFieldCol(dm_sub, f);
944  }
945 #else
946  for (auto f : {"EP", "TAU"}) {
947  CHKERR DMMoFEMAddSubFieldRow(dm_sub, f);
948  CHKERR DMMoFEMAddSubFieldCol(dm_sub, f);
949  }
950 #endif
951  CHKERR DMSetUp(dm_sub);
953  };
954 
955  // Create nested (sub BC) Schur DM
956  if constexpr (AT == AssemblyType::BLOCK_SCHUR) {
957 
958  SmartPetscObj<DM> dm_schur;
959  CHKERR create_schur_dm(simple->getDM(), dm_schur);
960  SmartPetscObj<DM> dm_block;
961  CHKERR create_block_dm(simple->getDM(), dm_block);
962 
963 #ifdef ADD_CONTACT
964 
965  auto get_nested_mat_data = [&](auto schur_dm, auto block_dm) {
966  auto block_mat_data = createBlockMatStructure(
967  simple->getDM(),
968 
969  {
970 
971  {simple->getDomainFEName(),
972 
973  {{"U", "U"},
974  {"SIGMA", "SIGMA"},
975  {"U", "SIGMA"},
976  {"SIGMA", "U"},
977  {"EP", "EP"},
978  {"TAU", "TAU"},
979  {"U", "EP"},
980  {"EP", "U"},
981  {"EP", "TAU"},
982  {"TAU", "EP"},
983  {"TAU", "U"}
984 
985  }},
986 
987  {simple->getBoundaryFEName(),
988 
989  {{"SIGMA", "SIGMA"}, {"U", "SIGMA"}, {"SIGMA", "U"}
990 
991  }}
992 
993  }
994 
995  );
996 
998 
999  {dm_schur, dm_block}, block_mat_data,
1000 
1001  {"SIGMA", "EP", "TAU"}, {nullptr, nullptr, nullptr}, true
1002 
1003  );
1004  };
1005 
1006 #else
1007 
1008  auto get_nested_mat_data = [&](auto schur_dm, auto block_dm) {
1009  auto block_mat_data =
1011 
1012  {{simple->getDomainFEName(),
1013 
1014  {{"U", "U"},
1015  {"EP", "EP"},
1016  {"TAU", "TAU"},
1017  {"U", "EP"},
1018  {"EP", "U"},
1019  {"EP", "TAU"},
1020  {"TAU", "U"},
1021  {"TAU", "EP"}
1022 
1023  }}}
1024 
1025  );
1026 
1028 
1029  {dm_schur, dm_block}, block_mat_data,
1030 
1031  {"EP", "TAU"}, {nullptr, nullptr}, false
1032 
1033  );
1034  };
1035 
1036 #endif
1037 
1038  auto nested_mat_data = get_nested_mat_data(dm_schur, dm_block);
1039  CHKERR DMMoFEMSetNestSchurData(simple->getDM(), nested_mat_data);
1040 
1041  auto block_is = getDMSubData(dm_block)->getSmartRowIs();
1042  auto ao_schur = getDMSubData(dm_schur)->getSmartRowMap();
1043 
1044  // Indices has to be map fro very to level, while assembling Schur
1045  // complement.
1046  schur_ptr =
1047  SetUpSchur::createSetUpSchur(mField, dm_schur, block_is, ao_schur);
1048  CHKERR schur_ptr->setUp(solver);
1049  }
1050 
1052  };
1053 
1054  auto dm = simple->getDM();
1055  auto D = createDMVector(dm);
1056  auto DD = vectorDuplicate(D);
1057  uXScatter = scatter_create(D, 0);
1058  uYScatter = scatter_create(D, 1);
1059  if constexpr (SPACE_DIM == 3)
1060  uZScatter = scatter_create(D, 2);
1061 
1062  auto create_solver = [pip_mng]() {
1063  if (is_quasi_static == PETSC_TRUE)
1064  return pip_mng->createTSIM();
1065  else
1066  return pip_mng->createTSIM2();
1067  };
1068 
1069  auto solver = create_solver();
1070 
1071  auto active_pre_lhs = []() {
1073  std::fill(PlasticOps::CommonData::activityData.begin(),
1076  };
1077 
1078  auto active_post_lhs = [&]() {
1080  auto get_iter = [&]() {
1081  SNES snes;
1082  CHK_THROW_MESSAGE(TSGetSNES(solver, &snes), "Can not get SNES");
1083  int iter;
1084  CHK_THROW_MESSAGE(SNESGetIterationNumber(snes, &iter),
1085  "Can not get iter");
1086  return iter;
1087  };
1088 
1089  auto iter = get_iter();
1090  if (iter >= 0) {
1091 
1092  std::array<int, 5> activity_data;
1093  std::fill(activity_data.begin(), activity_data.end(), 0);
1094  MPI_Allreduce(PlasticOps::CommonData::activityData.data(),
1095  activity_data.data(), activity_data.size(), MPI_INT,
1096  MPI_SUM, mField.get_comm());
1097 
1098  int &active_points = activity_data[0];
1099  int &avtive_full_elems = activity_data[1];
1100  int &avtive_elems = activity_data[2];
1101  int &nb_points = activity_data[3];
1102  int &nb_elements = activity_data[4];
1103 
1104  if (nb_points) {
1105 
1106  double proc_nb_points =
1107  100 * static_cast<double>(active_points) / nb_points;
1108  double proc_nb_active =
1109  100 * static_cast<double>(avtive_elems) / nb_elements;
1110  double proc_nb_full_active = 100;
1111  if (avtive_elems)
1112  proc_nb_full_active =
1113  100 * static_cast<double>(avtive_full_elems) / avtive_elems;
1114 
1115  MOFEM_LOG_C("PLASTICITY", Sev::inform,
1116  "Iter %d nb pts %d nb active pts %d (%3.3f\%) nb active "
1117  "elements %d "
1118  "(%3.3f\%) nb full active elems %d (%3.3f\%)",
1119  iter, nb_points, active_points, proc_nb_points,
1120  avtive_elems, proc_nb_active, avtive_full_elems,
1121  proc_nb_full_active, iter);
1122  }
1123  }
1124 
1126  };
1127 
1128  auto add_active_dofs_elem = [&](auto dm) {
1130  auto fe_pre_proc = boost::make_shared<FEMethod>();
1131  fe_pre_proc->preProcessHook = active_pre_lhs;
1132  auto fe_post_proc = boost::make_shared<FEMethod>();
1133  fe_post_proc->postProcessHook = active_post_lhs;
1134  auto ts_ctx_ptr = getDMTsCtx(dm);
1135  ts_ctx_ptr->getPreProcessIJacobian().push_front(fe_pre_proc);
1136  ts_ctx_ptr->getPostProcessIJacobian().push_back(fe_post_proc);
1138  };
1139 
1140  auto set_essential_bc = [&](auto dm, auto solver) {
1142  // This is low level pushing finite elements (pipelines) to solver
1143 
1144  auto pre_proc_ptr = boost::make_shared<FEMethod>();
1145  auto post_proc_rhs_ptr = boost::make_shared<FEMethod>();
1146  auto post_proc_lhs_ptr = boost::make_shared<FEMethod>();
1147 
1148  // Add boundary condition scaling
1149  auto disp_time_scale = boost::make_shared<TimeScale>();
1150 
1151  auto get_bc_hook_rhs = [this, pre_proc_ptr, disp_time_scale]() {
1153  {disp_time_scale}, false);
1154  return hook;
1155  };
1156  pre_proc_ptr->preProcessHook = get_bc_hook_rhs();
1157 
1158  auto get_post_proc_hook_rhs = [this, post_proc_rhs_ptr]() {
1161  mField, post_proc_rhs_ptr, nullptr, Sev::verbose)();
1163  mField, post_proc_rhs_ptr, 1.)();
1165  };
1166  auto get_post_proc_hook_lhs = [this, post_proc_lhs_ptr]() {
1168  mField, post_proc_lhs_ptr, 1.);
1169  };
1170  post_proc_rhs_ptr->postProcessHook = get_post_proc_hook_rhs;
1171 
1172  auto ts_ctx_ptr = getDMTsCtx(dm);
1173  ts_ctx_ptr->getPreProcessIFunction().push_front(pre_proc_ptr);
1174  ts_ctx_ptr->getPreProcessIJacobian().push_front(pre_proc_ptr);
1175  ts_ctx_ptr->getPostProcessIFunction().push_back(post_proc_rhs_ptr);
1176  post_proc_lhs_ptr->postProcessHook = get_post_proc_hook_lhs();
1177  ts_ctx_ptr->getPostProcessIJacobian().push_back(post_proc_lhs_ptr);
1178 
1180  };
1181 
1182  if (is_quasi_static == PETSC_TRUE) {
1183  CHKERR TSSetSolution(solver, D);
1184  } else {
1185  CHKERR TS2SetSolution(solver, D, DD);
1186  }
1187 
1188  CHKERR set_section_monitor(solver);
1189  CHKERR set_time_monitor(dm, solver);
1190  CHKERR TSSetFromOptions(solver);
1191  CHKERR TSSetUp(solver);
1192 
1193  CHKERR add_active_dofs_elem(dm);
1194  boost::shared_ptr<SetUpSchur> schur_ptr;
1195  CHKERR set_schur_pc(solver, schur_ptr);
1196  CHKERR set_essential_bc(dm, solver);
1197 
1198  MOFEM_LOG_CHANNEL("TIMER");
1199  MOFEM_LOG_TAG("TIMER", "timer");
1200  if (set_timer)
1201  BOOST_LOG_SCOPED_THREAD_ATTR("Timeline", attrs::timer());
1202  MOFEM_LOG("TIMER", Sev::verbose) << "TSSetUp";
1203  CHKERR TSSetUp(solver);
1204  MOFEM_LOG("TIMER", Sev::verbose) << "TSSetUp <= done";
1205  MOFEM_LOG("TIMER", Sev::verbose) << "TSSolve";
1206  CHKERR TSSolve(solver, NULL);
1207  MOFEM_LOG("TIMER", Sev::verbose) << "TSSolve <= done";
1208 
1210 }

Friends And Related Function Documentation

◆ TSPrePostProc

friend struct TSPrePostProc
friend

Definition at line 435 of file dynamic_first_order_con_law.cpp.

Member Data Documentation

◆ approxFunction

ApproxFieldFunction< FIELD_DIM > Example::approxFunction
staticprivate
Initial value:

Definition at line 61 of file approximaton.cpp.

◆ approxGradVals

boost::shared_ptr<MatrixDouble> Example::approxGradVals
private

Definition at line 63 of file radiation.cpp.

◆ approxVals

boost::shared_ptr<VectorDouble> Example::approxVals
private

Definition at line 62 of file radiation.cpp.

◆ aveMaxMin

std::array< double, Example::BoundingBox::LAST_BB > Example::aveMaxMin
staticprivate
Examples
phase.cpp.

Definition at line 110 of file phase.cpp.

◆ base

FieldApproximationBase Example::base
private

Definition at line 68 of file plot_base.cpp.

◆ boundaryMarker

boost::shared_ptr< std::vector< unsigned char > > Example::boundaryMarker
private

Definition at line 42 of file helmholtz.cpp.

◆ commonDataPtr

boost::shared_ptr< CommonData > Example::commonDataPtr
private

Definition at line 40 of file integration.cpp.

◆ doEvalField

PetscBool Example::doEvalField
private

Definition at line 95 of file elastic.cpp.

◆ domianLhsFEPtr

boost::shared_ptr<FEMethod> Example::domianLhsFEPtr
private

Definition at line 355 of file shallow_wave.cpp.

◆ domianRhsFEPtr

boost::shared_ptr<FEMethod> Example::domianRhsFEPtr
private

Definition at line 356 of file shallow_wave.cpp.

◆ ePS

SmartPetscObj<EPS> Example::ePS
private
Examples
eigen_elastic.cpp.

Definition at line 69 of file eigen_elastic.cpp.

◆ fieldEvalCoords

std::array<double, SPACE_DIM> Example::fieldEvalCoords
private

Definition at line 96 of file elastic.cpp.

◆ fieldEvalData

boost::shared_ptr<FieldEvaluatorInterface::SetPtsData> Example::fieldEvalData
private

Definition at line 97 of file elastic.cpp.

◆ focalIndex

int Example::focalIndex
staticprivate
Examples
phase.cpp.

Definition at line 112 of file phase.cpp.

◆ iI

std::vector< MatrixInt > Example::iI
staticprivate
Examples
phase.cpp.

Definition at line 109 of file phase.cpp.

◆ K

SmartPetscObj<Mat> Example::K
private

Definition at line 68 of file eigen_elastic.cpp.

◆ M

SmartPetscObj<Mat> Example::M
private

Definition at line 67 of file eigen_elastic.cpp.

◆ matDPtr

boost::shared_ptr<MatrixDouble> Example::matDPtr
private

Definition at line 65 of file eigen_elastic.cpp.

◆ mField

MoFEM::Interface & Example::mField
private

◆ pinchNodes

Range Example::pinchNodes
private

Definition at line 54 of file heat_method.cpp.

◆ reactionFe

boost::shared_ptr<DomainEle> Example::reactionFe
private

Definition at line 193 of file plastic.cpp.

◆ rigidBodyMotion

std::array<SmartPetscObj<Vec>, 6> Example::rigidBodyMotion
private

Definition at line 71 of file eigen_elastic.cpp.

◆ rZ

std::vector< double > Example::rZ
staticprivate
Examples
phase.cpp.

Definition at line 108 of file phase.cpp.

◆ savitzkyGolayNormalisation

int Example::savitzkyGolayNormalisation
staticprivate
Examples
phase.cpp.

Definition at line 113 of file phase.cpp.

◆ savitzkyGolayWeights

const int * Example::savitzkyGolayWeights
staticprivate
Examples
phase.cpp.

Definition at line 114 of file phase.cpp.

◆ simpleInterface

Simple * Example::simpleInterface
private
Examples
helmholtz.cpp.

Definition at line 41 of file helmholtz.cpp.

◆ space

FieldSpace Example::space
private

Definition at line 69 of file plot_base.cpp.

◆ uXScatter

std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter> > Example::uXScatter
private

Definition at line 195 of file plastic.cpp.

◆ uYScatter

std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter> > Example::uYScatter
private

Definition at line 196 of file plastic.cpp.

◆ uZScatter

std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter> > Example::uZScatter
private

Definition at line 197 of file plastic.cpp.

◆ vectorFieldPtr

boost::shared_ptr<MatrixDouble> Example::vectorFieldPtr
private

Definition at line 98 of file elastic.cpp.


The documentation for this struct was generated from the following files:
MoFEMFunctionReturnHot
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:460
MoFEM::UnknownInterface::getInterface
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Definition: UnknownInterface.hpp:93
CHK_MOAB_THROW
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
Definition: definitions.h:589
OpBodyForce
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesVector< 1, SPACE_DIM, 0 > OpBodyForce
Definition: dynamic_first_order_con_law.cpp:66
Example::tsSolve
MoFEMErrorCode tsSolve()
Definition: plastic.cpp:740
MoFEM::EntitiesFieldData::EntData
Data on single entity (This is passed as argument to DataOperator::doWork)
Definition: EntitiesFieldData.hpp:128
Example::lhsFlux
static double lhsFlux(const double x, const double y, const double)
Definition: phase.cpp:165
set_timer
PetscBool set_timer
Set timer.
Definition: plastic.cpp:117
omega
constexpr double omega
Save field DOFS on vertices/tags.
Definition: dynamic_first_order_con_law.cpp:93
Example::MAX_X
@ MAX_X
Definition: phase.cpp:101
Example::aveMaxMin
static std::array< double, LAST_BB > aveMaxMin
Definition: phase.cpp:110
MoFEM::PipelineManager::getDomainRhsFE
boost::shared_ptr< FEMethod > & getDomainRhsFE()
Definition: PipelineManager.hpp:405
MYPCOMM_INDEX
#define MYPCOMM_INDEX
default communicator number PCOMM
Definition: definitions.h:228
OpMassV
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM > OpMassV
Definition: dynamic_first_order_con_law.cpp:58
shear_modulus_G
constexpr double shear_modulus_G
Definition: elastic.cpp:82
MoFEM::CoreInterface::loop_dofs
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.
MoFEM::EssentialPreProcReaction< DisplacementCubitBcData >
Specialization for DisplacementCubitBcData.
Definition: EssentialDisplacementCubitBcData.hpp:157
MoFEM::OpSetInvJacHcurlFace
OpSetInvJacHcurlFaceImpl< 2 > OpSetInvJacHcurlFace
Definition: UserDataOperators.hpp:2978
H1
@ H1
continuous field
Definition: definitions.h:85
MoFEM::FieldBlas::setVertexDofs
MoFEMErrorCode setVertexDofs(VertexCoordsFunction lambda, const std::string field_name, Range *verts=nullptr)
Set DOFs on vertices using user function.
Definition: FieldBlas.cpp:318
Example::OPs
MoFEMErrorCode OPs()
[Boundary condition]
Definition: plastic.cpp:556
OpGradTimesTensor2
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpGradTimesTensor< 1, SPACE_DIM, SPACE_DIM > OpGradTimesTensor2
Definition: dynamic_first_order_con_law.cpp:76
MoFEM::DMMoFEMAddSubFieldCol
PetscErrorCode DMMoFEMAddSubFieldCol(DM dm, const char field_name[])
Definition: DMMoFEM.cpp:280
Example::CENTER_Y
@ CENTER_Y
Definition: phase.cpp:100
Example::LAST_BB
@ LAST_BB
Definition: phase.cpp:105
Example::rZ
static std::vector< double > rZ
Definition: phase.cpp:108
FTensor::Tensor1
Definition: Tensor1_value.hpp:8
MOFEM_LOG_CHANNEL
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
Definition: LogManager.hpp:284
MoFEM::OpCalculateTensor2FieldValues
Get values at integration pts for tensor filed rank 2, i.e. matrix field.
Definition: UserDataOperators.hpp:887
Example::CommonData::SECOND_XX
@ SECOND_XX
Definition: integration.cpp:73
young_modulus
double young_modulus
Young modulus.
Definition: plastic.cpp:121
MoFEM::OpSetContravariantPiolaTransformOnFace2D
OpSetContravariantPiolaTransformOnFace2DImpl< 2 > OpSetContravariantPiolaTransformOnFace2D
Definition: UserDataOperators.hpp:3076
OpMassF
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM *SPACE_DIM > OpMassF
Definition: dynamic_first_order_con_law.cpp:60
rho
double rho
Definition: plastic.cpp:140
sigmaY
double sigmaY
Yield stress.
Definition: plastic.cpp:123
OpRhsTestPiola
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpBaseTimesVector< 1, SPACE_DIM *SPACE_DIM, 1 > OpRhsTestPiola
Definition: dynamic_first_order_con_law.cpp:80
MoFEM::OpPostProcMapInMoab::DataMapVec
std::map< std::string, boost::shared_ptr< VectorDouble > > DataMapVec
Definition: PostProcBrokenMeshInMoabBase.hpp:700
MoFEM::EssentialPostProcLhs< DisplacementCubitBcData >
Specialization for DisplacementCubitBcData.
Definition: EssentialDisplacementCubitBcData.hpp:134
MoFEM::CoreInterface::get_comm
virtual MPI_Comm & get_comm() const =0
NOBASE
@ NOBASE
Definition: definitions.h:59
CHK_THROW_MESSAGE
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
Definition: definitions.h:609
MoFEM::DMMoFEMSetSquareProblem
PetscErrorCode DMMoFEMSetSquareProblem(DM dm, PetscBool square_problem)
set squared problem
Definition: DMMoFEM.cpp:456
ApproximationBaseNames
const static char *const ApproximationBaseNames[]
Definition: definitions.h:72
L2
@ L2
field with C-1 continuity
Definition: definitions.h:88
bulk_modulus_K
constexpr double bulk_modulus_K
Definition: elastic.cpp:81
MoFEM::PipelineManager::loopFiniteElements
MoFEMErrorCode loopFiniteElements(SmartPetscObj< DM > dm=nullptr)
Iterate finite elements.
Definition: PipelineManager.cpp:19
Example::CommonData::SECOND_YZ
@ SECOND_YZ
Definition: integration.cpp:77
Example::uZScatter
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uZScatter
Definition: plastic.cpp:197
MoFEM::Exceptions::MoFEMErrorCode
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
Definition: Exceptions.hpp:56
SPACE_DIM
constexpr int SPACE_DIM
Definition: dynamic_first_order_con_law.cpp:24
MoFEM::OpCalculateVectorFieldValues
Get values at integration pts for tensor filed rank 1, i.e. vector field.
Definition: UserDataOperators.hpp:466
TSPrePostProc::tsPostStage
static MoFEMErrorCode tsPostStage(TS ts, PetscReal stagetime, PetscInt stageindex, Vec *Y)
[Boundary condition]
Definition: dynamic_first_order_con_law.cpp:581
MoFEM::PipelineManager::getOpDomainRhsPipeline
boost::ptr_deque< UserDataOperator > & getOpDomainRhsPipeline()
Get the Op Domain Rhs Pipeline object.
Definition: PipelineManager.hpp:773
MoFEM::CoreInterface::get_comm_rank
virtual int get_comm_rank() const =0
MoFEM::EssentialPostProcRhs< DisplacementCubitBcData >
Specialization for DisplacementCubitBcData.
Definition: EssentialDisplacementCubitBcData.hpp:113
OpCalculateDeformationGradient
Definition: dynamic_first_order_con_law.cpp:339
MoFEM::PipelineManager
PipelineManager interface.
Definition: PipelineManager.hpp:24
bulk_modulus_K
double bulk_modulus_K
Definition: dynamic_first_order_con_law.cpp:96
MoFEM::DMoFEMMeshToLocalVector
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
Definition: DMMoFEM.cpp:523
MoFEM::DisplacementCubitBcData
Definition of the displacement bc data structure.
Definition: BCData.hpp:76
MoFEM::PipelineManager::getBoundaryRhsFE
boost::shared_ptr< FEMethod > & getBoundaryRhsFE()
Definition: PipelineManager.hpp:413
MoFEM::Projection10NodeCoordsOnField
Projection of edge entities with one mid-node on hierarchical basis.
Definition: Projection10NodeCoordsOnField.hpp:24
MoFEM::createKSP
auto createKSP(MPI_Comm comm)
Definition: PetscSmartObj.hpp:261
is_plane_strain
PetscBool is_plane_strain
Definition: elastic.cpp:84
tsPrePostProc
static boost::weak_ptr< TSPrePostProc > tsPrePostProc
Definition: dynamic_first_order_con_law.cpp:405
k
static double k
Definition: phase.cpp:75
scale
double scale
Definition: plastic.cpp:119
MoFEM::PipelineManager::createTSIM
SmartPetscObj< TS > createTSIM(SmartPetscObj< DM > dm=nullptr)
Create TS (time) implicit solver.
Definition: PipelineManager.cpp:244
Example::M
SmartPetscObj< Mat > M
Definition: eigen_elastic.cpp:67
MoFEM::Simple
Simple interface for fast problem set-up.
Definition: Simple.hpp:27
OpCalculatePiolaIncompressibleNH
Definition: dynamic_first_order_con_law.cpp:267
order
int order
Order displacement.
Definition: plastic.cpp:134
Example::base
FieldApproximationBase base
Definition: plot_base.cpp:68
Example::CommonData::ZERO
@ ZERO
Definition: integration.cpp:69
MoFEM::getDMSubData
auto getDMSubData(DM dm)
Get sub problem data structure.
Definition: DMMoFEM.hpp:1157
THROW_MESSAGE
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
Definition: definitions.h:574
zeta
double zeta
Viscous hardening.
Definition: plastic.cpp:126
geom_order
int geom_order
Order if fixed.
Definition: plastic.cpp:137
MoFEM::DMMoFEMAddElement
PetscErrorCode DMMoFEMAddElement(DM dm, std::string fe_name)
add element to dm
Definition: DMMoFEM.cpp:497
order
constexpr int order
Definition: dg_projection.cpp:18
Example::savitzkyGolayNormalisation
static int savitzkyGolayNormalisation
Definition: phase.cpp:113
MoFEM::DeprecatedCoreInterface
Deprecated interface functions.
Definition: DeprecatedCoreInterface.hpp:16
ROW
@ ROW
Definition: definitions.h:136
Example::CommonData::FIRST_X
@ FIRST_X
Definition: integration.cpp:70
MoFEM::OpCalculateVectorFieldValuesFromPetscVecImpl
Approximate field values for given petsc vector.
Definition: UserDataOperators.hpp:595
Example::focalIndex
static int focalIndex
Definition: phase.cpp:112
OpInertiaForce
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesVector< 1, SPACE_DIM, 1 > OpInertiaForce
Definition: dynamic_first_order_con_law.cpp:63
MoFEM::PostProcBrokenMeshInMoab
Definition: PostProcBrokenMeshInMoabBase.hpp:667
MoFEM::OpCalcNormL2Tensor2
Get norm of input MatrixDouble for Tensor2.
Definition: NormsOperators.hpp:72
Example::MIN_Y
@ MIN_Y
Definition: phase.cpp:104
MoFEM::DMCreateMatrix_MoFEM
PetscErrorCode DMCreateMatrix_MoFEM(DM dm, Mat *M)
Definition: DMMoFEM.cpp:1197
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:548
MoFEM::createDMVector
auto createDMVector(DM dm)
Get smart vector from DM.
Definition: DMMoFEM.hpp:1099
MoFEM::EssentialPreProc< DisplacementCubitBcData >
Specialization for DisplacementCubitBcData.
Definition: EssentialDisplacementCubitBcData.hpp:91
MoFEM::CoreInterface::get_moab
virtual moab::Interface & get_moab()=0
TSPrePostProc::tsPostStep
static MoFEMErrorCode tsPostStep(TS ts)
Definition: dynamic_first_order_con_law.cpp:614
Example::CommonData::FIRST_Y
@ FIRST_Y
Definition: integration.cpp:71
Example::CommonData::FIRST_Z
@ FIRST_Z
Definition: integration.cpp:72
AT
constexpr AssemblyType AT
Definition: plastic.cpp:44
MoFEM::ISManager
Section manager is used to create indexes and sections.
Definition: ISManager.hpp:23
MoFEM::createDM
auto createDM(MPI_Comm comm, const std::string dm_type_name)
Creates smart DM object.
Definition: PetscSmartObj.hpp:141
OpCalculateDisplacement
Definition: dynamic_first_order_con_law.cpp:226
MoFEM::BcManager
Simple interface for fast problem set-up.
Definition: BcManager.hpp:25
OpMass
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM > OpMass
[Only used with Hooke equation (linear material model)]
Definition: seepage.cpp:57
PlasticOps::CommonData::activityData
static std::array< int, 5 > activityData
Definition: PlasticOps.hpp:107
MoFEM::PetscOptionsGetReal
PetscErrorCode PetscOptionsGetReal(PetscOptions *, const char pre[], const char name[], PetscReal *dval, PetscBool *set)
Definition: DeprecatedPetsc.hpp:152
SPACE_DIM
constexpr int SPACE_DIM
Definition: plastic.cpp:40
MOFEM_LOG_C
#define MOFEM_LOG_C(channel, severity, format,...)
Definition: LogManager.hpp:311
MoFEM::OpCalculateHVecVectorField
Get vector field for H-div approximation.
Definition: UserDataOperators.hpp:2115
Example::uXScatter
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uXScatter
Definition: plastic.cpp:195
is_quasi_static
PetscBool is_quasi_static
Definition: plastic.cpp:139
MoFEM::FieldEvaluatorInterface
Field evaluator interface.
Definition: FieldEvaluator.hpp:21
simple
void simple(double P1[], double P2[], double P3[], double c[], const int N)
Definition: acoustic.cpp:69
MoFEM::DMMoFEMCreateSubDM
PetscErrorCode DMMoFEMCreateSubDM(DM subdm, DM dm, const char problem_name[])
Must be called by user to set Sub DM MoFEM data structures.
Definition: DMMoFEM.cpp:215
double
convert.type
type
Definition: convert.py:64
DomainEle
PipelineManager::ElementsAndOpsByDim< SPACE_DIM >::DomainEle DomainEle
Definition: dynamic_first_order_con_law.cpp:28
MoFEM::FormsIntegrators::Assembly
Assembly methods.
Definition: FormsIntegrators.hpp:317
OpPPMap
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
Definition: photon_diffusion.cpp:29
OpCalculateFStab
Definition: dynamic_first_order_con_law.cpp:104
MOFEM_LOG_SYNCHRONISE
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
Definition: LogManager.hpp:345
cn1
double cn1
Definition: plastic.cpp:132
Example::uYScatter
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uYScatter
Definition: plastic.cpp:196
PlasticOps::Monitor
Definition: PlasticOpsMonitor.hpp:9
C1_k
double C1_k
Kinematic hardening.
Definition: plastic.cpp:129
MoFEM::OpSetContravariantPiolaTransformOnEdge2D
Definition: UserDataOperators.hpp:3086
MoFEM::OpCalculateScalarFieldValues
Get value at integration points for scalar field.
Definition: UserDataOperators.hpp:82
OpCalculatePiola
Definition: dynamic_first_order_con_law.cpp:168
Example::rhsSource
static double rhsSource(const double x, const double y, const double)
Definition: phase.cpp:150
Example::savitzkyGolayWeights
static const int * savitzkyGolayWeights
Definition: phase.cpp:114
poisson_ratio
double poisson_ratio
Poisson ratio.
Definition: plastic.cpp:122
MoFEM::GAUSS
@ GAUSS
Definition: FormsIntegrators.hpp:136
cn0
double cn0
Definition: plastic.cpp:131
MoFEM::OpSetHOWeightsOnFace
Modify integration weights on face to take in account higher-order geometry.
Definition: HODataOperators.hpp:122
MoFEM::smartVectorDuplicate
DEPRECATED SmartPetscObj< Vec > smartVectorDuplicate(Vec vec)
Definition: PetscSmartObj.hpp:230
A
constexpr AssemblyType A
[Define dimension]
Definition: elastic.cpp:21
OpHdivU
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMixDivTimesScalar< 2 > OpHdivU
Definition: phase.cpp:71
MoFEM::AddFluxToLhsPipelineImpl
Definition: Natural.hpp:49
Example::getCoordsInImage
static std::pair< int, int > getCoordsInImage(double x, double y)
Definition: phase.cpp:131
SPACE_DIM
constexpr int SPACE_DIM
[Define dimension]
Definition: elastic.cpp:18
MoFEM::PipelineManager::setDomainRhsIntegrationRule
MoFEMErrorCode setDomainRhsIntegrationRule(RuleHookFun rule)
Definition: PipelineManager.hpp:530
MoFEM::OpCalcNormL2Tensor1
Get norm of input MatrixDouble for Tensor1.
Definition: NormsOperators.hpp:44
MoFEM::type_from_handle
auto type_from_handle(const EntityHandle h)
get type from entity handle
Definition: Templates.hpp:1898
OpDomainSource
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< 1, 1 > OpDomainSource
Definition: phase.cpp:73
visH
double visH
Viscous hardening.
Definition: plastic.cpp:125
lamme_lambda
double lamme_lambda
Definition: dynamic_first_order_con_law.cpp:99
MoFEM::LogManager::SeverityLevel
SeverityLevel
Severity levels.
Definition: LogManager.hpp:33
MOFEM_LOG_TAG
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
Definition: LogManager.hpp:339
MoFEM::AddFluxToRhsPipelineImpl
Definition: Natural.hpp:46
size_symm
constexpr auto size_symm
Definition: plastic.cpp:42
MoFEM::Types::VectorAdaptor
VectorShallowArrayAdaptor< double > VectorAdaptor
Definition: Types.hpp:115
i
FTensor::Index< 'i', SPACE_DIM > i
Definition: hcurl_divergence_operator_2d.cpp:27
MoFEM::OpPostProcMapInMoab::DataMapMat
std::map< std::string, boost::shared_ptr< MatrixDouble > > DataMapMat
Definition: PostProcBrokenMeshInMoabBase.hpp:701
t_kd
constexpr auto t_kd
Definition: free_surface.cpp:137
BiLinearForm
MOFEM_NOT_FOUND
@ MOFEM_NOT_FOUND
Definition: definitions.h:33
MoFEM::OpSetHOWeightsOnSubDim
Definition: HODataOperators.hpp:145
window_savitzky_golay
static int window_savitzky_golay
Definition: phase.cpp:77
field_name
constexpr auto field_name
Definition: poisson_2d_homogeneous.cpp:13
FTensor::Index< 'i', SPACE_DIM >
young_modulus
constexpr double young_modulus
Definition: elastic.cpp:79
MoFEM::OperatorsTester
Calculate directional derivative of the right hand side and compare it with tangent matrix derivative...
Definition: OperatorsTester.hpp:21
MoFEM::AddHOOps
Add operators pushing bases from local to physical configuration.
Definition: HODataOperators.hpp:413
MoFEM::OpCalculateVectorFieldGradient
Get field gradients at integration pts for scalar filed rank 0, i.e. vector field.
Definition: UserDataOperators.hpp:1535
ContactOps::cn_contact
double cn_contact
Definition: contact.cpp:100
integration_rule
auto integration_rule
Definition: free_surface.cpp:185
b_iso
double b_iso
Saturation exponent.
Definition: plastic.cpp:128
Example::CommonData::SECOND_YY
@ SECOND_YY
Definition: integration.cpp:76
v
const double v
phase velocity of light in medium (cm/ns)
Definition: initial_diffusion.cpp:40
Range
MoFEM::PipelineManager::getDomainLhsFE
boost::shared_ptr< FEMethod > & getDomainLhsFE()
Definition: PipelineManager.hpp:401
DomainEleOp
MoFEM::PetscOptionsGetRealArray
PetscErrorCode PetscOptionsGetRealArray(PetscOptions *, const char pre[], const char name[], PetscReal dval[], PetscInt *nmax, PetscBool *set)
Definition: DeprecatedPetsc.hpp:192
MOFEM_TAG_AND_LOG
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
Definition: LogManager.hpp:362
Example::testOperators
MoFEMErrorCode testOperators()
[Solve]
Definition: plastic.cpp:1214
MOFEM_LOG
#define MOFEM_LOG(channel, severity)
Log.
Definition: LogManager.hpp:308
MoFEM::vectorDuplicate
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
Definition: PetscSmartObj.hpp:221
shear_modulus_G
double shear_modulus_G
Definition: dynamic_first_order_con_law.cpp:97
DEMKOWICZ_JACOBI_BASE
@ DEMKOWICZ_JACOBI_BASE
Definition: definitions.h:66
Example::matDPtr
boost::shared_ptr< MatrixDouble > matDPtr
Definition: eigen_elastic.cpp:65
MoFEM::CommInterface
Managing BitRefLevels.
Definition: CommInterface.hpp:21
Example::bC
MoFEMErrorCode bC()
[Create common data]
Definition: plastic.cpp:512
Example::CommonData::SECOND_XY
@ SECOND_XY
Definition: integration.cpp:74
HenckyOps::f
auto f
Definition: HenckyOps.hpp:15
is_large_strains
PetscBool is_large_strains
Large strains.
Definition: plastic.cpp:116
Example::setupProblem
MoFEMErrorCode setupProblem()
[Run problem]
Definition: plastic.cpp:233
CONTACT_SPACE
constexpr FieldSpace CONTACT_SPACE
Definition: plastic.cpp:52
j
FTensor::Index< 'j', 3 > j
Definition: matrix_function.cpp:19
eps
static const double eps
Definition: check_base_functions_derivatives_on_tet.cpp:11
approx_order
int approx_order
Definition: test_broken_space.cpp:50
MoFEM::createSchurNestedMatrixStruture
boost::shared_ptr< NestSchurData > createSchurNestedMatrixStruture(std::pair< SmartPetscObj< DM >, SmartPetscObj< DM >> dms, boost::shared_ptr< BlockStructure > block_mat_data_ptr, std::vector< std::string > fields_names, std::vector< boost::shared_ptr< Range >> field_ents, bool add_preconditioner_block)
Get the Schur Nest Mat Array object.
Definition: Schur.cpp:1944
Example::CENTER_X
@ CENTER_X
Definition: phase.cpp:99
MoFEM::DMMoFEMTSSetMonitor
PetscErrorCode DMMoFEMTSSetMonitor(DM dm, TS ts, const std::string fe_name, boost::shared_ptr< MoFEM::FEMethod > method, boost::shared_ptr< MoFEM::BasicMethod > pre_only, boost::shared_ptr< MoFEM::BasicMethod > post_only)
Set Monitor To TS solver.
Definition: DMMoFEM.cpp:1056
mu
double mu
Definition: dynamic_first_order_con_law.cpp:98
AINSWORTH_LEGENDRE_BASE
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
Definition: definitions.h:60
OpHdivHdiv
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 3, 3 > OpHdivHdiv
Definition: phase.cpp:69
EigenMatrix::Vec
const FTensor::Tensor2< T, Dim, Dim > Vec
Definition: MatrixFunction.hpp:66
MOFEM_DATA_INCONSISTENCY
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
ep_order
int ep_order
Order of ep files.
Definition: plastic.cpp:136
MoFEM::MeshsetsManager
Interface for managing meshsets containing materials and boundary conditions.
Definition: MeshsetsManager.hpp:104
Example::MAX_Y
@ MAX_Y
Definition: phase.cpp:102
Example::CommonData::SECOND_ZZ
@ SECOND_ZZ
Definition: integration.cpp:78
MoFEM::BlockData
Definition: MeshsetsManager.cpp:755
MoFEM::createVectorMPI
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
Definition: PetscSmartObj.hpp:202
MoFEM::OpInvertMatrix
Definition: UserDataOperators.hpp:3249
MoFEM::OpCalculateHOJacForFace
OpCalculateHOJacForFaceImpl< 2 > OpCalculateHOJacForFace
Definition: HODataOperators.hpp:264
Qinf
double Qinf
Saturation yield stress.
Definition: plastic.cpp:127
MoFEM::MoFEMSNESMonitorFields
MoFEMErrorCode MoFEMSNESMonitorFields(SNES snes, PetscInt its, PetscReal fgnorm, SnesCtx *snes_ctx)
Sens monitor printing residual field by field.
Definition: SnesCtx.cpp:232
Example::iI
static std::vector< MatrixInt > iI
Definition: phase.cpp:109
TSPrePostProc::tsPreStep
static MoFEMErrorCode tsPreStep(TS ts)
Definition: dynamic_first_order_con_law.cpp:628
ReactionDiffusionEquation::D
const double D
diffusivity
Definition: reaction_diffusion.cpp:20
MoFEM::BLOCK_SCHUR
@ BLOCK_SCHUR
Definition: FormsIntegrators.hpp:108
sdf_wavy_2d.w
int w
Definition: sdf_wavy_2d.py:6
Example::mField
MoFEM::Interface & mField
Definition: plastic.cpp:184
m
FTensor::Index< 'm', 3 > m
Definition: shallow_wave.cpp:80
FTensor::Kronecker_Delta_symmetric
Kronecker Delta class symmetric.
Definition: Kronecker_Delta.hpp:49
Example::CommonData::SECOND_XZ
@ SECOND_XZ
Definition: integration.cpp:75
MOFEM_ATOM_TEST_INVALID
@ MOFEM_ATOM_TEST_INVALID
Definition: definitions.h:40
Example::reactionFe
boost::shared_ptr< DomainEle > reactionFe
Definition: plastic.cpp:193
MoFEM::getDMSnesCtx
auto getDMSnesCtx(DM dm)
Get SNES context data structure used by DM.
Definition: DMMoFEM.hpp:1127
MoFEM::DMMoFEMSetNestSchurData
MoFEMErrorCode DMMoFEMSetNestSchurData(DM dm, boost::shared_ptr< NestSchurData >)
Definition: DMMoFEM.cpp:1562
MoFEM::createBlockMatStructure
boost::shared_ptr< BlockStructure > createBlockMatStructure(DM dm, SchurFEOpsFEandFields schur_fe_op_vec)
Create a Mat Diag Blocks object.
Definition: Schur.cpp:1009
MoFEMFunctionBeginHot
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:453
MoFEM::PetscOptionsGetScalar
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
Definition: DeprecatedPetsc.hpp:162
MoFEM::OpMakeHdivFromHcurl
Make Hdiv space from Hcurl space in 2d.
Definition: UserDataOperators.hpp:2985
MoFEM::DMMoFEMAddSubFieldRow
PetscErrorCode DMMoFEMAddSubFieldRow(DM dm, const char field_name[])
Definition: DMMoFEM.cpp:238
Example::createCommonData
MoFEMErrorCode createCommonData()
[Set up problem]
Definition: plastic.cpp:404
MoFEM::MeshsetsManager::getCubitMeshsetPtr
MoFEMErrorCode getCubitMeshsetPtr(const int ms_id, const CubitBCType cubit_bc_type, const CubitMeshSets **cubit_meshset_ptr) const
get cubit meshset
Definition: MeshsetsManager.cpp:578
MoFEM::SmartPetscObj< Mat >
SetUpSchur::createSetUpSchur
static boost::shared_ptr< SetUpSchur > createSetUpSchur(MoFEM::Interface &m_field)
Definition: test_broken_space.cpp:768
Example::MIN_X
@ MIN_X
Definition: phase.cpp:103
k
FTensor::Index< 'k', 3 > k
Definition: matrix_function.cpp:20
MoFEM::DMoFEMLoopFiniteElements
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
Definition: DMMoFEM.cpp:586
Example::commonDataPtr
boost::shared_ptr< CommonData > commonDataPtr
Definition: integration.cpp:40
convert.int
int
Definition: convert.py:64
MoFEM::PetscOptionsGetInt
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
Definition: DeprecatedPetsc.hpp:142
MoFEMFunctionReturn
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:429
HDIV
@ HDIV
field with continuous normal traction
Definition: definitions.h:87
MoFEM::FieldBlas
Basic algebra on fields.
Definition: FieldBlas.hpp:21
MoFEM::getDMTsCtx
auto getDMTsCtx(DM dm)
Get TS context data structure used by DM.
Definition: DMMoFEM.hpp:1141
H
double H
Hardening.
Definition: plastic.cpp:124
tau_order
int tau_order
Order of tau files.
Definition: plastic.cpp:135
poisson_ratio
constexpr double poisson_ratio
Definition: elastic.cpp:80
MoFEM::OpLoopSide
Element used to execute operators on side of the element.
Definition: ForcesAndSourcesCore.hpp:1290
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:359
l
FTensor::Index< 'l', 3 > l
Definition: matrix_function.cpp:21
alpha_damping
double alpha_damping
Definition: plastic.cpp:141
ApproxFieldFunction
Definition: child_and_parent.cpp:43
MoFEM::OpPostProcMapInMoab
Post post-proc data at points from hash maps.
Definition: PostProcBrokenMeshInMoabBase.hpp:698
MoFEM::PetscOptionsGetBool
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
Definition: DeprecatedPetsc.hpp:182