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

[Example] More...

Collaboration diagram for Example:
[legend]

Classes

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

Public Member Functions

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

Private Types

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

Private Member Functions

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

Static Private Member Functions

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

Private Attributes

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

Static Private Attributes

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

Friends

struct TSPrePostProc
 

Detailed Description

[Example]

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

Definition at line 177 of file plastic.cpp.

Member Enumeration Documentation

◆ BoundingBox

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

Definition at line 98 of file phase.cpp.

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

Constructor & Destructor Documentation

◆ Example() [1/15]

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

Definition at line 179 of file plastic.cpp.

179 : mField(m_field) {}

◆ Example() [2/15]

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

Definition at line 230 of file plasticity_old_schur.cpp.

230 : mField(m_field) {}

◆ Example() [3/15]

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

Definition at line 421 of file dynamic_first_order_con_law.cpp.

421 : mField(m_field) {}

◆ Example() [4/15]

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

Definition at line 35 of file helmholtz.cpp.

35 : mField(m_field) {}

◆ Example() [5/15]

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

Definition at line 25 of file integration.cpp.

25 : mField(m_field) {}

◆ Example() [6/15]

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

Definition at line 50 of file plot_base.cpp.

50 : mField(m_field) {}

◆ Example() [7/15]

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

Definition at line 81 of file phase.cpp.

81 : mField(m_field) {}

◆ Example() [8/15]

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

Definition at line 53 of file approximaton.cpp.

53 : mField(m_field) {}

◆ Example() [9/15]

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

Definition at line 45 of file radiation.cpp.

45 : mField(m_field) {}

◆ Example() [10/15]

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

Definition at line 46 of file heat_method.cpp.

46 : mField(m_field) {}

◆ Example() [11/15]

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

Definition at line 88 of file elastic.cpp.

88 : mField(m_field) {}

◆ Example() [12/15]

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

Definition at line 49 of file eigen_elastic.cpp.

49 : mField(m_field) {}

◆ Example() [13/15]

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

Definition at line 60 of file nonlinear_elastic.cpp.

60 : mField(m_field) {}

◆ Example() [14/15]

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

Definition at line 55 of file nonlinear_dynamic_elastic.cpp.

55 : mField(m_field) {}

◆ Example() [15/15]

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

Definition at line 339 of file shallow_wave.cpp.

339 : mField(m_field) {}

Member Function Documentation

◆ addMatBlockOps()

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

[Calculate elasticity tensor]

[Calculate elasticity tensor]

Definition at line 114 of file elastic.cpp.

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

◆ assembleSystem() [1/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [2/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [3/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [4/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [5/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [6/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [7/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [8/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [9/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [10/10]

MoFEMErrorCode Example::assembleSystem ( )
private

[Push operators to pipeline]

[Boundary condition]

[Applying essential BC]

[Push operators to pipeline]

[Integration rule]

[Integration rule]

[Push domain stiffness matrix to pipeline]

[Push domain stiffness matrix to pipeline]

[Push Internal forces]

[Push Internal forces]

[Push Body forces]

[Push Body forces]

[Push natural boundary conditions]

[Push natural boundary conditions]

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

Definition at line 647 of file dynamic_first_order_con_law.cpp.

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

◆ assembleSystemFlux()

MoFEMErrorCode Example::assembleSystemFlux ( )
private

◆ assembleSystemIntensity()

MoFEMErrorCode Example::assembleSystemIntensity ( )
private

[Calculate flux on boundary]

[Push operators to pipeline]

Examples
phase.cpp.

Definition at line 433 of file phase.cpp.

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

◆ bC() [1/3]

MoFEMErrorCode Example::bC ( )
private

◆ bC() [2/3]

MoFEMErrorCode Example::bC ( )
private

[Create common data]

[Boundary condition]

Examples
plastic.cpp.

Definition at line 504 of file plastic.cpp.

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

◆ bC() [3/3]

MoFEMErrorCode Example::bC ( )
private

◆ boundaryCondition() [1/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [2/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [3/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [4/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [5/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [6/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [7/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [8/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [9/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

◆ boundaryCondition() [10/10]

MoFEMErrorCode Example::boundaryCondition ( )
private

[Set up problem]

[Create common data]

[Boundary condition]

[Applying essential BC]

[Define gravity vector]

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

Definition at line 536 of file dynamic_first_order_con_law.cpp.

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

◆ calculateFlux()

MoFEMErrorCode Example::calculateFlux ( double calc_flux)
private

[Set up problem]

[Calculate flux on boundary]

Examples
phase.cpp.

Definition at line 402 of file phase.cpp.

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

◆ checkResults() [1/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [2/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [3/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [4/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [5/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [6/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [7/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [8/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [9/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [10/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [11/12]

MoFEMErrorCode Example::checkResults ( )
private

◆ checkResults() [12/12]

MoFEMErrorCode Example::checkResults ( )
private

[Postprocess results]

[Postprocessing results]

[Print results]

[Check]

[Check results]

[Test example]

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

Definition at line 1205 of file dynamic_first_order_con_law.cpp.

1205  {
1208 }

◆ createCommonData() [1/9]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [2/9]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [3/9]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [4/9]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [5/9]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [6/9]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [7/9]

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

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

◆ createCommonData() [8/9]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [9/9]

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 384 of file nonlinear_elastic.cpp.

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

◆ 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/3]

MoFEMErrorCode Example::OPs ( )
private

◆ OPs() [2/3]

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

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

◆ OPs() [3/3]

MoFEMErrorCode Example::OPs ( )
private

◆ outputResults() [1/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [2/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [3/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [4/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [5/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [6/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [7/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [8/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [9/11]

MoFEMErrorCode Example::outputResults ( )
private

◆ outputResults() [10/11]

MoFEMErrorCode Example::outputResults ( )
private

[Solve]

[Getting norms]

[Postprocess results]

[Postprocessing results]

[Postprocess clean]

[Postprocess clean]

[Postprocess initialise]

[Postprocess initialise]

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

Definition at line 1183 of file dynamic_first_order_con_law.cpp.

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

◆ outputResults() [11/11]

MoFEMErrorCode Example::outputResults ( const int  i)
private

[Solve]

[Postprocess results]

Definition at line 504 of file phase.cpp.

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

◆ postProcess() [1/2]

MoFEMErrorCode Example::postProcess ( )
private

[Integrate]

[Solve]

[Print results]

[Postprocess results]

Definition at line 235 of file integration.cpp.

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

◆ postProcess() [2/2]

MoFEMErrorCode Example::postProcess ( )
private

◆ pushOperators()

MoFEMErrorCode Example::pushOperators ( )
private

[Set density distribution]

[Push operators to pipeline]

Definition at line 188 of file integration.cpp.

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

◆ readMesh() [1/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [2/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [3/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [4/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [5/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [6/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [7/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [8/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [9/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [10/11]

MoFEMErrorCode Example::readMesh ( )
private

◆ readMesh() [11/11]

MoFEMErrorCode Example::readMesh ( )
private

[Run problem]

[Run programme]

[run problem]

[Read mesh]

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

Definition at line 463 of file dynamic_first_order_con_law.cpp.

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

◆ rhsSource()

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

Definition at line 150 of file phase.cpp.

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

◆ runProblem() [1/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [2/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [3/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [4/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [5/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [6/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [7/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [8/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [9/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [10/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [11/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [12/15]

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

213  {
217  CHKERR bC();
218  CHKERR OPs();
219  CHKERR tsSolve();
221 }

◆ runProblem() [13/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [14/15]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [15/15]

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/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [2/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [3/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [4/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [5/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [6/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [7/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [8/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [9/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [10/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [11/14]

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

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

◆ setupProblem() [12/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [13/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [14/14]

MoFEMErrorCode Example::setupProblem ( )
private

◆ solveSystem() [1/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [2/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [3/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [4/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [5/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [6/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [7/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [8/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [9/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [10/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [11/11]

MoFEMErrorCode Example::solveSystem ( )
private

[Solve]

[Push operators to pipeline]

[Solve]

< Mass matrix

< Linear solver

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

Definition at line 893 of file dynamic_first_order_con_law.cpp.

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

◆ tsSolve() [1/2]

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

Definition at line 734 of file plastic.cpp.

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

◆ tsSolve() [2/2]

MoFEMErrorCode Example::tsSolve ( )
private

Friends And Related Function Documentation

◆ TSPrePostProc

friend struct TSPrePostProc
friend

Definition at line 435 of file dynamic_first_order_con_law.cpp.

Member Data Documentation

◆ approxFunction

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

Definition at line 61 of file approximaton.cpp.

◆ approxGradVals

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

Definition at line 63 of file radiation.cpp.

◆ approxVals

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

Definition at line 62 of file radiation.cpp.

◆ aveMaxMin

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

Definition at line 110 of file phase.cpp.

◆ base

FieldApproximationBase Example::base
private

Definition at line 68 of file plot_base.cpp.

◆ boundaryMarker

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

Definition at line 42 of file helmholtz.cpp.

◆ commonDataPtr

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

Definition at line 40 of file integration.cpp.

◆ doEvalField

PetscBool Example::doEvalField
private

Definition at line 95 of file elastic.cpp.

◆ domianLhsFEPtr

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

Definition at line 355 of file shallow_wave.cpp.

◆ domianRhsFEPtr

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

Definition at line 356 of file shallow_wave.cpp.

◆ ePS

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

Definition at line 69 of file eigen_elastic.cpp.

◆ fieldEvalCoords

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

Definition at line 96 of file elastic.cpp.

◆ fieldEvalData

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

Definition at line 97 of file elastic.cpp.

◆ focalIndex

int Example::focalIndex
staticprivate
Examples
phase.cpp.

Definition at line 112 of file phase.cpp.

◆ iI

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

Definition at line 109 of file phase.cpp.

◆ K

SmartPetscObj<Mat> Example::K
private

Definition at line 68 of file eigen_elastic.cpp.

◆ M

SmartPetscObj<Mat> Example::M
private

Definition at line 67 of file eigen_elastic.cpp.

◆ matDPtr

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

Definition at line 65 of file eigen_elastic.cpp.

◆ mField

MoFEM::Interface & Example::mField
private

◆ pinchNodes

Range Example::pinchNodes
private

Definition at line 54 of file heat_method.cpp.

◆ reactionFe

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

Definition at line 192 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 194 of file plastic.cpp.

◆ uYScatter

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

Definition at line 195 of file plastic.cpp.

◆ uZScatter

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

Definition at line 196 of file plastic.cpp.

◆ vectorFieldPtr

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

Definition at line 98 of file elastic.cpp.


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