v0.15.5
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Public Attributes | List of all members
BasicBoundaryConditionsInterface Struct Reference

Set of functions declaring elements and setting operators for basic boundary conditions interface. More...

#include "users_modules/basic_finite_elements/src/BasicBoundaryConditionsInterface.hpp"

Inheritance diagram for BasicBoundaryConditionsInterface:
[legend]
Collaboration diagram for BasicBoundaryConditionsInterface:
[legend]

Classes

struct  BasicBCVectorConst
 
struct  BasicBCVectorScale
 
struct  LoadScale
 

Public Types

using DomainEle = VolumeElementForcesAndSourcesCore
 
using DomainEleOp = DomainEle::UserDataOperator
 
using BoundaryEle = FaceElementForcesAndSourcesCore
 
using BoundaryEleOp = BoundaryEle::UserDataOperator
 
using OpBodyForce = FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< 1, 3 >
 
using DomainNaturalBC = NaturalBC< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >
 
using OpBodyForceVector = DomainNaturalBC::OpFlux< NaturalMeshsetTypeVectorScaling< BLOCKSET >, 1, 3 >
 
using OpMass = FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, 3 >
 
using OpInertiaForce = FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesVector< 1, 3, 1 >
 
- Public Types inherited from GenericElementInterface
enum  TSType {
  EX , IM , IM2 , IMEX ,
  DEFAULT , EX , IM , IM2 ,
  IMEX , DEFAULT
}
 
enum  TSType {
  EX , IM , IM2 , IMEX ,
  DEFAULT , EX , IM , IM2 ,
  IMEX , DEFAULT
}
 
using BcMarkerPtr = boost::shared_ptr< std::vector< char unsigned > >
 
using BcMarkerPtr = boost::shared_ptr< std::vector< char unsigned > >
 

Public Member Functions

 BasicBoundaryConditionsInterface (MoFEM::Interface &m_field, string postion_field, string mesh_pos_field_name="MESH_NODE_POSITIONS", string problem_name="ELASTIC", string domain_element_name="ELASTIC_FE", bool is_displacement_field=true, bool is_quasi_static=true, double *snes_load_factor=nullptr, bool is_partitioned=true)
 
 ~BasicBoundaryConditionsInterface ()
 
MoFEMErrorCode getCommandLineParameters () override
 
MoFEMErrorCode addElementFields () override
 
MoFEMErrorCode createElements () override
 
MoFEMErrorCode setOperators () override
 
MoFEMErrorCode addElementsToDM (SmartPetscObj< DM > dm) override
 
MoFEMErrorCode updateElementVariables () override
 
MoFEMErrorCode postProcessElement (int step) override
 
string getHistoryParam (string prefix)
 
template<typename T >
MoFEMErrorCode setupSolverFunction (const TSType type=IM)
 
template<typename T >
MoFEMErrorCode setupSolverJacobian (const TSType type=IM)
 
template<typename T , bool RHS>
MoFEMErrorCode setupSolverImpl (const TSType type=IM)
 
MoFEMErrorCode setupSolverFunctionSNES () override
 
MoFEMErrorCode setupSolverJacobianSNES () override
 
MoFEMErrorCode setupSolverFunctionTS (const TSType type) override
 
MoFEMErrorCode setupSolverJacobianTS (const TSType type) override
 
- Public Member Functions inherited from GenericElementInterface
 GenericElementInterface ()
 
virtual ~GenericElementInterface ()
 
virtual MoFEMErrorCode setGlobalBoundaryMarker (BcMarkerPtr mark)
 
virtual BcMarkerPtr getGlobalBoundaryMarker ()
 
virtual MoFEMErrorCode setMonitorPtr (boost::shared_ptr< MoFEM::FEMethod > monitor_ptr)
 
virtual BitRefLevel getBitRefLevel ()
 
virtual BitRefLevel getBitRefLevelMask ()
 
virtual MoFEMErrorCode opFactoryDomainRhs (boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip)
 
virtual MoFEMErrorCode opFactoryDomainLhs (boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip)
 
virtual MoFEMErrorCode setUpdateElementVariablesOperators ()
 
virtual MoFEMErrorCode updateElementVariables (SmartPetscObj< DM > dm, string fe_name)
 
virtual MoFEMErrorCode postProcessElement (int step, SmartPetscObj< DM > dm, string fe_name)
 
 GenericElementInterface ()
 
virtual ~GenericElementInterface ()
 
virtual MoFEMErrorCode setGlobalBoundaryMarker (BcMarkerPtr mark)
 
virtual BcMarkerPtr getGlobalBoundaryMarker ()
 
virtual MoFEMErrorCode setMonitorPtr (boost::shared_ptr< FEMethod > monitor_ptr)
 
virtual BitRefLevel getBitRefLevel ()
 
virtual BitRefLevel getBitRefLevelMask ()
 
virtual MoFEMErrorCode opFactoryDomainRhs (boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip)
 
virtual MoFEMErrorCode opFactoryDomainLhs (boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip)
 
virtual MoFEMErrorCode setUpdateElementVariablesOperators ()
 
virtual MoFEMErrorCode updateElementVariables (SmartPetscObj< DM > dm, string fe_name)
 
virtual MoFEMErrorCode postProcessElement (int step, SmartPetscObj< DM > dm, string fe_name)
 

Public Attributes

MoFEM::InterfacemField
 
SmartPetscObj< DM > dM
 
doublesnesLambdaLoadFactorPtr
 
bool isDisplacementField
 
bool isQuasiStatic
 
bool isPartitioned
 
bool isLinear
 
BitRefLevel bIt
 
string positionField
 
string meshNodeField
 
boost::ptr_map< std::string, NeumannForcesSurfaceneumann_forces
 
boost::ptr_map< std::string, NodalForcenodal_forces
 
boost::ptr_map< std::string, EdgeForceedge_forces
 
boost::shared_ptr< FluidPressurefluidPressureElementPtr
 
boost::shared_ptr< FaceElementForcesAndSourcesCorespringRhsPtr
 
boost::shared_ptr< FaceElementForcesAndSourcesCorespringLhsPtr
 
boost::shared_ptr< VolumeElementForcesAndSourcesCore > bodyForceRhsPtr
 
boost::shared_ptr< VolumeElementForcesAndSourcesCore > bodyForceLhsPtr
 
boost::shared_ptr< DirichletDisplacementBcdirichletBcPtr
 
boost::shared_ptr< KelvinVoigtDamperdamperElementPtr
 
const string domainProblemName
 
const string domainElementName
 
- Public Attributes inherited from GenericElementInterface
BcMarkerPtr mBoundaryMarker
 
int atomTest
 
int restartRunStep
 
boost::shared_ptr< MoFEM::FEMethodmonitorPtr
 
boost::shared_ptr< FEMethodmonitorPtr
 

Detailed Description

Set of functions declaring elements and setting operators for basic boundary conditions interface.

Definition at line 20 of file BasicBoundaryConditionsInterface.hpp.

Member Typedef Documentation

◆ BoundaryEle

Definition at line 24 of file BasicBoundaryConditionsInterface.hpp.

◆ BoundaryEleOp

using BasicBoundaryConditionsInterface::BoundaryEleOp = BoundaryEle::UserDataOperator

Definition at line 25 of file BasicBoundaryConditionsInterface.hpp.

◆ DomainEle

using BasicBoundaryConditionsInterface::DomainEle = VolumeElementForcesAndSourcesCore

Definition at line 22 of file BasicBoundaryConditionsInterface.hpp.

◆ DomainEleOp

using BasicBoundaryConditionsInterface::DomainEleOp = DomainEle::UserDataOperator

Definition at line 23 of file BasicBoundaryConditionsInterface.hpp.

◆ DomainNaturalBC

Definition at line 29 of file BasicBoundaryConditionsInterface.hpp.

◆ OpBodyForce

using BasicBoundaryConditionsInterface::OpBodyForce = FormsIntegrators<DomainEleOp>::Assembly< PETSC>::LinearForm<GAUSS>::OpSource<1, 3>

Definition at line 27 of file BasicBoundaryConditionsInterface.hpp.

◆ OpBodyForceVector

Definition at line 31 of file BasicBoundaryConditionsInterface.hpp.

◆ OpInertiaForce

using BasicBoundaryConditionsInterface::OpInertiaForce = FormsIntegrators<DomainEleOp>::Assembly< PETSC>::LinearForm<GAUSS>::OpBaseTimesVector<1, 3, 1>

Definition at line 36 of file BasicBoundaryConditionsInterface.hpp.

◆ OpMass

using BasicBoundaryConditionsInterface::OpMass = FormsIntegrators<DomainEleOp>::Assembly<PETSC>::BiLinearForm< GAUSS>::OpMass<1, 3>

Definition at line 34 of file BasicBoundaryConditionsInterface.hpp.

Constructor & Destructor Documentation

◆ BasicBoundaryConditionsInterface()

BasicBoundaryConditionsInterface::BasicBoundaryConditionsInterface ( MoFEM::Interface m_field,
string  postion_field,
string  mesh_pos_field_name = "MESH_NODE_POSITIONS",
string  problem_name = "ELASTIC",
string  domain_element_name = "ELASTIC_FE",
bool  is_displacement_field = true,
bool  is_quasi_static = true,
double snes_load_factor = nullptr,
bool  is_partitioned = true 
)
inline

Definition at line 115 of file BasicBoundaryConditionsInterface.hpp.

122 : mField(m_field), positionField(postion_field),
123 meshNodeField(mesh_pos_field_name), domainProblemName(problem_name),
124 domainElementName(domain_element_name),
125 isDisplacementField(is_displacement_field),
127 snesLambdaLoadFactorPtr(snes_load_factor),
128 isPartitioned(is_partitioned), isLinear(PETSC_FALSE) {}
PetscBool is_quasi_static
Definition plastic.cpp:143

◆ ~BasicBoundaryConditionsInterface()

BasicBoundaryConditionsInterface::~BasicBoundaryConditionsInterface ( )
inline

Definition at line 130 of file BasicBoundaryConditionsInterface.hpp.

130{}

Member Function Documentation

◆ addElementFields()

MoFEMErrorCode BasicBoundaryConditionsInterface::addElementFields ( )
inlineoverridevirtual

Implements GenericElementInterface.

Definition at line 148 of file BasicBoundaryConditionsInterface.hpp.

148{ return 0;};

◆ addElementsToDM()

MoFEMErrorCode BasicBoundaryConditionsInterface::addElementsToDM ( SmartPetscObj< DM >  dm)
inlineoverridevirtual

Implements GenericElementInterface.

Definition at line 404 of file BasicBoundaryConditionsInterface.hpp.

404 {
406 this->dM = dm;
407 auto simple = mField.getInterface<Simple>();
408 vector<const char *> element_list{"FORCE_FE", "PRESSURE_FE",
409 "FLUID_PRESSURE_FE",
410 "SPRING",
411 "DAMPER_FE"};
412 for (auto &el : element_list) {
414 simple->getOtherFiniteElements().push_back(el);
415 }
416 // if (!fluidPressureElementPtr->setOfFluids.empty())
417 // FIXME:
418 // CHKERR mField.modify_problem_add_finite_element(domainProblemName,
419 // "FLUID_PRESSURE_FE");
420 // CHKERR dynamic_cast<DirichletDisplacementRemoveDofsBc &>(
421 // *dirichletBcPtr).iNitialize();
423 };
void simple(double P1[], double P2[], double P3[], double c[], const int N)
Definition acoustic.cpp:69
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
PetscErrorCode DMMoFEMAddElement(DM dm, std::string fe_name)
add element to dm
Definition DMMoFEM.cpp:488
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.

◆ createElements()

MoFEMErrorCode BasicBoundaryConditionsInterface::createElements ( )
inlineoverridevirtual

Implements GenericElementInterface.

Definition at line 150 of file BasicBoundaryConditionsInterface.hpp.

150 {
152
158
160 dirichletBcPtr = boost::make_shared<DirichletSpatialRemoveDofsBc>(
162 "DISPLACEMENT", isPartitioned);
163 else
164 dirichletBcPtr = boost::make_shared<DirichletDisplacementRemoveDofsBc>(
165 mField, positionField, domainProblemName, "DISPLACEMENT",
167 // CHKERR dynamic_cast<DirichletDisplacementRemoveDofsBc &>(
168 // *dirichletBcPtr).iNitialize();
169
179
180 // CHKERR mField.add_finite_element(domainElementName, "FLUID_PRESSURE_FE");
181
182 fluidPressureElementPtr = boost::make_shared<FluidPressure>(mField);
183 fluidPressureElementPtr->addNeumannFluidPressureBCElements(positionField);
185 false, false);
186
187 damperElementPtr = boost::make_shared<KelvinVoigtDamper>(mField);
188 damperElementPtr->commonData.meshNodePositionName = meshNodeField;
189
190 auto &common_data = damperElementPtr->commonData;
191
192 common_data.spatialPositionName = positionField;
193 common_data.spatialPositionNameDot = "DOT_" + positionField;
194 damperElementPtr->setBlockDataMap(); FIXME:
195
196 for (auto &[id, data] : damperElementPtr->blockMaterialDataMap) {
197 data.lInear = isLinear;
198 int cid = id;
199 damperElementPtr->constitutiveEquationMap.insert(
202 "DAMPER_FE");
203 }
204
206 };
@ MF_ZERO
virtual MoFEMErrorCode add_finite_element(const std::string &fe_name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
add finite element
virtual MoFEMErrorCode modify_finite_element_add_field_col(const std::string &fe_name, const std::string name_row)=0
set field col which finite element use
virtual MoFEMErrorCode add_ents_to_finite_element_by_type(const EntityHandle entities, const EntityType type, const std::string name, const bool recursive=true)=0
add entities to finite element
virtual MoFEMErrorCode modify_finite_element_add_field_row(const std::string &fe_name, const std::string name_row)=0
set field row which finite element use
virtual MoFEMErrorCode modify_finite_element_add_field_data(const std::string &fe_name, const std::string name_field)=0
set finite element field data
MoFEMErrorCode addHOOpsFace3D(const std::string field, E &e, bool hcurl, bool hdiv)
boost::shared_ptr< FluidPressure > fluidPressureElementPtr
boost::shared_ptr< KelvinVoigtDamper > damperElementPtr
boost::shared_ptr< DirichletDisplacementBc > dirichletBcPtr
static MoFEMErrorCode addElement(MoFEM::Interface &m_field, const std::string field_name, Range *intersect_ptr=NULL)
Add element taking information from NODESET.
Definition EdgeForce.hpp:62
static MoFEMErrorCode addNeumannBCElements(MoFEM::Interface &m_field, const std::string field_name, const std::string mesh_nodals_positions="MESH_NODE_POSITIONS", Range *intersect_ptr=NULL)
Declare finite element.
static MoFEMErrorCode addElement(MoFEM::Interface &m_field, const std::string field_name, Range *intersect_ptr=NULL)
Add element taking information from NODESET.
static MoFEMErrorCode addSpringElements(MoFEM::Interface &m_field, const std::string field_name, const std::string mesh_nodals_positions="MESH_NODE_POSITIONS")
Declare spring element.

◆ getCommandLineParameters()

MoFEMErrorCode BasicBoundaryConditionsInterface::getCommandLineParameters ( )
inlineoverridevirtual

Reimplemented from GenericElementInterface.

Definition at line 132 of file BasicBoundaryConditionsInterface.hpp.

132 {
134
135 PetscBool quasi_static = PETSC_FALSE;
136 PetscBool is_linear = PETSC_FALSE;
137 CHKERR PetscOptionsGetBool(PETSC_NULLPTR, "-is_quasi_static", &quasi_static,
138 PETSC_NULLPTR);
139 CHKERR PetscOptionsGetBool(PETSC_NULLPTR, "-is_linear", &is_linear,
140 PETSC_NULLPTR);
141
142 isQuasiStatic = quasi_static;
143 isLinear = is_linear;
144
146 };
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)

◆ getHistoryParam()

string BasicBoundaryConditionsInterface::getHistoryParam ( string  prefix)
inline

Definition at line 428 of file BasicBoundaryConditionsInterface.hpp.

428 {
429 char load_hist_file[255] = "hist.in";
430 PetscBool ctg_flag = PETSC_FALSE;
431 string new_param_file = string("-") + prefix + string("_history");
432 CHKERR PetscOptionsGetString(PETSC_NULLPTR, PETSC_NULLPTR, new_param_file.c_str(),
433 load_hist_file, 255, &ctg_flag);
434 if (ctg_flag)
435 return new_param_file;
436 return string("-load_history");
437 };
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)

◆ postProcessElement()

MoFEMErrorCode BasicBoundaryConditionsInterface::postProcessElement ( int  step)
inlineoverridevirtual

Implements GenericElementInterface.

Definition at line 426 of file BasicBoundaryConditionsInterface.hpp.

426{ return 0; };

◆ setOperators()

MoFEMErrorCode BasicBoundaryConditionsInterface::setOperators ( )
inlineoverridevirtual

Implements GenericElementInterface.

Definition at line 208 of file BasicBoundaryConditionsInterface.hpp.

208 {
214
216 mField, neumann_forces, PETSC_NULLPTR, positionField);
217 springLhsPtr = boost::make_shared<FaceElementForcesAndSourcesCore>(mField);
218 springRhsPtr = boost::make_shared<FaceElementForcesAndSourcesCore>(mField);
220 boost::make_shared<VolumeElementForcesAndSourcesCore>(mField);
222 boost::make_shared<VolumeElementForcesAndSourcesCore>(mField);
223
227
228
229 fluidPressureElementPtr->setNeumannFluidPressureFiniteElementOperators(
230 positionField, PETSC_NULLPTR, true, true);
231
232 // KelvinVoigtDamper::CommonData &common_data =
233 // damperElementPtr->commonData;
234 CHKERR damperElementPtr->setOperators(3);
235
236 // auto dm = mField.getInterface<Simple>()->getDM();
237
238 auto get_id_block_param = [&](string base_name, int id) {
239 char load_hist_file[255] = "hist.in";
240 PetscBool ctg_flag = PETSC_FALSE;
241 string param_name_with_id = "-" + base_name + "_" + to_string(id);
242 CHKERR PetscOptionsGetString(PETSC_NULLPTR, PETSC_NULLPTR,
243 param_name_with_id.c_str(), load_hist_file,
244 255, &ctg_flag);
245 if (ctg_flag)
246 return param_name_with_id;
247
248 param_name_with_id = "-" + base_name;
249 CHKERR PetscOptionsGetString(PETSC_NULLPTR, PETSC_NULLPTR,
250 param_name_with_id.c_str(), load_hist_file,
251 255, &ctg_flag);
252 if (ctg_flag) {
253 MOFEM_LOG("WORLD", Sev::verbose)
254 << "Setting one accelerogram for all blocks!";
255 return param_name_with_id;
256 }
257
258 return string("");
259 };
260
261 auto get_adj_ents = [&](const Range &ents) {
262 Range verts;
263 CHKERR mField.get_moab().get_connectivity(ents, verts, true);
264 for (size_t d = 1; d < 3; ++d)
265 CHKERR mField.get_moab().get_adjacencies(ents, d, false, verts,
266 moab::Interface::UNION);
267 verts.merge(ents);
268 CHKERR mField.getInterface<CommInterface>()->synchroniseEntities(verts);
269 return verts;
270 };
271
273 const std::string block_name = "BODY_FORCE";
274 if (it->getName().compare(0, block_name.size(), block_name) == 0) {
275 std::vector<double> attr;
276 CHKERR it->getAttributes(attr);
277 if (attr.size() > 3) {
278
279 const int id = it->getMeshsetId();
280
281 Range bc_ents;
282 CHKERR it->getMeshsetIdEntitiesByDimension(mField.get_moab(), 3,
283 bc_ents, true);
284 auto bc_ents_ptr = boost::make_shared<Range>(get_adj_ents(bc_ents));
285
286 // the first parameter is density!!! FIXME:
287
288 VectorDouble acc({attr[1], attr[2], attr[3]});
289 double density = attr[0];
290 bool inertia_flag =
291 attr.size() > 4 ? bool(std::floor(attr[4])) : true;
292 // if accelerogram is provided then change the acceleration,
293 // otherwise use whatever is in that block TODO:
294 std::vector<boost::shared_ptr<TimeScaleVector3>> methods_for_scaling;
295 std::string param_name_for_scaling =
296 get_id_block_param("accelerogram", id);
297
298 if (!param_name_for_scaling.empty())
299 methods_for_scaling.push_back(
300 boost::make_shared<BasicBCVectorScale>(density,
301 param_name_for_scaling));
302 else
303 methods_for_scaling.push_back(
304 boost::make_shared<BasicBCVectorConst>(
305 density,
306 FTensor::Tensor1<double, 3>({acc(0), acc(1), acc(2)})));
307
308 // FIXME: this require correction for large strains, multiply by det_F
309 auto get_rho = [&](double, double, double) {
310 auto &fe_domain_lhs = bodyForceLhsPtr;
311 return density * fe_domain_lhs->ts_aa;
312 };
313
314 auto &pipeline_rhs = bodyForceRhsPtr->getOpPtrVector();
315 auto &pipeline_lhs = bodyForceLhsPtr->getOpPtrVector();
316
318 false, false);
320 false, false);
321
322 //FIXME: fix for large strains
323 pipeline_rhs.push_back(
324 new OpSetBc(positionField, true, mBoundaryMarker));
325
326 // using new way of adding BCs
327 CHKERR
328 DomainNaturalBC::AddFluxToPipeline<OpBodyForceVector>::add(
329 pipeline_rhs, mField, "U", {}, methods_for_scaling,
330 it->getName(), Sev::inform);
331
332 if (!isQuasiStatic && inertia_flag) {
333 pipeline_lhs.push_back(
334 new OpSetBc(positionField, true, mBoundaryMarker));
335 pipeline_lhs.push_back(
336 new OpMass(positionField, positionField, get_rho, bc_ents_ptr));
337 auto mat_acceleration = boost::make_shared<MatrixDouble>();
338 pipeline_rhs.push_back(new OpCalculateVectorFieldValuesDotDot<3>(
339 positionField, mat_acceleration));
340 pipeline_rhs.push_back(new OpInertiaForce(
341 positionField, mat_acceleration,
342 [&](double, double, double) { return density; }, bc_ents_ptr));
343 pipeline_lhs.push_back(new OpUnSetBc(positionField));
344 }
345 pipeline_rhs.push_back(new OpUnSetBc(positionField));
346
347 } else {
348 SETERRQ(
349 PETSC_COMM_SELF, MOFEM_INVALID_DATA,
350 "There should be (1 density + 3 accelerations ) attributes in "
351 "BODY_FORCE blockset, but is %ld. Optionally, you can set 5th "
352 "parameter to inertia flag.",
353 attr.size());
354 }
355 }
356 }
357
358 auto integration_rule_vol = [](int, int, int approx_order) {
359 return 2 * approx_order + 1;
360 };
361 auto integration_rule_boundary = [](int, int, int approx_order) {
362 return 2 * approx_order + 1;
363 };
364
365 springLhsPtr->getRuleHook = integration_rule_boundary;
366 springRhsPtr->getRuleHook = integration_rule_boundary;
367 bodyForceLhsPtr->getRuleHook = integration_rule_vol;
368 bodyForceRhsPtr->getRuleHook = integration_rule_vol;
369
370 // set other boundary conditions
371 auto bc_mng = mField.getInterface<BcManager>();
372 auto *pipeline_mng = mField.getInterface<PipelineManager>();
373
374 CHKERR bc_mng->removeBlockDOFsOnEntities(domainProblemName, "REMOVE_X",
375 positionField, 0, 0, true,
377 CHKERR bc_mng->removeBlockDOFsOnEntities(domainProblemName, "REMOVE_Y",
378 positionField, 1, 1, true,
380 CHKERR bc_mng->removeBlockDOFsOnEntities(domainProblemName, "REMOVE_Z",
381 positionField, 2, 2, true,
383 CHKERR bc_mng->removeBlockDOFsOnEntities(domainProblemName, "REMOVE_ALL",
384 positionField, 0, 2, true,
386
387 CHKERR bc_mng->pushMarkDOFsOnEntities(domainProblemName, "FIX_X",
388 positionField, 0, 0);
389 CHKERR bc_mng->pushMarkDOFsOnEntities(domainProblemName, "FIX_Y",
390 positionField, 1, 1);
391 CHKERR bc_mng->pushMarkDOFsOnEntities(domainProblemName, "FIX_Z",
392 positionField, 2, 2);
393 CHKERR bc_mng->pushMarkDOFsOnEntities(domainProblemName, "FIX_ALL",
394 positionField, 0, 2);
395 CHKERR bc_mng->pushMarkDOFsOnEntities(domainProblemName, "ROTATE",
396 positionField, 0, 2);
397
399 bc_mng->getMergedBlocksMarker(vector<string>{"FIX_", "ROTATE"});
400
402 };
@ BLOCKSET
@ MOFEM_INVALID_DATA
Definition definitions.h:36
#define MOFEM_LOG(channel, severity)
Log.
#define _IT_CUBITMESHSETS_BY_SET_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet having a particular BC meshset in a moFEM field.
auto get_adj_ents(moab::Interface &moab, const Range &ents)
Definition BcManager.cpp:17
UBlasVector< double > VectorDouble
Definition Types.hpp:68
MoFEMErrorCode addHOOpsVol(const std::string field, E &e, bool h1, bool hcurl, bool hdiv, bool l2)
static constexpr int approx_order
boost::shared_ptr< FaceElementForcesAndSourcesCore > springLhsPtr
boost::shared_ptr< VolumeElementForcesAndSourcesCore > bodyForceLhsPtr
boost::shared_ptr< FaceElementForcesAndSourcesCore > springRhsPtr
boost::ptr_map< std::string, EdgeForce > edge_forces
boost::ptr_map< std::string, NodalForce > nodal_forces
boost::ptr_map< std::string, NeumannForcesSurface > neumann_forces
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, 3 > OpMass
boost::shared_ptr< VolumeElementForcesAndSourcesCore > bodyForceRhsPtr
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesVector< 1, 3, 1 > OpInertiaForce
static MoFEMErrorCode setOperators(MoFEM::Interface &m_field, boost::ptr_map< std::string, EdgeForce > &edge_forces, Vec F, const std::string field_name, std::string mesh_node_positions="MESH_NODE_POSITIONS")
Set integration point operators.
Definition EdgeForce.hpp:97
static MoFEMErrorCode setMomentumFluxOperators(MoFEM::Interface &m_field, boost::ptr_map< std::string, NeumannForcesSurface > &neumann_forces, Vec F, const std::string field_name, const std::string mesh_nodals_positions="MESH_NODE_POSITIONS")
Set operators to finite elements calculating right hand side vector.
static MoFEMErrorCode setOperators(MoFEM::Interface &m_field, boost::ptr_map< std::string, NodalForce > &nodal_forces, Vec F, const std::string field_name)
Set integration point operators.
static MoFEMErrorCode setSpringOperators(MoFEM::Interface &m_field, boost::shared_ptr< FaceElementForcesAndSourcesCore > fe_spring_lhs_ptr, boost::shared_ptr< FaceElementForcesAndSourcesCore > fe_spring_rhs_ptr, const std::string field_name, const std::string mesh_nodals_positions="MESH_NODE_POSITIONS", double stiffness_scale=1.)
Implementation of spring element. Set operators to calculate LHS and RHS.
virtual moab::Interface & get_moab()=0

◆ setupSolverFunction()

template<typename T >
MoFEMErrorCode BasicBoundaryConditionsInterface::setupSolverFunction ( const TSType  type = IM)
inline

Definition at line 440 of file BasicBoundaryConditionsInterface.hpp.

440 {
441 CHKERR setupSolverImpl<T, true>(type);
443 }

◆ setupSolverFunctionSNES()

MoFEMErrorCode BasicBoundaryConditionsInterface::setupSolverFunctionSNES ( )
inlineoverridevirtual

Reimplemented from GenericElementInterface.

Definition at line 578 of file BasicBoundaryConditionsInterface.hpp.

578 {
580 CHKERR this->setupSolverFunction<SNES>();
582 }

◆ setupSolverFunctionTS()

MoFEMErrorCode BasicBoundaryConditionsInterface::setupSolverFunctionTS ( const TSType  type)
inlineoverridevirtual

Implements GenericElementInterface.

Definition at line 589 of file BasicBoundaryConditionsInterface.hpp.

589 {
591 CHKERR this->setupSolverFunction<TS>(type);
593 }

◆ setupSolverImpl()

template<typename T , bool RHS>
MoFEMErrorCode BasicBoundaryConditionsInterface::setupSolverImpl ( const TSType  type = IM)
inline

Definition at line 452 of file BasicBoundaryConditionsInterface.hpp.

452 {
454 // auto dm = dM;
455 // boost::shared_ptr<FEMethod> null;
456
457 auto set_solver_pipelines =
458 [&](PetscErrorCode (*function)(DM, const char fe_name[], MoFEM::FEMethod *,
461 PetscErrorCode (*jacobian)(DM, const char fe_name[], MoFEM::FEMethod *,
464
466 if (RHS) {
467 if (std::is_same_v<T, TS>)
468 dirichletBcPtr->methodsOp.push_back(
469 new TimeForceScale(getHistoryParam("dirichlet"), false));
470
472
473 // auto push_fmethods = [&](auto method, string element_name) {
474 // CHKERR function(dm, element_name.c_str(), method, method, method);
475 // };
476
477 auto set_neumann_methods = [&](auto &neumann_el, string hist_name,
478 int dim) {
480 for (auto &&mit : neumann_el) {
481 if constexpr (std::is_same_v<T, SNES>)
482 mit->second->methodsOp.push_back(
483 new LoadScale(snesLambdaLoadFactorPtr));
484 if constexpr (std::is_same_v<T, TS>)
485 mit->second->methodsOp.push_back(
486 new TimeForceScale(getHistoryParam(hist_name), false));
487 string element_name = mit->first;
488 switch (dim) {
489 case 2:
491 mit->second->getLoopFe().getOpPtrVector(), {},
493 break;
494 case 1:
496 mit->second->getLoopFe().getOpPtrVector(), {},
498 break;
499 case 0:
500 break;
501 default:
502 break;
503 }
504 // CHKERR push_fmethods(&mit->second->getLoopFe(),
505 // element_name);
506 CHKERR function(dM, element_name.c_str(),
507 &mit->second->getLoopFe(), NULL, NULL);
508 }
510 };
511
512 CHKERR set_neumann_methods(neumann_forces, "force", 2);
513 CHKERR set_neumann_methods(nodal_forces, "force", 0);
514 CHKERR set_neumann_methods(edge_forces, "force", 1);
515
516 CHKERR function(dM, domainElementName.c_str(), dirichletBcPtr.get(),
517 dirichletBcPtr.get(), dirichletBcPtr.get());
518 CHKERR function(dM, domainElementName.c_str(),
519 bodyForceRhsPtr.get(), NULL, NULL);
520 CHKERR function(dM, "SPRING", springRhsPtr.get(), NULL, NULL);
521 CHKERR function(dM, "DAMPER_FE", &damperElementPtr->feRhs, NULL,
522 NULL);
523 CHKERR function(dM, "FLUID_PRESSURE_FE",
524 &fluidPressureElementPtr->getLoopFe(), NULL, NULL);
525 } else {
526
527 CHKERR jacobian(dM, domainElementName.c_str(), dirichletBcPtr.get(),
528 dirichletBcPtr.get(), dirichletBcPtr.get());
529 CHKERR jacobian(dM, domainElementName.c_str(),
530 bodyForceLhsPtr.get(), NULL, NULL);
531 CHKERR jacobian(dM, "SPRING", springLhsPtr.get(), NULL, NULL);
532
533 CHKERR jacobian(dM, "DAMPER_FE", &damperElementPtr->feLhs, NULL,
534 NULL);
535 }
536
538 };
539
540 if constexpr (std::is_same_v<T, SNES>) {
541
543 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
544 "SNES lambda factor pointer not set in the module constructor");
545
546 CHKERR set_solver_pipelines(&DMMoFEMSNESSetFunction,
547 &DMMoFEMSNESSetJacobian);
548
549 } else if constexpr (std::is_same_v<T, TS>) {
550
551 switch (type) {
552 case IM:
553 CHKERR set_solver_pipelines(&DMMoFEMTSSetIFunction,
554 &DMMoFEMTSSetIJacobian);
555 break;
556 case IM2:
557 CHKERR set_solver_pipelines(&DMMoFEMTSSetI2Function,
558 &DMMoFEMTSSetI2Jacobian);
559 break;
560 case EX:
561 CHKERR set_solver_pipelines(&DMMoFEMTSSetRHSFunction,
562 &DMMoFEMTSSetRHSJacobian);
563 break;
564 default:
565 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
566 "This TS is not yet implemented for basic BCs");
567 break;
568 }
569
570 } else
571 static_assert(!std::is_same_v<T, KSP>,
572 "this solver has not been implemented for basic BCs yet");
573
574
576 }
@ MOFEM_NOT_IMPLEMENTED
Definition definitions.h:32
PetscErrorCode DMoFEMPreProcessFiniteElements(DM dm, MoFEM::FEMethod *method)
execute finite element method for each element in dm (problem)
Definition DMMoFEM.cpp:536
Data structure to exchange data between MoFEM and User Loop Methods.
Structure for user loop methods on finite elements.
Force scale operator for reading two columns.

◆ setupSolverJacobian()

template<typename T >
MoFEMErrorCode BasicBoundaryConditionsInterface::setupSolverJacobian ( const TSType  type = IM)
inline

Definition at line 446 of file BasicBoundaryConditionsInterface.hpp.

446 {
447 CHKERR setupSolverImpl<T, false>(type);
449 }

◆ setupSolverJacobianSNES()

MoFEMErrorCode BasicBoundaryConditionsInterface::setupSolverJacobianSNES ( )
inlineoverridevirtual

Reimplemented from GenericElementInterface.

Definition at line 583 of file BasicBoundaryConditionsInterface.hpp.

583 {
585 CHKERR this->setupSolverJacobian<SNES>();
587 }

◆ setupSolverJacobianTS()

MoFEMErrorCode BasicBoundaryConditionsInterface::setupSolverJacobianTS ( const TSType  type)
inlineoverridevirtual

Implements GenericElementInterface.

Definition at line 595 of file BasicBoundaryConditionsInterface.hpp.

595 {
597 CHKERR this->setupSolverJacobian<TS>(type);
599 }

◆ updateElementVariables()

MoFEMErrorCode BasicBoundaryConditionsInterface::updateElementVariables ( )
inlineoverridevirtual

Reimplemented from GenericElementInterface.

Definition at line 425 of file BasicBoundaryConditionsInterface.hpp.

425{ return 0; };

Member Data Documentation

◆ bIt

BitRefLevel BasicBoundaryConditionsInterface::bIt

Definition at line 88 of file BasicBoundaryConditionsInterface.hpp.

◆ bodyForceLhsPtr

boost::shared_ptr<VolumeElementForcesAndSourcesCore> BasicBoundaryConditionsInterface::bodyForceLhsPtr

Definition at line 103 of file BasicBoundaryConditionsInterface.hpp.

◆ bodyForceRhsPtr

boost::shared_ptr<VolumeElementForcesAndSourcesCore> BasicBoundaryConditionsInterface::bodyForceRhsPtr

Definition at line 102 of file BasicBoundaryConditionsInterface.hpp.

◆ damperElementPtr

boost::shared_ptr<KelvinVoigtDamper> BasicBoundaryConditionsInterface::damperElementPtr

Definition at line 107 of file BasicBoundaryConditionsInterface.hpp.

◆ dirichletBcPtr

boost::shared_ptr<DirichletDisplacementBc> BasicBoundaryConditionsInterface::dirichletBcPtr

Definition at line 106 of file BasicBoundaryConditionsInterface.hpp.

◆ dM

SmartPetscObj<DM> BasicBoundaryConditionsInterface::dM

Definition at line 69 of file BasicBoundaryConditionsInterface.hpp.

◆ domainElementName

const string BasicBoundaryConditionsInterface::domainElementName

Definition at line 110 of file BasicBoundaryConditionsInterface.hpp.

◆ domainProblemName

const string BasicBoundaryConditionsInterface::domainProblemName

Definition at line 109 of file BasicBoundaryConditionsInterface.hpp.

◆ edge_forces

boost::ptr_map<std::string, EdgeForce> BasicBoundaryConditionsInterface::edge_forces

Definition at line 95 of file BasicBoundaryConditionsInterface.hpp.

◆ fluidPressureElementPtr

boost::shared_ptr<FluidPressure> BasicBoundaryConditionsInterface::fluidPressureElementPtr

Definition at line 97 of file BasicBoundaryConditionsInterface.hpp.

◆ isDisplacementField

bool BasicBoundaryConditionsInterface::isDisplacementField

Definition at line 83 of file BasicBoundaryConditionsInterface.hpp.

◆ isLinear

bool BasicBoundaryConditionsInterface::isLinear

Definition at line 86 of file BasicBoundaryConditionsInterface.hpp.

◆ isPartitioned

bool BasicBoundaryConditionsInterface::isPartitioned

Definition at line 85 of file BasicBoundaryConditionsInterface.hpp.

◆ isQuasiStatic

bool BasicBoundaryConditionsInterface::isQuasiStatic

Definition at line 84 of file BasicBoundaryConditionsInterface.hpp.

◆ meshNodeField

string BasicBoundaryConditionsInterface::meshNodeField

Definition at line 91 of file BasicBoundaryConditionsInterface.hpp.

◆ mField

MoFEM::Interface& BasicBoundaryConditionsInterface::mField

Definition at line 68 of file BasicBoundaryConditionsInterface.hpp.

◆ neumann_forces

boost::ptr_map<std::string, NeumannForcesSurface> BasicBoundaryConditionsInterface::neumann_forces

Definition at line 93 of file BasicBoundaryConditionsInterface.hpp.

◆ nodal_forces

boost::ptr_map<std::string, NodalForce> BasicBoundaryConditionsInterface::nodal_forces

Definition at line 94 of file BasicBoundaryConditionsInterface.hpp.

◆ positionField

string BasicBoundaryConditionsInterface::positionField

Definition at line 90 of file BasicBoundaryConditionsInterface.hpp.

◆ snesLambdaLoadFactorPtr

double* BasicBoundaryConditionsInterface::snesLambdaLoadFactorPtr

Definition at line 71 of file BasicBoundaryConditionsInterface.hpp.

◆ springLhsPtr

boost::shared_ptr<FaceElementForcesAndSourcesCore> BasicBoundaryConditionsInterface::springLhsPtr

Definition at line 100 of file BasicBoundaryConditionsInterface.hpp.

◆ springRhsPtr

boost::shared_ptr<FaceElementForcesAndSourcesCore> BasicBoundaryConditionsInterface::springRhsPtr

Definition at line 99 of file BasicBoundaryConditionsInterface.hpp.


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