v0.14.0
Classes | Public Types | Public Member Functions | Static Public Attributes | 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 Types

enum  { VOL, COUNT }
 

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 ()
 

Static Public Attributes

static std::array< double, 2 > meshVolumeAndCount = {0, 0}
 

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 216 of file plastic.cpp.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
VOL 
COUNT 

Definition at line 222 of file plastic.cpp.

222 { VOL, COUNT };

◆ 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 218 of file plastic.cpp.

218 : mField(m_field) {}

◆ Example() [2/14]

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

Definition at line 420 of file dynamic_first_order_con_law.cpp.

420 : 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 52 of file nonlinear_dynamic_elastic.cpp.

52 : 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 640 of file dynamic_first_order_con_law.cpp.

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

◆ 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 590 of file plastic.cpp.

590  {
592 
593  auto simple = mField.getInterface<Simple>();
594  auto bc_mng = mField.getInterface<BcManager>();
595 
596  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), "REMOVE_X",
597  "U", 0, 0);
598  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), "REMOVE_Y",
599  "U", 1, 1);
600  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), "REMOVE_Z",
601  "U", 2, 2);
602  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(),
603  "REMOVE_ALL", "U", 0, 3);
604 
605 #ifdef ADD_CONTACT
606  for (auto b : {"FIX_X", "REMOVE_X"})
607  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
608  "SIGMA", 0, 0, false, true);
609  for (auto b : {"FIX_Y", "REMOVE_Y"})
610  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
611  "SIGMA", 1, 1, false, true);
612  for (auto b : {"FIX_Z", "REMOVE_Z"})
613  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
614  "SIGMA", 2, 2, false, true);
615  for (auto b : {"FIX_ALL", "REMOVE_ALL"})
616  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
617  "SIGMA", 0, 3, false, true);
618  CHKERR bc_mng->removeBlockDOFsOnEntities(
619  simple->getProblemName(), "NO_CONTACT", "SIGMA", 0, 3, false, true);
620 #endif
621 
622  CHKERR bc_mng->pushMarkDOFsOnEntities<DisplacementCubitBcData>(
623  simple->getProblemName(), "U");
624 
625  auto &bc_map = bc_mng->getBcMapByBlockName();
626  for (auto bc : bc_map)
627  MOFEM_LOG("PLASTICITY", Sev::verbose) << "Marker " << bc.first;
628 
630 }

◆ 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 535 of file dynamic_first_order_con_law.cpp.

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

◆ 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 1194 of file dynamic_first_order_con_law.cpp.

1194  {
1197 }

◆ 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 480 of file plastic.cpp.

480  {
482 
483  auto get_command_line_parameters = [&]() {
485 
486  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-scale", &scale, PETSC_NULL);
487  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-young_modulus",
488  &young_modulus, PETSC_NULL);
489  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-poisson_ratio",
490  &poisson_ratio, PETSC_NULL);
491  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-hardening", &H, PETSC_NULL);
492  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-hardening_viscous", &visH,
493  PETSC_NULL);
494  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-yield_stress", &sigmaY,
495  PETSC_NULL);
496  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-cn0", &cn0, PETSC_NULL);
497  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-cn1", &cn1, PETSC_NULL);
498  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-zeta", &zeta, PETSC_NULL);
499  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-Qinf", &Qinf, PETSC_NULL);
500  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-b_iso", &b_iso, PETSC_NULL);
501  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-C1_k", &C1_k, PETSC_NULL);
502  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-large_strains",
503  &is_large_strains, PETSC_NULL);
504  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-set_timer", &set_timer,
505  PETSC_NULL);
506  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-atom_test", &atom_test,
507  PETSC_NULL);
508 
509  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-order", &order, PETSC_NULL);
510  PetscBool tau_order_is_set; ///< true if tau order is set
511  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-tau_order", &tau_order,
512  &tau_order_is_set);
513  PetscBool ep_order_is_set; ///< true if tau order is set
514  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-ep_order", &ep_order,
515  &ep_order_is_set);
516  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-geom_order", &geom_order,
517  PETSC_NULL);
518 
519  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-rho", &rho, PETSC_NULL);
520  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-alpha_damping",
521  &alpha_damping, PETSC_NULL);
522 
523  MOFEM_LOG("PLASTICITY", Sev::inform) << "Young modulus " << young_modulus;
524  MOFEM_LOG("PLASTICITY", Sev::inform) << "Poisson ratio " << poisson_ratio;
525  MOFEM_LOG("PLASTICITY", Sev::inform) << "Yield stress " << sigmaY;
526  MOFEM_LOG("PLASTICITY", Sev::inform) << "Hardening " << H;
527  MOFEM_LOG("PLASTICITY", Sev::inform) << "Viscous hardening " << visH;
528  MOFEM_LOG("PLASTICITY", Sev::inform) << "Saturation yield stress " << Qinf;
529  MOFEM_LOG("PLASTICITY", Sev::inform) << "Saturation exponent " << b_iso;
530  MOFEM_LOG("PLASTICITY", Sev::inform) << "Kinematic hardening " << C1_k;
531  MOFEM_LOG("PLASTICITY", Sev::inform) << "cn0 " << cn0;
532  MOFEM_LOG("PLASTICITY", Sev::inform) << "cn1 " << cn1;
533  MOFEM_LOG("PLASTICITY", Sev::inform) << "zeta " << zeta;
534 
535  if (tau_order_is_set == PETSC_FALSE)
536  tau_order = order - 2;
537  if (ep_order_is_set == PETSC_FALSE)
538  ep_order = order - 1;
539 
540  MOFEM_LOG("PLASTICITY", Sev::inform) << "Approximation order " << order;
541  MOFEM_LOG("PLASTICITY", Sev::inform)
542  << "Ep approximation order " << ep_order;
543  MOFEM_LOG("PLASTICITY", Sev::inform)
544  << "Tau approximation order " << tau_order;
545  MOFEM_LOG("PLASTICITY", Sev::inform)
546  << "Geometry approximation order " << geom_order;
547 
548  MOFEM_LOG("PLASTICITY", Sev::inform) << "Density " << rho;
549  MOFEM_LOG("PLASTICITY", Sev::inform) << "alpha_damping " << alpha_damping;
550 
551  PetscBool is_scale = PETSC_TRUE;
552  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-is_scale", &is_scale,
553  PETSC_NULL);
554  if (is_scale) {
555  scale /= young_modulus;
556  }
557 
558  MOFEM_LOG("PLASTICITY", Sev::inform) << "Scale " << scale;
559 
560 #ifdef ADD_CONTACT
561  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-cn_contact",
562  &ContactOps::cn_contact, PETSC_NULL);
563  MOFEM_LOG("CONTACT", Sev::inform)
564  << "cn_contact " << ContactOps::cn_contact;
565 #endif // ADD_CONTACT
566 
567  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-quasi_static",
568  &is_quasi_static, PETSC_NULL);
569  MOFEM_LOG("PLASTICITY", Sev::inform)
570  << "Is quasi static: " << (is_quasi_static ? "true" : "false");
571 
573  };
574 
575  CHKERR get_command_line_parameters();
576 
577 #ifdef ADD_CONTACT
578  #ifdef PYTHON_SDF
579  sdfPythonPtr = boost::make_shared<ContactOps::SDFPython>();
580  CHKERR sdfPythonPtr->sdfInit("sdf.py");
581  ContactOps::sdfPythonWeakPtr = sdfPythonPtr;
582  #endif
583 #endif // ADD_CONTACT
584 
586 }

◆ 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 634 of file plastic.cpp.

634  {
636  auto pip_mng = mField.getInterface<PipelineManager>();
637 
638  auto integration_rule_bc = [](int, int, int ao) { return 2 * ao; };
639 
640  auto vol_rule = [](int, int, int ao) { return 2 * ao + geom_order - 1; };
641 
642  auto add_boundary_ops_lhs_mechanical = [&](auto &pip) {
644 
646  pip, {HDIV}, "GEOMETRY");
647  pip.push_back(new OpSetHOWeightsOnSubDim<SPACE_DIM>());
648 
649  // Add Natural BCs to LHS
651  pip, mField, "U", Sev::inform);
652 
653 #ifdef ADD_CONTACT
654  auto simple = mField.getInterface<Simple>();
655  CHKERR
656  ContactOps::opFactoryBoundaryLhs<SPACE_DIM, AT, GAUSS, BoundaryEleOp>(
657  pip, "SIGMA", "U");
658  CHKERR
659  ContactOps::opFactoryBoundaryToDomainLhs<SPACE_DIM, AT, IT, DomainEle>(
660  mField, pip, simple->getDomainFEName(), "SIGMA", "U", "GEOMETRY",
661  vol_rule);
662 #endif // ADD_CONTACT
663 
665  };
666 
667  auto add_boundary_ops_rhs_mechanical = [&](auto &pip) {
669 
671  pip, {HDIV}, "GEOMETRY");
672  pip.push_back(new OpSetHOWeightsOnSubDim<SPACE_DIM>());
673 
674  // Add Natural BCs to RHS
676  pip, mField, "U", {boost::make_shared<ScaledTimeScale>()}, Sev::inform);
677 
678 #ifdef ADD_CONTACT
679  CHKERR ContactOps::opFactoryBoundaryRhs<SPACE_DIM, AT, IT, BoundaryEleOp>(
680  pip, "SIGMA", "U");
681 #endif // ADD_CONTACT
682 
684  };
685 
686  auto add_domain_ops_lhs = [this](auto &pip) {
689  pip, {H1, HDIV}, "GEOMETRY");
690 
691  if (is_quasi_static == PETSC_FALSE) {
692 
693  //! [Only used for dynamics]
696  //! [Only used for dynamics]
697 
698  auto get_inertia_and_mass_damping = [this](const double, const double,
699  const double) {
700  auto *pip = mField.getInterface<PipelineManager>();
701  auto &fe_domain_lhs = pip->getDomainLhsFE();
702  return (rho / scale) * fe_domain_lhs->ts_aa +
703  (alpha_damping / scale) * fe_domain_lhs->ts_a;
704  };
705  pip.push_back(new OpMass("U", "U", get_inertia_and_mass_damping));
706  }
707 
708  CHKERR PlasticOps::opFactoryDomainLhs<SPACE_DIM, AT, IT, DomainEleOp>(
709  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU");
710 
712  };
713 
714  auto add_domain_ops_rhs = [this](auto &pip) {
716 
718  pip, {H1, HDIV}, "GEOMETRY");
719 
721  pip, mField, "U",
722  {boost::make_shared<ScaledTimeScale>("body_force_hist.txt")},
723  Sev::inform);
724 
725  // only in case of dynamics
726  if (is_quasi_static == PETSC_FALSE) {
727 
728  //! [Only used for dynamics]
730  AT>::LinearForm<IT>::OpBaseTimesVector<1, SPACE_DIM, 1>;
731  //! [Only used for dynamics]
732 
733  auto mat_acceleration = boost::make_shared<MatrixDouble>();
735  "U", mat_acceleration));
736  pip.push_back(
737  new OpInertiaForce("U", mat_acceleration, [](double, double, double) {
738  return rho / scale;
739  }));
740  if (alpha_damping > 0) {
741  auto mat_velocity = boost::make_shared<MatrixDouble>();
742  pip.push_back(
743  new OpCalculateVectorFieldValuesDot<SPACE_DIM>("U", mat_velocity));
744  pip.push_back(
745  new OpInertiaForce("U", mat_velocity, [](double, double, double) {
746  return alpha_damping / scale;
747  }));
748  }
749  }
750 
751  CHKERR PlasticOps::opFactoryDomainRhs<SPACE_DIM, AT, IT, DomainEleOp>(
752  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU");
753 
754 #ifdef ADD_CONTACT
755  CHKERR ContactOps::opFactoryDomainRhs<SPACE_DIM, AT, IT, DomainEleOp>(
756  pip, "SIGMA", "U");
757 #endif // ADD_CONTACT
758 
760  };
761 
762  CHKERR add_domain_ops_lhs(pip_mng->getOpDomainLhsPipeline());
763  CHKERR add_domain_ops_rhs(pip_mng->getOpDomainRhsPipeline());
764 
765  // Boundary
766  CHKERR add_boundary_ops_lhs_mechanical(pip_mng->getOpBoundaryLhsPipeline());
767  CHKERR add_boundary_ops_rhs_mechanical(pip_mng->getOpBoundaryRhsPipeline());
768 
769  CHKERR pip_mng->setDomainRhsIntegrationRule(vol_rule);
770  CHKERR pip_mng->setDomainLhsIntegrationRule(vol_rule);
771 
772  CHKERR pip_mng->setBoundaryLhsIntegrationRule(integration_rule_bc);
773  CHKERR pip_mng->setBoundaryRhsIntegrationRule(integration_rule_bc);
774 
775  auto create_reaction_pipeline = [&](auto &pip) {
778  pip, {H1}, "GEOMETRY");
779  CHKERR PlasticOps::opFactoryDomainReactions<SPACE_DIM, AT, IT, DomainEleOp>(
780  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU");
782  };
783 
784  reactionFe = boost::make_shared<DomainEle>(mField);
785  reactionFe->getRuleHook = vol_rule;
786  CHKERR create_reaction_pipeline(reactionFe->getOpPtrVector());
787  reactionFe->postProcessHook =
789 
791 }

◆ 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 1172 of file dynamic_first_order_con_law.cpp.

1172  {
1174  PetscBool test_flg = PETSC_FALSE;
1175  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-test", &test_flg, PETSC_NULL);
1176  if (test_flg) {
1177  auto *simple = mField.getInterface<Simple>();
1178  auto T = createDMVector(simple->getDM());
1179  CHKERR DMoFEMMeshToLocalVector(simple->getDM(), T, INSERT_VALUES,
1180  SCATTER_FORWARD);
1181  double nrm2;
1182  CHKERR VecNorm(T, NORM_2, &nrm2);
1183  MOFEM_LOG("EXAMPLE", Sev::inform) << "Regression norm " << nrm2;
1184  constexpr double regression_value = 0.0194561;
1185  if (fabs(nrm2 - regression_value) > 1e-2)
1186  SETERRQ(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
1187  "Regression test failed; wrong norm value.");
1188  }
1190 }

◆ 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 462 of file dynamic_first_order_con_law.cpp.

462  {
464  auto simple = mField.getInterface<Simple>();
465 
466  CHKERR simple->getOptions();
467  CHKERR simple->loadFile();
469 }

◆ 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 256 of file plastic.cpp.

256  {
260  CHKERR bC();
261  CHKERR OPs();
262  PetscBool test_ops = PETSC_FALSE;
263  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-test_operators", &test_ops,
264  PETSC_NULL);
265  if (test_ops == PETSC_FALSE) {
266  CHKERR tsSolve();
267  } else {
269  }
271 }

◆ 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 275 of file plastic.cpp.

275  {
278 
279  Range domain_ents;
280  CHKERR mField.get_moab().get_entities_by_dimension(0, SPACE_DIM, domain_ents,
281  true);
282  auto get_ents_by_dim = [&](const auto dim) {
283  if (dim == SPACE_DIM) {
284  return domain_ents;
285  } else {
286  Range ents;
287  if (dim == 0)
288  CHKERR mField.get_moab().get_connectivity(domain_ents, ents, true);
289  else
290  CHKERR mField.get_moab().get_entities_by_dimension(0, dim, ents, true);
291  return ents;
292  }
293  };
294 
295  auto get_base = [&]() {
296  auto domain_ents = get_ents_by_dim(SPACE_DIM);
297  if (domain_ents.empty())
298  CHK_THROW_MESSAGE(MOFEM_NOT_FOUND, "Empty mesh");
299  const auto type = type_from_handle(domain_ents[0]);
300  switch (type) {
301  case MBQUAD:
302  return DEMKOWICZ_JACOBI_BASE;
303  case MBHEX:
304  return DEMKOWICZ_JACOBI_BASE;
305  case MBTRI:
307  case MBTET:
309  default:
310  CHK_THROW_MESSAGE(MOFEM_NOT_FOUND, "Element type not handled");
311  }
312  return NOBASE;
313  };
314 
315  const auto base = get_base();
316  MOFEM_LOG("PLASTICITY", Sev::inform)
317  << "Base " << ApproximationBaseNames[base];
318 
319  CHKERR simple->addDomainField("U", H1, base, SPACE_DIM);
320  CHKERR simple->addDomainField("EP", L2, base, size_symm);
321  CHKERR simple->addDomainField("TAU", L2, base, 1);
322  CHKERR simple->addBoundaryField("U", H1, base, SPACE_DIM);
323 
324  CHKERR simple->addDataField("GEOMETRY", H1, base, SPACE_DIM);
325 
326  PetscBool order_edge = PETSC_FALSE;
327  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-order_edge", &order_edge,
328  PETSC_NULL);
329  PetscBool order_face = PETSC_FALSE;
330  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-order_face", &order_face,
331  PETSC_NULL);
332  PetscBool order_volume = PETSC_FALSE;
333  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-order_volume", &order_volume,
334  PETSC_NULL);
335 
336  if (order_edge || order_face || order_volume) {
337 
338  MOFEM_LOG("PLASTICITY", Sev::inform) << "Order edge " << order_edge
339  ? "true"
340  : "false";
341  MOFEM_LOG("PLASTICITY", Sev::inform) << "Order face " << order_face
342  ? "true"
343  : "false";
344  MOFEM_LOG("PLASTICITY", Sev::inform) << "Order volume " << order_volume
345  ? "true"
346  : "false";
347 
348  auto ents = get_ents_by_dim(0);
349  if (order_edge)
350  ents.merge(get_ents_by_dim(1));
351  if (order_face)
352  ents.merge(get_ents_by_dim(2));
353  if (order_volume)
354  ents.merge(get_ents_by_dim(3));
355  CHKERR simple->setFieldOrder("U", order, &ents);
356  } else {
357  CHKERR simple->setFieldOrder("U", order);
358  }
359  CHKERR simple->setFieldOrder("EP", ep_order);
360  CHKERR simple->setFieldOrder("TAU", tau_order);
361 
362  CHKERR simple->setFieldOrder("GEOMETRY", geom_order);
363 
364 #ifdef ADD_CONTACT
365  CHKERR simple->addDomainField("SIGMA", CONTACT_SPACE, DEMKOWICZ_JACOBI_BASE,
366  SPACE_DIM);
367  CHKERR simple->addBoundaryField("SIGMA", CONTACT_SPACE, DEMKOWICZ_JACOBI_BASE,
368  SPACE_DIM);
369 
370  auto get_skin = [&]() {
371  Range body_ents;
372  CHKERR mField.get_moab().get_entities_by_dimension(0, SPACE_DIM, body_ents);
373  Skinner skin(&mField.get_moab());
374  Range skin_ents;
375  CHKERR skin.find_skin(0, body_ents, false, skin_ents);
376  return skin_ents;
377  };
378 
379  auto filter_blocks = [&](auto skin) {
380  bool is_contact_block = true;
381  Range contact_range;
382  for (auto m :
384 
385  (boost::format("%s(.*)") % "CONTACT").str()
386 
387  ))
388 
389  ) {
390  is_contact_block =
391  true; ///< blocs interation is collective, so that is set irrespective
392  ///< if there are entities in given rank or not in the block
393  MOFEM_LOG("CONTACT", Sev::inform)
394  << "Find contact block set: " << m->getName();
395  auto meshset = m->getMeshset();
396  Range contact_meshset_range;
397  CHKERR mField.get_moab().get_entities_by_dimension(
398  meshset, SPACE_DIM - 1, contact_meshset_range, true);
399 
400  CHKERR mField.getInterface<CommInterface>()->synchroniseEntities(
401  contact_meshset_range);
402  contact_range.merge(contact_meshset_range);
403  }
404  if (is_contact_block) {
405  MOFEM_LOG("SYNC", Sev::inform)
406  << "Nb entities in contact surface: " << contact_range.size();
408  skin = intersect(skin, contact_range);
409  }
410  return skin;
411  };
412 
413  auto filter_true_skin = [&](auto skin) {
414  Range boundary_ents;
415  ParallelComm *pcomm =
416  ParallelComm::get_pcomm(&mField.get_moab(), MYPCOMM_INDEX);
417  CHKERR pcomm->filter_pstatus(skin, PSTATUS_SHARED | PSTATUS_MULTISHARED,
418  PSTATUS_NOT, -1, &boundary_ents);
419  return boundary_ents;
420  };
421 
422  auto boundary_ents = filter_true_skin(filter_blocks(get_skin()));
423  CHKERR simple->setFieldOrder("SIGMA", 0);
424  CHKERR simple->setFieldOrder("SIGMA", order - 1, &boundary_ents);
425 #endif
426 
427  CHKERR simple->setUp();
428  CHKERR simple->addFieldToEmptyFieldBlocks("U", "TAU");
429 
430  auto project_ho_geometry = [&]() {
431  Projection10NodeCoordsOnField ent_method(mField, "GEOMETRY");
432  return mField.loop_dofs("GEOMETRY", ent_method);
433  };
434  PetscBool project_geometry = PETSC_TRUE;
435  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-project_geometry",
436  &project_geometry, PETSC_NULL);
437  if (project_geometry) {
438  CHKERR project_ho_geometry();
439  }
440 
441  auto get_volume = [&]() {
443  auto *op_ptr = new VolOp(NOSPACE, VolOp::OPSPACE);
444  std::array<double, 2> volume_and_count;
445  op_ptr->doWorkRhsHook = [&](DataOperator *base_op_ptr, int side,
446  EntityType type,
449  auto op_ptr = static_cast<VolOp *>(base_op_ptr);
450  volume_and_count[VOL] += op_ptr->getMeasure();
451  volume_and_count[COUNT] += 1;
452  // in necessary at integration over Gauss points.
454  };
455  volume_and_count = {0, 0};
456  auto fe = boost::make_shared<DomainEle>(mField);
457  fe->getOpPtrVector().push_back(op_ptr);
458 
459  auto dm = simple->getDM();
461  DMoFEMLoopFiniteElements(dm, simple->getDomainFEName(), fe),
462  "cac volume");
463  std::array<double, 2> tot_volume_and_count;
464  MPI_Allreduce(volume_and_count.data(), tot_volume_and_count.data(),
465  volume_and_count.size(), MPI_DOUBLE, MPI_SUM,
466  mField.get_comm());
467  return tot_volume_and_count;
468  };
469 
470  meshVolumeAndCount = get_volume();
471  MOFEM_LOG("PLASTICITY", Sev::inform)
472  << "Mesh volume " << meshVolumeAndCount[VOL] << " nb. of elements "
474 
476 }

◆ 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 884 of file dynamic_first_order_con_law.cpp.

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

◆ testOperators()

MoFEMErrorCode Example::testOperators ( )
private

[Solve]

[TestOperators]

Examples
plastic.cpp.

Definition at line 1457 of file plastic.cpp.

1457  {
1459 
1460  // get operators tester
1461  auto simple = mField.getInterface<Simple>();
1462  auto opt = mField.getInterface<OperatorsTester>(); // get interface to
1463  // OperatorsTester
1464  auto pip = mField.getInterface<PipelineManager>(); // get interface to
1465  // pipeline manager
1466 
1467  constexpr double eps = 1e-9;
1468 
1469  auto x = opt->setRandomFields(simple->getDM(), {
1470 
1471  {"U", {-1e-6, 1e-6}},
1472 
1473  {"EP", {-1e-6, 1e-6}},
1474 
1475  {"TAU", {0, 1e-4}}
1476 
1477  });
1478 
1479  auto dot_x_plastic_active =
1480  opt->setRandomFields(simple->getDM(), {
1481 
1482  {"U", {-1, 1}},
1483 
1484  {"EP", {-1, 1}},
1485 
1486  {"TAU", {0.1, 1}}
1487 
1488  });
1489  auto diff_x_plastic_active =
1490  opt->setRandomFields(simple->getDM(), {
1491 
1492  {"U", {-1, 1}},
1493 
1494  {"EP", {-1, 1}},
1495 
1496  {"TAU", {-1, 1}}
1497 
1498  });
1499 
1500  auto dot_x_elastic =
1501  opt->setRandomFields(simple->getDM(), {
1502 
1503  {"U", {-1, 1}},
1504 
1505  {"EP", {-1, 1}},
1506 
1507  {"TAU", {-1, -0.1}}
1508 
1509  });
1510  auto diff_x_elastic =
1511  opt->setRandomFields(simple->getDM(), {
1512 
1513  {"U", {-1, 1}},
1514 
1515  {"EP", {-1, 1}},
1516 
1517  {"TAU", {-1, 1}}
1518 
1519  });
1520 
1521  auto test_domain_ops = [&](auto fe_name, auto lhs_pipeline, auto rhs_pipeline,
1522  auto dot_x, auto diff_x) {
1524 
1525  auto diff_res = opt->checkCentralFiniteDifference(
1526  simple->getDM(), fe_name, rhs_pipeline, lhs_pipeline, x, dot_x,
1527  SmartPetscObj<Vec>(), diff_x, 0, 0.5, eps);
1528 
1529  // Calculate norm of difference between directional derivative calculated
1530  // from finite difference, and tangent matrix.
1531  double fnorm;
1532  CHKERR VecNorm(diff_res, NORM_2, &fnorm);
1533  MOFEM_LOG_C("PLASTICITY", Sev::inform,
1534  "Test consistency of tangent matrix %3.4e", fnorm);
1535 
1536  constexpr double err = 1e-5;
1537  if (fnorm > err)
1538  SETERRQ1(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
1539  "Norm of directional derivative too large err = %3.4e", fnorm);
1540 
1542  };
1543 
1544  MOFEM_LOG("PLASTICITY", Sev::inform) << "Elastic active";
1545  CHKERR test_domain_ops(simple->getDomainFEName(), pip->getDomainLhsFE(),
1546  pip->getDomainRhsFE(), dot_x_elastic, diff_x_elastic);
1547 
1548  MOFEM_LOG("PLASTICITY", Sev::inform) << "Plastic active";
1549  CHKERR test_domain_ops(simple->getDomainFEName(), pip->getDomainLhsFE(),
1550  pip->getDomainRhsFE(), dot_x_plastic_active,
1551  diff_x_plastic_active);
1552 
1554 };

◆ tsSolve()

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

Definition at line 818 of file plastic.cpp.

818  {
820 
823  ISManager *is_manager = mField.getInterface<ISManager>();
824 
825  auto snes_ctx_ptr = getDMSnesCtx(simple->getDM());
826 
827  auto set_section_monitor = [&](auto solver) {
829  SNES snes;
830  CHKERR TSGetSNES(solver, &snes);
831  CHKERR SNESMonitorSet(snes,
832  (MoFEMErrorCode(*)(SNES, PetscInt, PetscReal,
833  void *))MoFEMSNESMonitorFields,
834  (void *)(snes_ctx_ptr.get()), nullptr);
836  };
837 
838  auto create_post_process_elements = [&]() {
839  auto push_vol_ops = [this](auto &pip) {
841  pip, {H1, HDIV}, "GEOMETRY");
842 
843  auto [common_plastic_ptr, common_hencky_ptr] =
844  PlasticOps::createCommonPlasticOps<SPACE_DIM, IT, DomainEleOp>(
845  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU", 1., Sev::inform);
846 
847  if (common_hencky_ptr) {
848  if (common_plastic_ptr->mGradPtr != common_hencky_ptr->matGradPtr)
849  CHK_THROW_MESSAGE(MOFEM_DATA_INCONSISTENCY, "Wrong pointer for grad");
850  }
851 
852  return std::make_pair(common_plastic_ptr, common_hencky_ptr);
853  };
854 
855  auto push_vol_post_proc_ops = [this](auto &pp_fe, auto &&p) {
857 
858  auto &pip = pp_fe->getOpPtrVector();
859 
860  auto [common_plastic_ptr, common_hencky_ptr] = p;
861 
863 
864  auto x_ptr = boost::make_shared<MatrixDouble>();
865  pip.push_back(
866  new OpCalculateVectorFieldValues<SPACE_DIM>("GEOMETRY", x_ptr));
867  auto u_ptr = boost::make_shared<MatrixDouble>();
868  pip.push_back(new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
869 
870  if (is_large_strains) {
871 
872  pip.push_back(
873 
874  new OpPPMap(
875 
876  pp_fe->getPostProcMesh(), pp_fe->getMapGaussPts(),
877 
878  {{"PLASTIC_SURFACE",
879  common_plastic_ptr->getPlasticSurfacePtr()},
880  {"PLASTIC_MULTIPLIER",
881  common_plastic_ptr->getPlasticTauPtr()}},
882 
883  {{"U", u_ptr}, {"GEOMETRY", x_ptr}},
884 
885  {{"GRAD", common_hencky_ptr->matGradPtr},
886  {"FIRST_PIOLA", common_hencky_ptr->getMatFirstPiolaStress()}},
887 
888  {{"HENCKY_STRAIN", common_hencky_ptr->getMatLogC()},
889  {"PLASTIC_STRAIN", common_plastic_ptr->getPlasticStrainPtr()},
890  {"PLASTIC_FLOW", common_plastic_ptr->getPlasticFlowPtr()}}
891 
892  )
893 
894  );
895 
896  } else {
897 
898  pip.push_back(
899 
900  new OpPPMap(
901 
902  pp_fe->getPostProcMesh(), pp_fe->getMapGaussPts(),
903 
904  {{"PLASTIC_SURFACE",
905  common_plastic_ptr->getPlasticSurfacePtr()},
906  {"PLASTIC_MULTIPLIER",
907  common_plastic_ptr->getPlasticTauPtr()}},
908 
909  {{"U", u_ptr}, {"GEOMETRY", x_ptr}},
910 
911  {},
912 
913  {{"STRAIN", common_plastic_ptr->mStrainPtr},
914  {"STRESS", common_plastic_ptr->mStressPtr},
915  {"PLASTIC_STRAIN", common_plastic_ptr->getPlasticStrainPtr()},
916  {"PLASTIC_FLOW", common_plastic_ptr->getPlasticFlowPtr()}}
917 
918  )
919 
920  );
921  }
922 
924  };
925 
926  PetscBool post_proc_vol;
927  PetscBool post_proc_skin;
928 
929  if constexpr (SPACE_DIM == 2) {
930  post_proc_vol = PETSC_TRUE;
931  post_proc_skin = PETSC_FALSE;
932  } else {
933  post_proc_vol = PETSC_FALSE;
934  post_proc_skin = PETSC_TRUE;
935  }
936  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-post_proc_vol", &post_proc_vol,
937  PETSC_NULL);
938  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-post_proc_skin",
939  &post_proc_skin, PETSC_NULL);
940 
941  auto vol_post_proc = [this, push_vol_post_proc_ops, push_vol_ops,
942  post_proc_vol]() {
943  if (post_proc_vol == PETSC_FALSE)
944  return boost::shared_ptr<PostProcEle>();
945  auto pp_fe = boost::make_shared<PostProcEle>(mField);
947  push_vol_post_proc_ops(pp_fe, push_vol_ops(pp_fe->getOpPtrVector())),
948  "push_vol_post_proc_ops");
949  return pp_fe;
950  };
951 
952  auto skin_post_proc = [this, push_vol_post_proc_ops, push_vol_ops,
953  post_proc_skin]() {
954  if (post_proc_skin == PETSC_FALSE)
955  return boost::shared_ptr<SkinPostProcEle>();
956 
957  auto simple = mField.getInterface<Simple>();
958  auto pp_fe = boost::make_shared<SkinPostProcEle>(mField);
959  auto op_side = new OpLoopSide<SideEle>(mField, simple->getDomainFEName(),
960  SPACE_DIM, Sev::verbose);
961  pp_fe->getOpPtrVector().push_back(op_side);
962  CHK_MOAB_THROW(push_vol_post_proc_ops(
963  pp_fe, push_vol_ops(op_side->getOpPtrVector())),
964  "push_vol_post_proc_ops");
965  return pp_fe;
966  };
967 
968  return std::make_pair(vol_post_proc(), skin_post_proc());
969  };
970 
971  auto scatter_create = [&](auto D, auto coeff) {
973  CHKERR is_manager->isCreateProblemFieldAndRank(simple->getProblemName(),
974  ROW, "U", coeff, coeff, is);
975  int loc_size;
976  CHKERR ISGetLocalSize(is, &loc_size);
977  Vec v;
978  CHKERR VecCreateMPI(mField.get_comm(), loc_size, PETSC_DETERMINE, &v);
979  VecScatter scatter;
980  CHKERR VecScatterCreate(D, is, v, PETSC_NULL, &scatter);
981  return std::make_tuple(SmartPetscObj<Vec>(v),
982  SmartPetscObj<VecScatter>(scatter));
983  };
984 
985  boost::shared_ptr<SetPtsData> field_eval_data;
986  boost::shared_ptr<MatrixDouble> u_field_ptr;
987 
988  std::array<double, SPACE_DIM> field_eval_coords;
989  int coords_dim = SPACE_DIM;
990  CHKERR PetscOptionsGetRealArray(NULL, NULL, "-field_eval_coords",
991  field_eval_coords.data(), &coords_dim,
992  &do_eval_field);
993 
994  boost::shared_ptr<std::map<std::string, boost::shared_ptr<VectorDouble>>>
995  scalar_field_ptrs = boost::make_shared<
996  std::map<std::string, boost::shared_ptr<VectorDouble>>>();
997  boost::shared_ptr<std::map<std::string, boost::shared_ptr<MatrixDouble>>>
998  vector_field_ptrs = boost::make_shared<
999  std::map<std::string, boost::shared_ptr<MatrixDouble>>>();
1000  boost::shared_ptr<std::map<std::string, boost::shared_ptr<MatrixDouble>>>
1001  sym_tensor_field_ptrs = boost::make_shared<
1002  std::map<std::string, boost::shared_ptr<MatrixDouble>>>();
1003  boost::shared_ptr<std::map<std::string, boost::shared_ptr<MatrixDouble>>>
1004  tensor_field_ptrs = boost::make_shared<
1005  std::map<std::string, boost::shared_ptr<MatrixDouble>>>();
1006 
1007  if (do_eval_field) {
1008  auto u_field_ptr = boost::make_shared<MatrixDouble>();
1009  field_eval_data =
1010  mField.getInterface<FieldEvaluatorInterface>()->getData<DomainEle>();
1011 
1012  CHKERR mField.getInterface<FieldEvaluatorInterface>()->buildTree<SPACE_DIM>(
1013  field_eval_data, simple->getDomainFEName());
1014 
1015  field_eval_data->setEvalPoints(field_eval_coords.data(), 1);
1016  auto no_rule = [](int, int, int) { return -1; };
1017  auto field_eval_fe_ptr = field_eval_data->feMethodPtr.lock();
1018  field_eval_fe_ptr->getRuleHook = no_rule;
1019 
1021  field_eval_fe_ptr->getOpPtrVector(), {H1, HDIV}, "GEOMETRY");
1022 
1023  auto [common_plastic_ptr, common_hencky_ptr] =
1024  PlasticOps::createCommonPlasticOps<SPACE_DIM, IT, DomainEleOp>(
1025  mField, "MAT_PLASTIC", field_eval_fe_ptr->getOpPtrVector(), "U",
1026  "EP", "TAU", 1., Sev::inform);
1027 
1028  field_eval_fe_ptr->getOpPtrVector().push_back(
1029  new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_field_ptr));
1030 
1031  if ((common_plastic_ptr) && (common_hencky_ptr) && (scalar_field_ptrs)) {
1032  if (is_large_strains) {
1033  scalar_field_ptrs->insert(
1034  {"PLASTIC_SURFACE", common_plastic_ptr->getPlasticSurfacePtr()});
1035  scalar_field_ptrs->insert(
1036  {"PLASTIC_MULTIPLIER", common_plastic_ptr->getPlasticTauPtr()});
1037  vector_field_ptrs->insert({"U", u_field_ptr});
1038  sym_tensor_field_ptrs->insert(
1039  {"PLASTIC_STRAIN", common_plastic_ptr->getPlasticStrainPtr()});
1040  sym_tensor_field_ptrs->insert(
1041  {"PLASTIC_FLOW", common_plastic_ptr->getPlasticFlowPtr()});
1042  sym_tensor_field_ptrs->insert(
1043  {"HENCKY_STRAIN", common_hencky_ptr->getMatLogC()});
1044  tensor_field_ptrs->insert({"GRAD", common_hencky_ptr->matGradPtr});
1045  tensor_field_ptrs->insert(
1046  {"FIRST_PIOLA", common_hencky_ptr->getMatFirstPiolaStress()});
1047  } else {
1048  scalar_field_ptrs->insert(
1049  {"PLASTIC_SURFACE", common_plastic_ptr->getPlasticSurfacePtr()});
1050  scalar_field_ptrs->insert(
1051  {"PLASTIC_MULTIPLIER", common_plastic_ptr->getPlasticTauPtr()});
1052  vector_field_ptrs->insert({"U", u_field_ptr});
1053  sym_tensor_field_ptrs->insert(
1054  {"STRAIN", common_plastic_ptr->mStrainPtr});
1055  sym_tensor_field_ptrs->insert(
1056  {"STRESS", common_plastic_ptr->mStressPtr});
1057  sym_tensor_field_ptrs->insert(
1058  {"PLASTIC_STRAIN", common_plastic_ptr->getPlasticStrainPtr()});
1059  sym_tensor_field_ptrs->insert(
1060  {"PLASTIC_FLOW", common_plastic_ptr->getPlasticFlowPtr()});
1061  }
1062  }
1063  }
1064 
1065  auto test_monitor_ptr = boost::make_shared<FEMethod>();
1066 
1067  auto set_time_monitor = [&](auto dm, auto solver) {
1069  boost::shared_ptr<Monitor<SPACE_DIM>> monitor_ptr(new Monitor<SPACE_DIM>(
1070  dm, create_post_process_elements(), reactionFe, uXScatter, uYScatter,
1071  uZScatter, field_eval_coords, field_eval_data, scalar_field_ptrs,
1072  vector_field_ptrs, sym_tensor_field_ptrs, tensor_field_ptrs));
1073  boost::shared_ptr<ForcesAndSourcesCore> null;
1074 
1075  test_monitor_ptr->postProcessHook = [&]() {
1077 
1078  if (atom_test && fabs(test_monitor_ptr->ts_t - 0.5) < 1e-12 &&
1079  test_monitor_ptr->ts_step == 25) {
1080 
1081  if (scalar_field_ptrs->at("PLASTIC_MULTIPLIER")->size()) {
1082  auto t_tau =
1083  getFTensor0FromVec(*scalar_field_ptrs->at("PLASTIC_MULTIPLIER"));
1084  MOFEM_LOG("PlasticSync", Sev::inform) << "Eval point tau: " << t_tau;
1085 
1086  if (atom_test == 1 && fabs(t_tau - 0.688861) > 1e-5) {
1087  SETERRQ1(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
1088  "atom test %d failed: wrong plastic multiplier value",
1089  atom_test);
1090  }
1091  }
1092 
1093  if (vector_field_ptrs->at("U")->size1()) {
1095  auto t_disp =
1096  getFTensor1FromMat<SPACE_DIM>(*vector_field_ptrs->at("U"));
1097  MOFEM_LOG("PlasticSync", Sev::inform) << "Eval point U: " << t_disp;
1098 
1099  if (atom_test == 1 && fabs(t_disp(0) - 0.25 / 2.) > 1e-5 ||
1100  fabs(t_disp(1) + 0.0526736) > 1e-5 || fabs(t_disp(2)) > 1e-5) {
1101  SETERRQ1(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
1102  "atom test %d failed: wrong displacement value",
1103  atom_test);
1104  }
1105  }
1106 
1107  if (sym_tensor_field_ptrs->at("PLASTIC_STRAIN")->size1()) {
1108  auto t_plastic_strain = getFTensor2SymmetricFromMat<SPACE_DIM>(
1109  *sym_tensor_field_ptrs->at("PLASTIC_STRAIN"));
1110  MOFEM_LOG("PlasticSync", Sev::inform)
1111  << "Eval point EP: " << t_plastic_strain;
1112 
1113  if (atom_test == 1 &&
1114  fabs(t_plastic_strain(0, 0) - 0.221943) > 1e-5 ||
1115  fabs(t_plastic_strain(0, 1)) > 1e-5 ||
1116  fabs(t_plastic_strain(1, 1) + 0.110971) > 1e-5) {
1117  SETERRQ1(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
1118  "atom test %d failed: wrong plastic strain value",
1119  atom_test);
1120  }
1121  }
1122 
1123  if (tensor_field_ptrs->at("FIRST_PIOLA")->size1()) {
1124  auto t_piola_stress = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(
1125  *tensor_field_ptrs->at("FIRST_PIOLA"));
1126  MOFEM_LOG("PlasticSync", Sev::inform)
1127  << "Eval point Piola stress: " << t_piola_stress;
1128 
1129  if (atom_test == 1 && fabs((t_piola_stress(0, 0) - 198.775) /
1130  t_piola_stress(0, 0)) > 1e-5 ||
1131  fabs(t_piola_stress(0, 1)) + fabs(t_piola_stress(1, 0)) +
1132  fabs(t_piola_stress(1, 1)) >
1133  1e-5) {
1134  SETERRQ1(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
1135  "atom test %d failed: wrong Piola stress value",
1136  atom_test);
1137  }
1138  }
1139  }
1140 
1143  };
1144 
1145  CHKERR DMMoFEMTSSetMonitor(dm, solver, simple->getDomainFEName(),
1146  monitor_ptr, null, test_monitor_ptr);
1147 
1149  };
1150 
1151  auto set_schur_pc = [&](auto solver,
1152  boost::shared_ptr<SetUpSchur> &schur_ptr) {
1154 
1155  auto name_prb = simple->getProblemName();
1156 
1157  // create sub dm for Schur complement
1158  auto create_schur_dm = [&](SmartPetscObj<DM> base_dm,
1159  SmartPetscObj<DM> &dm_sub) {
1161  dm_sub = createDM(mField.get_comm(), "DMMOFEM");
1162  CHKERR DMMoFEMCreateSubDM(dm_sub, base_dm, "SCHUR");
1163  CHKERR DMMoFEMSetSquareProblem(dm_sub, PETSC_TRUE);
1164  CHKERR DMMoFEMAddElement(dm_sub, simple->getDomainFEName());
1165  CHKERR DMMoFEMAddElement(dm_sub, simple->getBoundaryFEName());
1166  for (auto f : {"U"}) {
1167  CHKERR DMMoFEMAddSubFieldRow(dm_sub, f);
1168  CHKERR DMMoFEMAddSubFieldCol(dm_sub, f);
1169  }
1170  CHKERR DMSetUp(dm_sub);
1171 
1173  };
1174 
1175  auto create_block_dm = [&](SmartPetscObj<DM> base_dm,
1176  SmartPetscObj<DM> &dm_sub) {
1178  dm_sub = createDM(mField.get_comm(), "DMMOFEM");
1179  CHKERR DMMoFEMCreateSubDM(dm_sub, base_dm, "BLOCK");
1180  CHKERR DMMoFEMSetSquareProblem(dm_sub, PETSC_TRUE);
1181  CHKERR DMMoFEMAddElement(dm_sub, simple->getDomainFEName());
1182  CHKERR DMMoFEMAddElement(dm_sub, simple->getBoundaryFEName());
1183 #ifdef ADD_CONTACT
1184  for (auto f : {"SIGMA", "EP", "TAU"}) {
1185  CHKERR DMMoFEMAddSubFieldRow(dm_sub, f);
1186  CHKERR DMMoFEMAddSubFieldCol(dm_sub, f);
1187  }
1188 #else
1189  for (auto f : {"EP", "TAU"}) {
1190  CHKERR DMMoFEMAddSubFieldRow(dm_sub, f);
1191  CHKERR DMMoFEMAddSubFieldCol(dm_sub, f);
1192  }
1193 #endif
1194  CHKERR DMSetUp(dm_sub);
1196  };
1197 
1198  // Create nested (sub BC) Schur DM
1199  if constexpr (AT == AssemblyType::BLOCK_SCHUR) {
1200 
1201  SmartPetscObj<DM> dm_schur;
1202  CHKERR create_schur_dm(simple->getDM(), dm_schur);
1203  SmartPetscObj<DM> dm_block;
1204  CHKERR create_block_dm(simple->getDM(), dm_block);
1205 
1206 #ifdef ADD_CONTACT
1207 
1208  auto get_nested_mat_data = [&](auto schur_dm, auto block_dm) {
1209  auto block_mat_data = createBlockMatStructure(
1210  simple->getDM(),
1211 
1212  {
1213 
1214  {simple->getDomainFEName(),
1215 
1216  {{"U", "U"},
1217  {"SIGMA", "SIGMA"},
1218  {"U", "SIGMA"},
1219  {"SIGMA", "U"},
1220  {"EP", "EP"},
1221  {"TAU", "TAU"},
1222  {"U", "EP"},
1223  {"EP", "U"},
1224  {"EP", "TAU"},
1225  {"TAU", "EP"},
1226  {"TAU", "U"}
1227 
1228  }},
1229 
1230  {simple->getBoundaryFEName(),
1231 
1232  {{"SIGMA", "SIGMA"}, {"U", "SIGMA"}, {"SIGMA", "U"}
1233 
1234  }}
1235 
1236  }
1237 
1238  );
1239 
1241 
1242  {dm_schur, dm_block}, block_mat_data,
1243 
1244  {"SIGMA", "EP", "TAU"}, {nullptr, nullptr, nullptr}, true
1245 
1246  );
1247  };
1248 
1249 #else
1250 
1251  auto get_nested_mat_data = [&](auto schur_dm, auto block_dm) {
1252  auto block_mat_data =
1254 
1255  {{simple->getDomainFEName(),
1256 
1257  {{"U", "U"},
1258  {"EP", "EP"},
1259  {"TAU", "TAU"},
1260  {"U", "EP"},
1261  {"EP", "U"},
1262  {"EP", "TAU"},
1263  {"TAU", "U"},
1264  {"TAU", "EP"}
1265 
1266  }}}
1267 
1268  );
1269 
1271 
1272  {dm_schur, dm_block}, block_mat_data,
1273 
1274  {"EP", "TAU"}, {nullptr, nullptr}, false
1275 
1276  );
1277  };
1278 
1279 #endif
1280 
1281  auto nested_mat_data = get_nested_mat_data(dm_schur, dm_block);
1282  CHKERR DMMoFEMSetNestSchurData(simple->getDM(), nested_mat_data);
1283 
1284  auto block_is = getDMSubData(dm_block)->getSmartRowIs();
1285  auto ao_schur = getDMSubData(dm_schur)->getSmartRowMap();
1286 
1287  // Indices has to be map fro very to level, while assembling Schur
1288  // complement.
1289  schur_ptr =
1290  SetUpSchur::createSetUpSchur(mField, dm_schur, block_is, ao_schur);
1291  CHKERR schur_ptr->setUp(solver);
1292  }
1293 
1295  };
1296 
1297  auto dm = simple->getDM();
1298  auto D = createDMVector(dm);
1299  auto DD = vectorDuplicate(D);
1300  uXScatter = scatter_create(D, 0);
1301  uYScatter = scatter_create(D, 1);
1302  if constexpr (SPACE_DIM == 3)
1303  uZScatter = scatter_create(D, 2);
1304 
1305  auto create_solver = [pip_mng]() {
1306  if (is_quasi_static == PETSC_TRUE)
1307  return pip_mng->createTSIM();
1308  else
1309  return pip_mng->createTSIM2();
1310  };
1311 
1312  auto solver = create_solver();
1313 
1314  auto active_pre_lhs = []() {
1316  std::fill(PlasticOps::CommonData::activityData.begin(),
1319  };
1320 
1321  auto active_post_lhs = [&]() {
1323  auto get_iter = [&]() {
1324  SNES snes;
1325  CHK_THROW_MESSAGE(TSGetSNES(solver, &snes), "Can not get SNES");
1326  int iter;
1327  CHK_THROW_MESSAGE(SNESGetIterationNumber(snes, &iter),
1328  "Can not get iter");
1329  return iter;
1330  };
1331 
1332  auto iter = get_iter();
1333  if (iter >= 0) {
1334 
1335  std::array<int, 5> activity_data;
1336  std::fill(activity_data.begin(), activity_data.end(), 0);
1337  MPI_Allreduce(PlasticOps::CommonData::activityData.data(),
1338  activity_data.data(), activity_data.size(), MPI_INT,
1339  MPI_SUM, mField.get_comm());
1340 
1341  int &active_points = activity_data[0];
1342  int &avtive_full_elems = activity_data[1];
1343  int &avtive_elems = activity_data[2];
1344  int &nb_points = activity_data[3];
1345  int &nb_elements = activity_data[4];
1346 
1347  if (nb_points) {
1348 
1349  double proc_nb_points =
1350  100 * static_cast<double>(active_points) / nb_points;
1351  double proc_nb_active =
1352  100 * static_cast<double>(avtive_elems) / nb_elements;
1353  double proc_nb_full_active = 100;
1354  if (avtive_elems)
1355  proc_nb_full_active =
1356  100 * static_cast<double>(avtive_full_elems) / avtive_elems;
1357 
1358  MOFEM_LOG_C("PLASTICITY", Sev::inform,
1359  "Iter %d nb pts %d nb active pts %d (%3.3f\%) nb active "
1360  "elements %d "
1361  "(%3.3f\%) nb full active elems %d (%3.3f\%)",
1362  iter, nb_points, active_points, proc_nb_points,
1363  avtive_elems, proc_nb_active, avtive_full_elems,
1364  proc_nb_full_active, iter);
1365  }
1366  }
1367 
1369  };
1370 
1371  auto add_active_dofs_elem = [&](auto dm) {
1373  auto fe_pre_proc = boost::make_shared<FEMethod>();
1374  fe_pre_proc->preProcessHook = active_pre_lhs;
1375  auto fe_post_proc = boost::make_shared<FEMethod>();
1376  fe_post_proc->postProcessHook = active_post_lhs;
1377  auto ts_ctx_ptr = getDMTsCtx(dm);
1378  ts_ctx_ptr->getPreProcessIJacobian().push_front(fe_pre_proc);
1379  ts_ctx_ptr->getPostProcessIJacobian().push_back(fe_post_proc);
1381  };
1382 
1383  auto set_essential_bc = [&](auto dm, auto solver) {
1385  // This is low level pushing finite elements (pipelines) to solver
1386 
1387  auto pre_proc_ptr = boost::make_shared<FEMethod>();
1388  auto post_proc_rhs_ptr = boost::make_shared<FEMethod>();
1389  auto post_proc_lhs_ptr = boost::make_shared<FEMethod>();
1390 
1391  // Add boundary condition scaling
1392  auto disp_time_scale = boost::make_shared<TimeScale>();
1393 
1394  auto get_bc_hook_rhs = [this, pre_proc_ptr, disp_time_scale]() {
1396  {disp_time_scale}, false);
1397  return hook;
1398  };
1399  pre_proc_ptr->preProcessHook = get_bc_hook_rhs();
1400 
1401  auto get_post_proc_hook_rhs = [this, post_proc_rhs_ptr]() {
1404  mField, post_proc_rhs_ptr, nullptr, Sev::verbose)();
1406  mField, post_proc_rhs_ptr, 1.)();
1408  };
1409  auto get_post_proc_hook_lhs = [this, post_proc_lhs_ptr]() {
1411  mField, post_proc_lhs_ptr, 1.);
1412  };
1413  post_proc_rhs_ptr->postProcessHook = get_post_proc_hook_rhs;
1414 
1415  auto ts_ctx_ptr = getDMTsCtx(dm);
1416  ts_ctx_ptr->getPreProcessIFunction().push_front(pre_proc_ptr);
1417  ts_ctx_ptr->getPreProcessIJacobian().push_front(pre_proc_ptr);
1418  ts_ctx_ptr->getPostProcessIFunction().push_back(post_proc_rhs_ptr);
1419  post_proc_lhs_ptr->postProcessHook = get_post_proc_hook_lhs();
1420  ts_ctx_ptr->getPostProcessIJacobian().push_back(post_proc_lhs_ptr);
1421 
1423  };
1424 
1425  if (is_quasi_static == PETSC_TRUE) {
1426  CHKERR TSSetSolution(solver, D);
1427  } else {
1428  CHKERR TS2SetSolution(solver, D, DD);
1429  }
1430 
1431  CHKERR set_section_monitor(solver);
1432  CHKERR set_time_monitor(dm, solver);
1433  CHKERR TSSetFromOptions(solver);
1434  CHKERR TSSetUp(solver);
1435 
1436  CHKERR add_active_dofs_elem(dm);
1437  boost::shared_ptr<SetUpSchur> schur_ptr;
1438  CHKERR set_schur_pc(solver, schur_ptr);
1439  CHKERR set_essential_bc(dm, solver);
1440 
1441  MOFEM_LOG_CHANNEL("TIMER");
1442  MOFEM_LOG_TAG("TIMER", "timer");
1443  if (set_timer)
1444  BOOST_LOG_SCOPED_THREAD_ATTR("Timeline", attrs::timer());
1445  MOFEM_LOG("TIMER", Sev::verbose) << "TSSetUp";
1446  CHKERR TSSetUp(solver);
1447  MOFEM_LOG("TIMER", Sev::verbose) << "TSSetUp <= done";
1448  MOFEM_LOG("TIMER", Sev::verbose) << "TSSolve";
1449  CHKERR TSSolve(solver, NULL);
1450  MOFEM_LOG("TIMER", Sev::verbose) << "TSSolve <= done";
1451 
1453 }

Friends And Related Function Documentation

◆ TSPrePostProc

friend struct TSPrePostProc
friend

Definition at line 434 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.

◆ meshVolumeAndCount

std::array<double, 2> Example::meshVolumeAndCount = {0, 0}
inlinestatic
Examples
plastic.cpp.

Definition at line 223 of file plastic.cpp.

◆ mField

MoFEM::Interface & Example::mField
private
Examples
dynamic_first_order_con_law.cpp, free_surface.cpp, and plastic.cpp.

Definition at line 226 of file plastic.cpp.

◆ 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 235 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 237 of file plastic.cpp.

◆ uYScatter

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

Definition at line 238 of file plastic.cpp.

◆ uZScatter

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

Definition at line 239 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:
NOSPACE
@ NOSPACE
Definition: definitions.h:83
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:65
Example::tsSolve
MoFEMErrorCode tsSolve()
Definition: plastic.cpp:818
MoFEM::OpPostProcMapInMoab::DataMapMat
std::map< std::string, boost::shared_ptr< MatrixDouble > > DataMapMat
Definition: PostProcBrokenMeshInMoabBase.hpp:712
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:118
omega
constexpr double omega
Save field DOFS on vertices/tags.
Definition: dynamic_first_order_con_law.cpp:92
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:455
PlasticOps::AddHOOps
Definition: plastic.cpp:184
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:57
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:3413
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:634
OpGradTimesTensor2
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpGradTimesTensor< 1, SPACE_DIM, SPACE_DIM > OpGradTimesTensor2
Definition: dynamic_first_order_con_law.cpp:75
MoFEM::DMMoFEMAddSubFieldCol
PetscErrorCode DMMoFEMAddSubFieldCol(DM dm, const char field_name[])
Definition: DMMoFEM.cpp:280
Example::CENTER_Y
@ CENTER_Y
Definition: phase.cpp:100
MoFEM::DataOperator
base operator to do operations at Gauss Pt. level
Definition: DataOperators.hpp:24
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:913
Example::CommonData::SECOND_XX
@ SECOND_XX
Definition: integration.cpp:73
MoFEM::ForcesAndSourcesCore::UserDataOperator::OPSPACE
@ OPSPACE
operator do Work is execute on space data
Definition: ForcesAndSourcesCore.hpp:570
young_modulus
double young_modulus
Young modulus.
Definition: plastic.cpp:125
MoFEM::OpSetContravariantPiolaTransformOnFace2D
OpSetContravariantPiolaTransformOnFace2DImpl< 2 > OpSetContravariantPiolaTransformOnFace2D
Definition: UserDataOperators.hpp:3511
OpMassF
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM *SPACE_DIM > OpMassF
Definition: dynamic_first_order_con_law.cpp:59
rho
double rho
Definition: plastic.cpp:144
sigmaY
double sigmaY
Yield stress.
Definition: plastic.cpp:127
OpRhsTestPiola
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpBaseTimesVector< 1, SPACE_DIM *SPACE_DIM, 1 > OpRhsTestPiola
Definition: dynamic_first_order_con_law.cpp:79
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:63
Example::CommonData::SECOND_YZ
@ SECOND_YZ
Definition: integration.cpp:77
do_eval_field
PetscBool do_eval_field
Evaluate field.
Definition: plastic.cpp:119
Example::uZScatter
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uZScatter
Definition: plastic.cpp:239
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:23
MoFEM::OpCalculateVectorFieldValues
Get values at integration pts for tensor filed rank 1, i.e. vector field.
Definition: UserDataOperators.hpp:468
TSPrePostProc::tsPostStage
static MoFEMErrorCode tsPostStage(TS ts, PetscReal stagetime, PetscInt stageindex, Vec *Y)
[Boundary condition]
Definition: dynamic_first_order_con_law.cpp:580
MoFEM::PipelineManager::getOpDomainRhsPipeline
boost::ptr_deque< UserDataOperator > & getOpDomainRhsPipeline()
Get the Op Domain Rhs Pipeline object.
Definition: PipelineManager.hpp:848
MoFEM::CoreInterface::get_comm_rank
virtual int get_comm_rank() const =0
MoFEM::EssentialPostProcRhs< DisplacementCubitBcData >
Specialization for DisplacementCubitBcData.
Definition: EssentialDisplacementCubitBcData.hpp:113
filter_true_skin
static auto filter_true_skin(MoFEM::Interface &m_field, Range &&skin)
Definition: EshelbianPlasticity.cpp:142
OpCalculateDeformationGradient
Definition: dynamic_first_order_con_law.cpp:338
MoFEM::PipelineManager
PipelineManager interface.
Definition: PipelineManager.hpp:24
bulk_modulus_K
double bulk_modulus_K
Definition: dynamic_first_order_con_law.cpp:95
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:463
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:404
k
static double k
Definition: phase.cpp:75
scale
double scale
Definition: plastic.cpp:123
MoFEM::PipelineManager::createTSIM
SmartPetscObj< TS > createTSIM(SmartPetscObj< DM > dm=nullptr)
Create TS (time) implicit solver.
Definition: PipelineManager.cpp:309
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:266
order
int order
Order displacement.
Definition: plastic.cpp:138
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:130
geom_order
int geom_order
Order if fixed.
Definition: plastic.cpp:141
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
MoFEM::ForcesAndSourcesCore::UserDataOperator::getMeasure
double getMeasure() const
get measure of element
Definition: ForcesAndSourcesCore.hpp:1276
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:597
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:62
MoFEM::PostProcBrokenMeshInMoab
Definition: PostProcBrokenMeshInMoabBase.hpp:677
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:611
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:225
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:2171
Example::uXScatter
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uXScatter
Definition: plastic.cpp:237
is_quasi_static
PetscBool is_quasi_static
Definition: plastic.cpp:143
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:27
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:103
MoFEM::getFTensor0FromVec
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
Definition: Templates.hpp:135
MOFEM_LOG_SYNCHRONISE
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
Definition: LogManager.hpp:345
cn1
double cn1
Definition: plastic.cpp:136
Example::uYScatter
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uYScatter
Definition: plastic.cpp:238
PlasticOps::Monitor
Definition: PlasticOpsMonitor.hpp:9
C1_k
double C1_k
Kinematic hardening.
Definition: plastic.cpp:133
MoFEM::OpSetContravariantPiolaTransformOnEdge2D
Definition: UserDataOperators.hpp:3521
MoFEM::OpCalculateScalarFieldValues
Get value at integration points for scalar field.
Definition: UserDataOperators.hpp:82
OpCalculatePiola
Definition: dynamic_first_order_con_law.cpp:167
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:126
MoFEM::GAUSS
@ GAUSS
Definition: FormsIntegrators.hpp:136
cn0
double cn0
Definition: plastic.cpp:135
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
get_skin
static auto get_skin(MoFEM::Interface &m_field, Range body_ents)
Definition: EshelbianPlasticity.cpp:163
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:605
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:129
lamme_lambda
double lamme_lambda
Definition: dynamic_first_order_con_law.cpp:98
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
VolOp
VolEle::UserDataOperator VolOp
Definition: test_cache_on_entities.cpp:23
t_kd
constexpr auto t_kd
Definition: free_surface.cpp:139
BiLinearForm
MOFEM_NOT_FOUND
@ MOFEM_NOT_FOUND
Definition: definitions.h:33
MoFEM::OpSetHOWeightsOnSubDim
Definition: HODataOperators.hpp:145
MoFEM::VolumeElementForcesAndSourcesCore::UserDataOperator
Definition: VolumeElementForcesAndSourcesCore.hpp:109
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 >
Example::COUNT
@ COUNT
Definition: plastic.cpp:222
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:417
MoFEM::OpCalculateVectorFieldGradient
Get field gradients at integration pts for scalar filed rank 0, i.e. vector field.
Definition: UserDataOperators.hpp:1561
ContactOps::cn_contact
double cn_contact
Definition: contact.cpp:100
integration_rule
auto integration_rule
Definition: free_surface.cpp:187
b_iso
double b_iso
Saturation exponent.
Definition: plastic.cpp:132
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:451
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:1457
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:96
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:590
Example::VOL
@ VOL
Definition: plastic.cpp:222
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:117
Example::setupProblem
MoFEMErrorCode setupProblem()
[Run problem]
Definition: plastic.cpp:275
CONTACT_SPACE
constexpr FieldSpace CONTACT_SPACE
Definition: plastic.cpp:52
UserDataOperator
ForcesAndSourcesCore::UserDataOperator UserDataOperator
Definition: HookeElement.hpp:75
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:54
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:2343
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:97
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:64
MOFEM_DATA_INCONSISTENCY
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
ep_order
int ep_order
Order of ep files.
Definition: plastic.cpp:140
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:766
MoFEM::createVectorMPI
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
Definition: PetscSmartObj.hpp:202
MoFEM::OpInvertMatrix
Definition: UserDataOperators.hpp:3684
MoFEM::OpCalculateHOJacForFace
OpCalculateHOJacForFaceImpl< 2 > OpCalculateHOJacForFace
Definition: HODataOperators.hpp:264
Qinf
double Qinf
Saturation yield stress.
Definition: plastic.cpp:131
MoFEM::MoFEMSNESMonitorFields
MoFEMErrorCode MoFEMSNESMonitorFields(SNES snes, PetscInt its, PetscReal fgnorm, SnesCtx *snes_ctx)
Sens monitor printing residual field by field.
Definition: SnesCtx.cpp:239
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:624
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:226
m
FTensor::Index< 'm', 3 > m
Definition: shallow_wave.cpp:80
Example::meshVolumeAndCount
static std::array< double, 2 > meshVolumeAndCount
Definition: plastic.cpp:223
atom_test
int atom_test
Atom test.
Definition: plastic.cpp:121
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:235
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:1082
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:3420
MoFEM::DMMoFEMAddSubFieldRow
PetscErrorCode DMMoFEMAddSubFieldRow(DM dm, const char field_name[])
Definition: DMMoFEM.cpp:238
Example::createCommonData
MoFEMErrorCode createCommonData()
[Set up problem]
Definition: plastic.cpp:480
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:589
MoFEM::SmartPetscObj< Mat >
SetUpSchur::createSetUpSchur
static boost::shared_ptr< SetUpSchur > createSetUpSchur(MoFEM::Interface &m_field)
Definition: test_broken_space.cpp:802
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:128
tau_order
int tau_order
Order of tau files.
Definition: plastic.cpp:139
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:1291
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:145
ApproxFieldFunction
Definition: child_and_parent.cpp:43
MoFEM::OpPostProcMapInMoab::DataMapVec
std::map< std::string, boost::shared_ptr< VectorDouble > > DataMapVec
Definition: PostProcBrokenMeshInMoabBase.hpp:711
MoFEM::OpPostProcMapInMoab
Post post-proc data at points from hash maps.
Definition: PostProcBrokenMeshInMoabBase.hpp:709
MoFEM::PetscOptionsGetBool
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
Definition: DeprecatedPetsc.hpp:182