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

[Example] More...

Collaboration diagram for Example:
[legend]

Classes

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

Public Member Functions

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

Private Types

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

Private Member Functions

MoFEMErrorCode setupProblem ()
 [Run problem] More...
 
MoFEMErrorCode createCommonData ()
 [Set up problem] More...
 
MoFEMErrorCode bC ()
 [Create common data] More...
 
MoFEMErrorCode OPs ()
 [Boundary condition] More...
 
MoFEMErrorCode tsSolve ()
 
MoFEMErrorCode 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, nonlinear_elastic.cpp, phase.cpp, plastic.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 228 of file plastic.cpp.

Member Enumeration Documentation

◆ BoundingBox

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

Definition at line 98 of file phase.cpp.

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

Constructor & Destructor Documentation

◆ Example() [1/14]

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

Definition at line 230 of file plastic.cpp.

230 : mField(m_field) {}

◆ Example() [2/14]

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

Definition at line 421 of file dynamic_first_order_con_law.cpp.

421 : mField(m_field) {}

◆ Example() [3/14]

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

Definition at line 35 of file helmholtz.cpp.

35 : mField(m_field) {}

◆ Example() [4/14]

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

Definition at line 25 of file integration.cpp.

25 : mField(m_field) {}

◆ Example() [5/14]

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

Definition at line 50 of file plot_base.cpp.

50 : mField(m_field) {}

◆ Example() [6/14]

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

Definition at line 81 of file phase.cpp.

81 : mField(m_field) {}

◆ Example() [7/14]

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

Definition at line 53 of file approximaton.cpp.

53 : mField(m_field) {}

◆ Example() [8/14]

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

Definition at line 45 of file radiation.cpp.

45 : mField(m_field) {}

◆ Example() [9/14]

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

Definition at line 46 of file heat_method.cpp.

46 : mField(m_field) {}

◆ Example() [10/14]

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

Definition at line 88 of file elastic.cpp.

88 : mField(m_field) {}

◆ Example() [11/14]

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

Definition at line 49 of file eigen_elastic.cpp.

49 : mField(m_field) {}

◆ Example() [12/14]

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

Definition at line 59 of file nonlinear_elastic.cpp.

59 : mField(m_field) {}

◆ Example() [13/14]

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

Definition at line 55 of file nonlinear_dynamic_elastic.cpp.

55 : mField(m_field) {}

◆ Example() [14/14]

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

Definition at line 339 of file shallow_wave.cpp.

339 : mField(m_field) {}

Member Function Documentation

◆ addMatBlockOps()

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

[Calculate elasticity tensor]

[Calculate elasticity tensor]

Definition at line 114 of file elastic.cpp.

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

◆ assembleSystem() [1/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [2/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [3/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [4/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [5/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [6/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [7/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [8/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [9/10]

MoFEMErrorCode Example::assembleSystem ( )
private

◆ assembleSystem() [10/10]

MoFEMErrorCode Example::assembleSystem ( )
private

[Push operators to pipeline]

[Boundary condition]

[Applying essential BC]

[Push operators to pipeline]

[Integration rule]

[Integration rule]

[Push domain stiffness matrix to pipeline]

[Push domain stiffness matrix to pipeline]

[Push Internal forces]

[Push Internal forces]

[Push Body forces]

[Push Body forces]

[Push natural boundary conditions]

[Push natural boundary conditions]

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

Definition at line 647 of file dynamic_first_order_con_law.cpp.

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

◆ assembleSystemFlux()

MoFEMErrorCode Example::assembleSystemFlux ( )
private

◆ assembleSystemIntensity()

MoFEMErrorCode Example::assembleSystemIntensity ( )
private

[Calculate flux on boundary]

[Push operators to pipeline]

Examples
phase.cpp.

Definition at line 433 of file phase.cpp.

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

◆ bC() [1/2]

MoFEMErrorCode Example::bC ( )
private

◆ bC() [2/2]

MoFEMErrorCode Example::bC ( )
private

[Create common data]

[Boundary condition]

Examples
plastic.cpp.

Definition at line 555 of file plastic.cpp.

555  {
557 
558  auto simple = mField.getInterface<Simple>();
559  auto bc_mng = mField.getInterface<BcManager>();
560  auto prb_mng = mField.getInterface<ProblemsManager>();
561 
562  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), "REMOVE_X",
563  "U", 0, 0);
564  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), "REMOVE_Y",
565  "U", 1, 1);
566  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), "REMOVE_Z",
567  "U", 2, 2);
568  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(),
569  "REMOVE_ALL", "U", 0, 3);
570 
571 #ifdef ADD_CONTACT
572  for (auto b : {"FIX_X", "REMOVE_X"})
573  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
574  "SIGMA", 0, 0, false, true);
575  for (auto b : {"FIX_Y", "REMOVE_Y"})
576  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
577  "SIGMA", 1, 1, false, true);
578  for (auto b : {"FIX_Z", "REMOVE_Z"})
579  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
580  "SIGMA", 2, 2, false, true);
581  for (auto b : {"FIX_ALL", "REMOVE_ALL"})
582  CHKERR bc_mng->removeBlockDOFsOnEntities(simple->getProblemName(), b,
583  "SIGMA", 0, 3, false, true);
584  CHKERR bc_mng->removeBlockDOFsOnEntities(
585  simple->getProblemName(), "NO_CONTACT", "SIGMA", 0, 3, false, true);
586 #endif
587 
588  CHKERR bc_mng->pushMarkDOFsOnEntities<DisplacementCubitBcData>(
589  simple->getProblemName(), "U");
590 
591  auto &bc_map = bc_mng->getBcMapByBlockName();
592  for (auto bc : bc_map)
593  MOFEM_LOG("PLASTICITY", Sev::verbose) << "Marker " << bc.first;
594 
596 }

◆ 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, nonlinear_elastic.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, nonlinear_elastic.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 1205 of file dynamic_first_order_con_law.cpp.

1205  {
1208 }

◆ createCommonData() [1/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [2/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [3/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [4/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [5/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [6/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ createCommonData() [7/8]

MoFEMErrorCode Example::createCommonData ( )
private

[Set up problem]

[Set integration rule]

[Create common data]

< true if tau order is set

< true if tau order is set

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

Definition at line 447 of file plastic.cpp.

447  {
449 
450  auto get_command_line_parameters = [&]() {
452 
453  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-scale", &scale, PETSC_NULL);
454  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-young_modulus",
455  &young_modulus, PETSC_NULL);
456  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-poisson_ratio",
457  &poisson_ratio, PETSC_NULL);
458  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-hardening", &H, PETSC_NULL);
459  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-hardening_viscous", &visH,
460  PETSC_NULL);
461  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-yield_stress", &sigmaY,
462  PETSC_NULL);
463  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-cn0", &cn0, PETSC_NULL);
464  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-cn1", &cn1, PETSC_NULL);
465  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-zeta", &zeta, PETSC_NULL);
466  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-Qinf", &Qinf, PETSC_NULL);
467  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-b_iso", &b_iso, PETSC_NULL);
468  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-C1_k", &C1_k, PETSC_NULL);
469  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-large_strains",
470  &is_large_strains, PETSC_NULL);
471  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-set_timer", &set_timer,
472  PETSC_NULL);
473 
474  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-order", &order, PETSC_NULL);
475  PetscBool tau_order_is_set; ///< true if tau order is set
476  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-tau_order", &tau_order,
477  &tau_order_is_set);
478  PetscBool ep_order_is_set; ///< true if tau order is set
479  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-ep_order", &ep_order,
480  &ep_order_is_set);
481  CHKERR PetscOptionsGetInt(PETSC_NULL, "", "-geom_order", &geom_order,
482  PETSC_NULL);
483 
484  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-rho", &rho, PETSC_NULL);
485  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-alpha_damping",
486  &alpha_damping, PETSC_NULL);
487 
488  MOFEM_LOG("PLASTICITY", Sev::inform) << "Young modulus " << young_modulus;
489  MOFEM_LOG("PLASTICITY", Sev::inform) << "Poisson ratio " << poisson_ratio;
490  MOFEM_LOG("PLASTICITY", Sev::inform) << "Yield stress " << sigmaY;
491  MOFEM_LOG("PLASTICITY", Sev::inform) << "Hardening " << H;
492  MOFEM_LOG("PLASTICITY", Sev::inform) << "Viscous hardening " << visH;
493  MOFEM_LOG("PLASTICITY", Sev::inform) << "Saturation yield stress " << Qinf;
494  MOFEM_LOG("PLASTICITY", Sev::inform) << "Saturation exponent " << b_iso;
495  MOFEM_LOG("PLASTICITY", Sev::inform) << "Kinematic hardening " << C1_k;
496  MOFEM_LOG("PLASTICITY", Sev::inform) << "cn0 " << cn0;
497  MOFEM_LOG("PLASTICITY", Sev::inform) << "cn1 " << cn1;
498  MOFEM_LOG("PLASTICITY", Sev::inform) << "zeta " << zeta;
499 
500  if (tau_order_is_set == PETSC_FALSE)
501  tau_order = order - 2;
502  if (ep_order_is_set == PETSC_FALSE)
503  ep_order = order - 1;
504 
505  MOFEM_LOG("PLASTICITY", Sev::inform) << "Approximation order " << order;
506  MOFEM_LOG("PLASTICITY", Sev::inform)
507  << "Ep approximation order " << ep_order;
508  MOFEM_LOG("PLASTICITY", Sev::inform)
509  << "Tau approximation order " << tau_order;
510  MOFEM_LOG("PLASTICITY", Sev::inform)
511  << "Geometry approximation order " << geom_order;
512 
513  MOFEM_LOG("PLASTICITY", Sev::inform) << "Density " << rho;
514  MOFEM_LOG("PLASTICITY", Sev::inform) << "alpha_damping " << alpha_damping;
515 
516  PetscBool is_scale = PETSC_TRUE;
517  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-is_scale", &is_scale,
518  PETSC_NULL);
519  if (is_scale) {
520  scale /= young_modulus;
521  }
522 
523  MOFEM_LOG("PLASTICITY", Sev::inform) << "Scale " << scale;
524 
525 #ifdef ADD_CONTACT
526  CHKERR PetscOptionsGetScalar(PETSC_NULL, "", "-cn_contact",
527  &ContactOps::cn_contact, PETSC_NULL);
528  MOFEM_LOG("CONTACT", Sev::inform)
529  << "cn_contact " << ContactOps::cn_contact;
530 #endif // ADD_CONTACT
531 
532  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-quasi_static",
533  &is_quasi_static, PETSC_NULL);
534  MOFEM_LOG("PLASTICITY", Sev::inform)
535  << "Is quasi static: " << (is_quasi_static ? "true" : "false");
536 
538  };
539 
540  CHKERR get_command_line_parameters();
541 
542 #ifdef ADD_CONTACT
543 #ifdef PYTHON_SDF
544  sdfPythonPtr = boost::make_shared<ContactOps::SDFPython>();
545  CHKERR sdfPythonPtr->sdfInit("sdf.py");
546  ContactOps::sdfPythonWeakPtr = sdfPythonPtr;
547 #endif
548 #endif // ADD_CONTACT
549 
551 }

◆ createCommonData() [8/8]

MoFEMErrorCode Example::createCommonData ( )
private

◆ getCoordsInImage()

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

Definition at line 131 of file phase.cpp.

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

◆ gettingNorms()

MoFEMErrorCode Example::gettingNorms ( )
private

[Solve]

[Getting norms]

Examples
nonlinear_elastic.cpp.

Definition at line 383 of file nonlinear_elastic.cpp.

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

◆ integrateElements()

MoFEMErrorCode Example::integrateElements ( )
private

[Push operators to pipeline]

[Integrate]

Definition at line 218 of file integration.cpp.

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

◆ integrationRule()

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

Definition at line 52 of file radiation.cpp.

52 { return 2 * p_data; };

◆ kspSolve()

MoFEMErrorCode Example::kspSolve ( )
private

[Push operators to pipeline]

[Solve]

Definition at line 230 of file radiation.cpp.

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

◆ lhsFlux()

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

Definition at line 165 of file phase.cpp.

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

◆ OPs() [1/2]

MoFEMErrorCode Example::OPs ( )
private

◆ OPs() [2/2]

MoFEMErrorCode Example::OPs ( )
private

[Boundary condition]

[Push operators to pipeline]

[Only used for dynamics]

[Only used for dynamics]

[Only used for dynamics]

[Only used for dynamics]

Examples
plastic.cpp.

Definition at line 600 of file plastic.cpp.

600  {
602  auto pip_mng = mField.getInterface<PipelineManager>();
603  auto simple = mField.getInterface<Simple>();
604  auto bc_mng = mField.getInterface<BcManager>();
605 
606  auto integration_rule_bc = [](int, int, int ao) { return 2 * ao; };
607 
608  auto vol_rule = [](int, int, int ao) { return 2 * ao + geom_order - 1; };
609 
610  auto add_boundary_ops_lhs_mechanical = [&](auto &pip) {
612 
614  "GEOMETRY");
615  pip.push_back(new OpSetHOWeightsOnSubDim<SPACE_DIM>());
616 
617  // Add Natural BCs to LHS
619  pip, mField, "U", Sev::inform);
620 
621 #ifdef ADD_CONTACT
622  CHKERR
623  ContactOps::opFactoryBoundaryLhs<SPACE_DIM, AT, GAUSS, BoundaryEleOp>(
624  pip, "SIGMA", "U");
625  CHKERR
626  ContactOps::opFactoryBoundaryToDomainLhs<SPACE_DIM, AT, IT, DomainEle>(
627  mField, pip, simple->getDomainFEName(), "SIGMA", "U", "GEOMETRY",
628  vol_rule);
629 #endif // ADD_CONTACT
630 
632  };
633 
634  auto add_boundary_ops_rhs_mechanical = [&](auto &pip) {
636 
638  "GEOMETRY");
639  pip.push_back(new OpSetHOWeightsOnSubDim<SPACE_DIM>());
640 
641  // Add Natural BCs to RHS
643  pip, mField, "U", {boost::make_shared<ScaledTimeScale>()}, Sev::inform);
644 
645 #ifdef ADD_CONTACT
646  CHKERR ContactOps::opFactoryBoundaryRhs<SPACE_DIM, AT, IT, BoundaryEleOp>(
647  pip, "SIGMA", "U");
648 #endif // ADD_CONTACT
649 
651  };
652 
653  auto add_domain_ops_lhs = [this](auto &pip) {
656  "GEOMETRY");
657 
658  if (is_quasi_static == PETSC_FALSE) {
659 
660  //! [Only used for dynamics]
663  //! [Only used for dynamics]
664 
665  auto get_inertia_and_mass_damping = [this](const double, const double,
666  const double) {
667  auto *pip = mField.getInterface<PipelineManager>();
668  auto &fe_domain_lhs = pip->getDomainLhsFE();
669  return (rho / scale) * fe_domain_lhs->ts_aa +
670  (alpha_damping / scale) * fe_domain_lhs->ts_a;
671  };
672  pip.push_back(new OpMass("U", "U", get_inertia_and_mass_damping));
673  }
674 
675  CHKERR PlasticOps::opFactoryDomainLhs<SPACE_DIM, AT, IT, DomainEleOp>(
676  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU");
677 
679  };
680 
681  auto add_domain_ops_rhs = [this](auto &pip) {
683 
685  "GEOMETRY");
686 
688  pip, mField, "U",
689  {boost::make_shared<ScaledTimeScale>("body_force_hist.txt")},
690  Sev::inform);
691 
692  // only in case of dynamics
693  if (is_quasi_static == PETSC_FALSE) {
694 
695  //! [Only used for dynamics]
697  AT>::LinearForm<IT>::OpBaseTimesVector<1, SPACE_DIM, 1>;
698  //! [Only used for dynamics]
699 
700  auto mat_acceleration = boost::make_shared<MatrixDouble>();
702  "U", mat_acceleration));
703  pip.push_back(
704  new OpInertiaForce("U", mat_acceleration, [](double, double, double) {
705  return rho / scale;
706  }));
707  if (alpha_damping > 0) {
708  auto mat_velocity = boost::make_shared<MatrixDouble>();
709  pip.push_back(
710  new OpCalculateVectorFieldValuesDot<SPACE_DIM>("U", mat_velocity));
711  pip.push_back(
712  new OpInertiaForce("U", mat_velocity, [](double, double, double) {
713  return alpha_damping / scale;
714  }));
715  }
716  }
717 
718  CHKERR PlasticOps::opFactoryDomainRhs<SPACE_DIM, AT, IT, DomainEleOp>(
719  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU");
720 
721 #ifdef ADD_CONTACT
722  CHKERR ContactOps::opFactoryDomainRhs<SPACE_DIM, AT, IT, DomainEleOp>(
723  pip, "SIGMA", "U");
724 #endif // ADD_CONTACT
725 
727  };
728 
729  CHKERR add_domain_ops_lhs(pip_mng->getOpDomainLhsPipeline());
730  CHKERR add_domain_ops_rhs(pip_mng->getOpDomainRhsPipeline());
731 
732  // Boundary
733  CHKERR add_boundary_ops_lhs_mechanical(pip_mng->getOpBoundaryLhsPipeline());
734  CHKERR add_boundary_ops_rhs_mechanical(pip_mng->getOpBoundaryRhsPipeline());
735 
736  CHKERR pip_mng->setDomainRhsIntegrationRule(vol_rule);
737  CHKERR pip_mng->setDomainLhsIntegrationRule(vol_rule);
738 
739  CHKERR pip_mng->setBoundaryLhsIntegrationRule(integration_rule_bc);
740  CHKERR pip_mng->setBoundaryRhsIntegrationRule(integration_rule_bc);
741 
742  auto create_reaction_pipeline = [&](auto &pip) {
745  "GEOMETRY");
746  CHKERR PlasticOps::opFactoryDomainReactions<SPACE_DIM, AT, IT, DomainEleOp>(
747  mField, "MAT_PLASTIC", pip, "U", "EP", "TAU");
749  };
750 
751  reactionFe = boost::make_shared<DomainEle>(mField);
752  reactionFe->getRuleHook = vol_rule;
753  CHKERR create_reaction_pipeline(reactionFe->getOpPtrVector());
754  reactionFe->postProcessHook =
756 
758 }

◆ 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, nonlinear_elastic.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, nonlinear_elastic.cpp, phase.cpp, plot_base.cpp, and shallow_wave.cpp.

Definition at line 463 of file dynamic_first_order_con_law.cpp.

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

◆ rhsSource()

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

Definition at line 150 of file phase.cpp.

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

◆ runProblem() [1/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [2/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [3/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [4/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [5/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [6/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [7/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [8/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [9/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [10/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [11/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [12/14]

MoFEMErrorCode Example::runProblem ( )

[Run problem]

[Create common data]

[Run programme]

[Operator]

[run problem]

[Run all]

[Run problem]

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

Definition at line 264 of file plastic.cpp.

264  {
268  CHKERR bC();
269  CHKERR OPs();
270  CHKERR tsSolve();
272 }

◆ runProblem() [13/14]

MoFEMErrorCode Example::runProblem ( )

◆ runProblem() [14/14]

MoFEMErrorCode Example::runProblem ( )

◆ setFieldValues()

MoFEMErrorCode Example::setFieldValues ( )
private

[Create common data]

[Set density distribution]

Definition at line 172 of file integration.cpp.

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

◆ setIntegrationRules() [1/3]

MoFEMErrorCode Example::setIntegrationRules ( )
private

◆ setIntegrationRules() [2/3]

MoFEMErrorCode Example::setIntegrationRules ( )
private

[Set up problem]

[Set integration rule]

Examples
heat_method.cpp, and plot_base.cpp.

Definition at line 203 of file plot_base.cpp.

203  {
206 }

◆ setIntegrationRules() [3/3]

MoFEMErrorCode Example::setIntegrationRules ( )
private

◆ setUp()

MoFEMErrorCode Example::setUp ( )
private

[Run all]

[Set up problem]

Definition at line 137 of file integration.cpp.

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

◆ setupProblem() [1/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [2/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [3/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [4/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [5/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [6/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [7/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [8/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [9/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [10/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [11/13]

MoFEMErrorCode Example::setupProblem ( )
private

[Run problem]

[Read mesh]

[Set up problem]

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

Definition at line 276 of file plastic.cpp.

276  {
279 
280  Range domain_ents;
281  CHKERR mField.get_moab().get_entities_by_dimension(0, SPACE_DIM, domain_ents,
282  true);
283  auto get_ents_by_dim = [&](const auto dim) {
284  if (dim == SPACE_DIM) {
285  return domain_ents;
286  } else {
287  Range ents;
288  if (dim == 0)
289  CHKERR mField.get_moab().get_connectivity(domain_ents, ents, true);
290  else
291  CHKERR mField.get_moab().get_entities_by_dimension(0, dim, ents, true);
292  return ents;
293  }
294  };
295 
296  auto get_base = [&]() {
297  auto domain_ents = get_ents_by_dim(SPACE_DIM);
298  if (domain_ents.empty())
299  CHK_THROW_MESSAGE(MOFEM_NOT_FOUND, "Empty mesh");
300  const auto type = type_from_handle(domain_ents[0]);
301  switch (type) {
302  case MBQUAD:
303  return DEMKOWICZ_JACOBI_BASE;
304  case MBHEX:
305  return DEMKOWICZ_JACOBI_BASE;
306  case MBTRI:
308  case MBTET:
310  default:
311  CHK_THROW_MESSAGE(MOFEM_NOT_FOUND, "Element type not handled");
312  }
313  return NOBASE;
314  };
315 
316  const auto base = get_base();
317  MOFEM_LOG("PLASTICITY", Sev::inform)
318  << "Base " << ApproximationBaseNames[base];
319 
320  CHKERR simple->addDomainField("U", H1, base, SPACE_DIM);
321  CHKERR simple->addDomainField("EP", L2, base, size_symm);
322  CHKERR simple->addDomainField("TAU", L2, base, 1);
323  CHKERR simple->addBoundaryField("U", H1, base, SPACE_DIM);
324 
325  CHKERR simple->addDataField("GEOMETRY", H1, base, SPACE_DIM);
326 
327  PetscBool order_edge = PETSC_FALSE;
328  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-order_edge", &order_edge,
329  PETSC_NULL);
330  PetscBool order_face = PETSC_FALSE;
331  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-order_face", &order_face,
332  PETSC_NULL);
333  PetscBool order_volume = PETSC_FALSE;
334  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-order_volume", &order_volume,
335  PETSC_NULL);
336 
337  if (order_edge || order_face || order_volume) {
338 
339  MOFEM_LOG("PLASTICITY", Sev::inform) << "Order edge " << order_edge
340  ? "true"
341  : "false";
342  MOFEM_LOG("PLASTICITY", Sev::inform) << "Order face " << order_face
343  ? "true"
344  : "false";
345  MOFEM_LOG("PLASTICITY", Sev::inform) << "Order volume " << order_volume
346  ? "true"
347  : "false";
348 
349  auto ents = get_ents_by_dim(0);
350  if (order_edge)
351  ents.merge(get_ents_by_dim(1));
352  if (order_face)
353  ents.merge(get_ents_by_dim(2));
354  if (order_volume)
355  ents.merge(get_ents_by_dim(3));
356  CHKERR simple->setFieldOrder("U", order, &ents);
357  } else {
358  CHKERR simple->setFieldOrder("U", order);
359  }
360  CHKERR simple->setFieldOrder("EP", ep_order);
361  CHKERR simple->setFieldOrder("TAU", tau_order);
362 
363  CHKERR simple->setFieldOrder("GEOMETRY", geom_order);
364 
365 #ifdef ADD_CONTACT
366  CHKERR simple->addDomainField("SIGMA", CONTACT_SPACE, DEMKOWICZ_JACOBI_BASE,
367  SPACE_DIM);
368  CHKERR simple->addBoundaryField("SIGMA", CONTACT_SPACE, DEMKOWICZ_JACOBI_BASE,
369  SPACE_DIM);
370 
371  auto get_skin = [&]() {
372  Range body_ents;
373  CHKERR mField.get_moab().get_entities_by_dimension(0, SPACE_DIM, body_ents);
374  Skinner skin(&mField.get_moab());
375  Range skin_ents;
376  CHKERR skin.find_skin(0, body_ents, false, skin_ents);
377  return skin_ents;
378  };
379 
380  auto filter_blocks = [&](auto skin) {
381  bool is_contact_block = false;
382  Range contact_range;
383  for (auto m :
385 
386  (boost::format("%s(.*)") % "CONTACT").str()
387 
388  ))
389 
390  ) {
391  is_contact_block =
392  true; ///< bloks interation is collectibe, so that is set irrespective
393  ///< if there are enerities in given rank or not in the block
394  MOFEM_LOG("CONTACT", Sev::inform)
395  << "Find contact block set: " << m->getName();
396  auto meshset = m->getMeshset();
397  Range contact_meshset_range;
398  CHKERR mField.get_moab().get_entities_by_dimension(
399  meshset, SPACE_DIM - 1, contact_meshset_range, true);
400 
401  CHKERR mField.getInterface<CommInterface>()->synchroniseEntities(
402  contact_meshset_range);
403  contact_range.merge(contact_meshset_range);
404  }
405  if (is_contact_block) {
406  MOFEM_LOG("SYNC", Sev::inform)
407  << "Nb entities in contact surface: " << contact_range.size();
409  skin = intersect(skin, contact_range);
410  }
411  return skin;
412  };
413 
414  auto filter_true_skin = [&](auto skin) {
415  Range boundary_ents;
416  ParallelComm *pcomm =
417  ParallelComm::get_pcomm(&mField.get_moab(), MYPCOMM_INDEX);
418  CHKERR pcomm->filter_pstatus(skin, PSTATUS_SHARED | PSTATUS_MULTISHARED,
419  PSTATUS_NOT, -1, &boundary_ents);
420  return boundary_ents;
421  };
422 
423  auto boundary_ents = filter_true_skin(filter_blocks(get_skin()));
424  CHKERR simple->setFieldOrder("SIGMA", 0);
425  CHKERR simple->setFieldOrder("SIGMA", order - 1, &boundary_ents);
426 #endif
427 
428  CHKERR simple->setUp();
429  CHKERR simple->addFieldToEmptyFieldBlocks("U", "TAU");
430 
431  auto project_ho_geometry = [&]() {
432  Projection10NodeCoordsOnField ent_method(mField, "GEOMETRY");
433  return mField.loop_dofs("GEOMETRY", ent_method);
434  };
435  PetscBool project_geometry = PETSC_TRUE;
436  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-project_geometry",
437  &project_geometry, PETSC_NULL);
438  if (project_geometry){
439  CHKERR project_ho_geometry();
440  }
441 
443 }

◆ setupProblem() [12/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ setupProblem() [13/13]

MoFEMErrorCode Example::setupProblem ( )
private

◆ solveSystem() [1/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [2/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [3/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [4/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [5/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [6/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [7/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [8/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [9/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [10/11]

MoFEMErrorCode Example::solveSystem ( )
private

◆ solveSystem() [11/11]

MoFEMErrorCode Example::solveSystem ( )
private

[Solve]

[Push operators to pipeline]

[Solve]

< Mass matrix

< Linear solver

Examples
dynamic_first_order_con_law.cpp, eigen_elastic.cpp, heat_method.cpp, helmholtz.cpp, nonlinear_elastic.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()

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

Definition at line 785 of file plastic.cpp.

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

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

◆ uYScatter

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

Definition at line 246 of file plastic.cpp.

◆ uZScatter

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

Definition at line 247 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:447
MoFEM::UnknownInterface::getInterface
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce 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:576
OpBodyForce
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesVector< 1, SPACE_DIM, 0 > OpBodyForce
Definition: dynamic_first_order_con_law.cpp:66
MoFEM::createAOMappingIS
auto createAOMappingIS(IS isapp, IS ispetsc)
Creates an application mapping using two index sets.
Definition: PetscSmartObj.hpp:302
Example::tsSolve
MoFEMErrorCode tsSolve()
Definition: plastic.cpp:785
MoFEM::EntitiesFieldData::EntData
Data on single entity (This is passed as argument to DataOperator::doWork)
Definition: EntitiesFieldData.hpp:127
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:168
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:215
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:151
MoFEM::OpSetInvJacHcurlFace
OpSetInvJacHcurlFaceImpl< 2 > OpSetInvJacHcurlFace
Definition: UserDataOperators.hpp:2982
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:600
OpGradTimesTensor2
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpGradTimesTensor< 1, SPACE_DIM, SPACE_DIM > OpGradTimesTensor2
Definition: dynamic_first_order_con_law.cpp:76
PlasticOps::w
double w(double eqiv, double dot_tau, double f, double sigma_y, double sigma_Y)
Definition: PlasticOpsGeneric.hpp:276
MoFEM::DMMoFEMAddSubFieldCol
PetscErrorCode DMMoFEMAddSubFieldCol(DM dm, const char field_name[])
Definition: DMMoFEM.cpp:284
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:172
MoFEM::OpSetContravariantPiolaTransformOnFace2D
OpSetContravariantPiolaTransformOnFace2DImpl< 2 > OpSetContravariantPiolaTransformOnFace2D
Definition: UserDataOperators.hpp:3080
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:191
sigmaY
double sigmaY
Yield stress.
Definition: plastic.cpp:174
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:130
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:596
MoFEM::DMMoFEMSetSquareProblem
PetscErrorCode DMMoFEMSetSquareProblem(DM dm, PetscBool square_problem)
set squared problem
Definition: DMMoFEM.cpp:460
ApproximationBaseNames
const static char *const ApproximationBaseNames[]
Definition: definitions.h:72
L2
@ L2
field with C-1 continuity
Definition: definitions.h:88
bulk_modulus_K
constexpr double bulk_modulus_K
Definition: elastic.cpp:81
MoFEM::PipelineManager::loopFiniteElements
MoFEMErrorCode loopFiniteElements(SmartPetscObj< DM > dm=nullptr)
Iterate finite elements.
Definition: PipelineManager.cpp:19
Example::CommonData::SECOND_YZ
@ SECOND_YZ
Definition: integration.cpp:77
Example::uZScatter
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uZScatter
Definition: plastic.cpp:247
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:111
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:527
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:257
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:170
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:185
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:1076
THROW_MESSAGE
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
Definition: definitions.h:561
zeta
double zeta
Viscous hardening.
Definition: plastic.cpp:177
geom_order
int geom_order
Order if fixed.
Definition: plastic.cpp:188
SetUpSchur::createSetUpSchur
static boost::shared_ptr< SetUpSchur > createSetUpSchur(MoFEM::Interface &m_field, SmartPetscObj< DM > sub_dm, SmartPetscObj< IS > field_split_it, SmartPetscObj< AO > ao_map)
Create data structure for handling Schur complement.
MoFEM::DMMoFEMAddElement
PetscErrorCode DMMoFEMAddElement(DM dm, std::string fe_name)
add element to dm
Definition: DMMoFEM.cpp:501
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:123
approx_order
static constexpr int approx_order
Definition: prism_polynomial_approximation.cpp:14
Example::CommonData::FIRST_X
@ FIRST_X
Definition: integration.cpp:70
MoFEM::OpCalculateVectorFieldValuesFromPetscVecImpl
Approximate field values for given petsc vector.
Definition: UserDataOperators.hpp:595
Example::focalIndex
static int focalIndex
Definition: phase.cpp:112
OpInertiaForce
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesVector< 1, SPACE_DIM, 1 > OpInertiaForce
Definition: dynamic_first_order_con_law.cpp:63
MoFEM::PostProcBrokenMeshInMoab
Definition: PostProcBrokenMeshInMoabBase.hpp:667
MoFEM::OpCalcNormL2Tensor2
Get norm of input MatrixDouble for Tensor2.
Definition: NormsOperators.hpp:69
Example::MIN_Y
@ MIN_Y
Definition: phase.cpp:104
MoFEM::DMCreateMatrix_MoFEM
PetscErrorCode DMCreateMatrix_MoFEM(DM dm, Mat *M)
Definition: DMMoFEM.cpp:1201
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:535
MoFEM::createDMVector
auto createDMVector(DM dm)
Get smart vector from DM.
Definition: DMMoFEM.hpp:1018
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:137
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:2116
Example::uXScatter
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uXScatter
Definition: plastic.cpp:245
is_quasi_static
PetscBool is_quasi_static
Definition: plastic.cpp:190
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:219
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:302
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:183
Example::uYScatter
std::tuple< SmartPetscObj< Vec >, SmartPetscObj< VecScatter > > uYScatter
Definition: plastic.cpp:246
PlasticOps::Monitor
Definition: PlasticOpsMonitor.hpp:9
C1_k
double C1_k
Kinematic hardening.
Definition: plastic.cpp:180
MoFEM::OpSetContravariantPiolaTransformOnEdge2D
Definition: UserDataOperators.hpp:3090
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:173
MoFEM::GAUSS
@ GAUSS
Definition: FormsIntegrators.hpp:128
cn0
double cn0
Definition: plastic.cpp:182
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:226
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:42
MoFEM::type_from_handle
auto type_from_handle(const EntityHandle h)
get type from entity handle
Definition: Templates.hpp:1869
OpDomainSource
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< 1, 1 > OpDomainSource
Definition: phase.cpp:73
visH
double visH
Viscous hardening.
Definition: plastic.cpp:176
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:503
MoFEM::OpCalculateVectorFieldGradient
Get field gradients at integration pts for scalar filed rank 0, i.e. vector field.
Definition: UserDataOperators.hpp:1536
ContactOps::cn_contact
double cn_contact
Definition: EshelbianContact.hpp:19
MAX_DOFS_ON_ENTITY
#define MAX_DOFS_ON_ENTITY
Maximal number of DOFs on entity.
Definition: definitions.h:236
integration_rule
auto integration_rule
Definition: free_surface.cpp:185
b_iso
double b_iso
Saturation exponent.
Definition: plastic.cpp:179
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:217
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:555
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:167
Example::setupProblem
MoFEMErrorCode setupProblem()
[Run problem]
Definition: plastic.cpp:276
CONTACT_SPACE
constexpr FieldSpace CONTACT_SPACE
Definition: plastic.cpp:52
j
FTensor::Index< 'j', 3 > j
Definition: matrix_function.cpp:19
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:1060
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:187
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:752
MoFEM::createVectorMPI
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
Definition: PetscSmartObj.hpp:198
MoFEM::OpInvertMatrix
Definition: UserDataOperators.hpp:3254
MoFEM::OpCalculateHOJacForFace
OpCalculateHOJacForFaceImpl< 2 > OpCalculateHOJacForFace
Definition: HODataOperators.hpp:264
Qinf
double Qinf
Saturation yield stress.
Definition: plastic.cpp:178
MoFEM::MoFEMSNESMonitorFields
MoFEMErrorCode MoFEMSNESMonitorFields(SNES snes, PetscInt its, PetscReal fgnorm, SnesCtx *snes_ctx)
Sens monitor printing residual field by field.
Definition: SnesCtx.cpp:232
Example::iI
static std::vector< MatrixInt > iI
Definition: phase.cpp:109
TSPrePostProc::tsPreStep
static MoFEMErrorCode tsPreStep(TS ts)
Definition: dynamic_first_order_con_law.cpp:628
ReactionDiffusionEquation::D
const double D
diffusivity
Definition: reaction_diffusion.cpp:20
Example::mField
MoFEM::Interface & mField
Definition: plastic.cpp:235
m
FTensor::Index< 'm', 3 > m
Definition: shallow_wave.cpp:80
FTensor::Kronecker_Delta_symmetric
Kronecker Delta class symmetric.
Definition: Kronecker_Delta.hpp:49
Example::CommonData::SECOND_XZ
@ SECOND_XZ
Definition: integration.cpp:75
MOFEM_ATOM_TEST_INVALID
@ MOFEM_ATOM_TEST_INVALID
Definition: definitions.h:40
Example::reactionFe
boost::shared_ptr< DomainEle > reactionFe
Definition: plastic.cpp:243
MoFEM::getDMSnesCtx
auto getDMSnesCtx(DM dm)
Get SNES context data structure used by DM.
Definition: DMMoFEM.hpp:1046
MoFEMFunctionBeginHot
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:440
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:2989
MoFEM::DMMoFEMAddSubFieldRow
PetscErrorCode DMMoFEMAddSubFieldRow(DM dm, const char field_name[])
Definition: DMMoFEM.cpp:242
Example::createCommonData
MoFEMErrorCode createCommonData()
[Set up problem]
Definition: plastic.cpp:447
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:575
MoFEM::SmartPetscObj< Mat >
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:590
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:416
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:1060
MoFEM::SCHUR
@ SCHUR
Definition: FormsIntegrators.hpp:104
H
double H
Hardening.
Definition: plastic.cpp:175
tau_order
int tau_order
Order of tau files.
Definition: plastic.cpp:186
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:1289
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:346
l
FTensor::Index< 'l', 3 > l
Definition: matrix_function.cpp:21
alpha_damping
double alpha_damping
Definition: plastic.cpp:192
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