![Logo](MoFEMLogo.png) |
| v0.14.0
|
Definition at line 122 of file contact.cpp.
◆ Contact()
◆ bC()
[Create common data]
[Boundary condition]
Definition at line 432 of file contact.cpp.
437 for (
auto f : {
"U",
"SIGMA"}) {
438 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
439 "REMOVE_X",
f, 0, 0);
440 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
441 "REMOVE_Y",
f, 1, 1);
442 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
443 "REMOVE_Z",
f, 2, 2);
444 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
445 "REMOVE_ALL",
f, 0, 3);
448 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"FIX_X",
449 "SIGMA", 0, 0,
false,
true);
450 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"FIX_Y",
451 "SIGMA", 1, 1,
false,
true);
452 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"FIX_Z",
453 "SIGMA", 2, 2,
false,
true);
454 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"FIX_ALL",
455 "SIGMA", 0, 3,
false,
true);
456 CHKERR bc_mng->removeBlockDOFsOnEntities(
457 simple->getProblemName(),
"NO_CONTACT",
"SIGMA", 0, 3,
false,
true);
462 simple->getProblemName(),
"U");
◆ checkResults()
[Solve]
[Check]
Definition at line 836 of file contact.cpp.
845 double tol_norm = 7.5;
849 fem_force = t_ptr[1];
853 fem_force = t_ptr[1];
858 fem_force = t_ptr[2];
862 hertz_force = 15.873;
863 fem_force = t_ptr[1];
868 fem_force = t_ptr[1];
871 hertz_force = 0.5289;
872 fem_force = t_ptr[2];
876 "atom test %d does not exist",
atom_test);
878 if (fabs(fem_force - hertz_force) / hertz_force >
tol) {
880 "atom test %d diverged! %3.4e != %3.4e",
atom_test, fem_force,
883 if (norm > tol_norm) {
885 "atom test %d diverged! %3.4e > %3.4e",
atom_test, norm,
◆ createCommonData()
[Set up problem]
[Create common data]
Definition at line 311 of file contact.cpp.
314 PetscBool use_mfront = PETSC_FALSE;
340 MOFEM_LOG(
"CONTACT", Sev::inform) <<
"Using MFront for material model";
351 PetscBool use_scale = PETSC_FALSE;
366 char sdf_file_name[255];
368 sdf_file_name, 255, PETSC_NULL);
370 sdfPythonPtr = boost::make_shared<SDFPython>();
371 CHKERR sdfPythonPtr->sdfInit(sdf_file_name);
372 sdfPythonWeakPtr = sdfPythonPtr;
378 "Use executable contact_2d with axisymmetric model");
382 "Axisymmetric model is only available with MFront (set "
385 MOFEM_LOG(
"CONTACT", Sev::inform) <<
"Using axisymmetric model";
390 MOFEM_LOG(
"CONTACT", Sev::inform) <<
"Using plane strain model";
395 #ifndef WITH_MODULE_MFRONT_INTERFACE
398 "MFrontInterface module was not found while use_mfront was set to 1");
402 boost::make_shared<MFrontMoFEMInterface<TRIDIMENSIONAL>>(
407 boost::make_shared<MFrontMoFEMInterface<AXISYMMETRICAL>>(
410 mfrontInterface = boost::make_shared<MFrontMoFEMInterface<PLANESTRAIN>>(
419 auto dm =
simple->getDM();
◆ OPs()
[Boundary condition]
[Push operators to pip]
[Only used for dynamics]
[Only used for dynamics]
[Only used for dynamics]
[Only used for dynamics]
[Operators used for contact]
[Operators used for contact]
[Operators used for contact]
[Operators used for contact]
Definition at line 469 of file contact.cpp.
474 auto time_scale = boost::make_shared<ScaledTimeScale>();
475 auto body_force_time_scale =
476 boost::make_shared<ScaledTimeScale>(
"body_force_hist.txt");
485 auto add_domain_base_ops = [&](
auto &pip) {
492 auto henky_common_data_ptr = boost::make_shared<HenckyOps::CommonData>();
493 henky_common_data_ptr->matDPtr = boost::make_shared<MatrixDouble>();
494 henky_common_data_ptr->matGradPtr = boost::make_shared<MatrixDouble>();
496 auto add_domain_ops_lhs = [&](
auto &pip) {
506 auto fe_domain_lhs = pip_mng->getDomainLhsFE();
508 auto get_inertia_and_mass_damping =
510 return (
rho *
scale) * fe_domain_lhs->ts_aa +
513 pip.push_back(
new OpMass(
"U",
"U", get_inertia_and_mass_damping));
517 auto fe_domain_lhs = pip_mng->getDomainLhsFE();
519 auto get_inertia_and_mass_damping =
523 pip.push_back(
new OpMass(
"U",
"U", get_inertia_and_mass_damping));
527 CHKERR HenckyOps::opFactoryDomainLhs<SPACE_DIM, AT, IT, DomainEleOp>(
528 mField, pip,
"U",
"MAT_ELASTIC", Sev::verbose,
scale);
536 auto add_domain_ops_rhs = [&](
auto &pip) {
540 pip,
mField,
"U", {body_force_time_scale}, Sev::inform);
544 AT>::LinearForm<IT>::OpBaseTimesVector<1,
SPACE_DIM, 1>;
549 auto mat_acceleration = boost::make_shared<MatrixDouble>();
551 "U", mat_acceleration));
553 new OpInertiaForce(
"U", mat_acceleration, [](
double,
double,
double) {
560 auto mat_velocity = boost::make_shared<MatrixDouble>();
564 new OpInertiaForce(
"U", mat_velocity, [](
double,
double,
double) {
570 CHKERR HenckyOps::opFactoryDomainRhs<SPACE_DIM, AT, IT, DomainEleOp>(
571 mField, pip,
"U",
"MAT_ELASTIC", Sev::inform,
scale);
576 CHKERR ContactOps::opFactoryDomainRhs<SPACE_DIM, AT, IT, DomainEleOp>(
582 auto add_boundary_base_ops = [&](
auto &pip) {
592 auto add_boundary_ops_lhs = [&](
auto &pip) {
602 pip,
mField,
"U", Sev::inform);
607 auto fe_boundary_lhs = pip_mng->getBoundaryLhsFE();
612 [
this, fe_boundary_lhs](
double,
double,
double) {
621 ContactOps::opFactoryBoundaryLhs<SPACE_DIM, AT, GAUSS, BoundaryEleOp>(
625 mField, pip,
simple->getDomainFEName(),
"SIGMA",
"U",
"GEOMETRY",
631 auto add_boundary_ops_rhs = [&](
auto &pip) {
636 AT>::LinearForm<IT>::OpBaseTimesVector<1,
SPACE_DIM, 1>;
641 pip,
mField,
"U", {time_scale}, Sev::inform);
644 auto u_disp = boost::make_shared<MatrixDouble>();
645 auto dot_u_disp = boost::make_shared<MatrixDouble>();
650 new OpSpringRhs(
"U", u_disp, [
this](
double,
double,
double) {
654 new OpSpringRhs(
"U", dot_u_disp, [
this](
double,
double,
double) {
660 ContactOps::opFactoryBoundaryRhs<SPACE_DIM, AT, GAUSS, BoundaryEleOp>(
666 CHKERR add_domain_base_ops(pip_mng->getOpDomainLhsPipeline());
667 CHKERR add_domain_base_ops(pip_mng->getOpDomainRhsPipeline());
668 CHKERR add_domain_ops_lhs(pip_mng->getOpDomainLhsPipeline());
669 CHKERR add_domain_ops_rhs(pip_mng->getOpDomainRhsPipeline());
671 CHKERR add_boundary_base_ops(pip_mng->getOpBoundaryLhsPipeline());
672 CHKERR add_boundary_base_ops(pip_mng->getOpBoundaryRhsPipeline());
673 CHKERR add_boundary_ops_lhs(pip_mng->getOpBoundaryLhsPipeline());
674 CHKERR add_boundary_ops_rhs(pip_mng->getOpBoundaryRhsPipeline());
680 CHKERR pip_mng->setDomainRhsIntegrationRule(integration_rule_vol);
681 CHKERR pip_mng->setDomainLhsIntegrationRule(integration_rule_vol);
682 CHKERR pip_mng->setBoundaryRhsIntegrationRule(integration_rule_boundary);
683 CHKERR pip_mng->setBoundaryLhsIntegrationRule(integration_rule_boundary);
◆ runProblem()
◆ setupProblem()
[Run problem]
[Set up problem]
< blocs interation is collective, so that is set irrespective if there are entities in given rank or not in the block
Definition at line 171 of file contact.cpp.
187 enum bases { AINSWORTH, DEMKOWICZ, LASBASETOPT };
188 const char *list_bases[LASBASETOPT] = {
"ainsworth",
"demkowicz"};
189 PetscInt choice_base_value = AINSWORTH;
191 LASBASETOPT, &choice_base_value, PETSC_NULL);
194 switch (choice_base_value) {
198 <<
"Set AINSWORTH_LEGENDRE_BASE for displacements";
203 <<
"Set DEMKOWICZ_JACOBI_BASE for displacements";
223 auto get_skin = [&]() {
228 CHKERR skin.find_skin(0, body_ents,
false, skin_ents);
232 auto filter_blocks = [&](
auto skin) {
233 bool is_contact_block =
false;
238 (boost::format(
"%s(.*)") %
"CONTACT").str()
247 <<
"Find contact block set: " <<
m->getName();
248 auto meshset =
m->getMeshset();
249 Range contact_meshset_range;
251 meshset,
SPACE_DIM - 1, contact_meshset_range,
true);
254 contact_meshset_range);
255 contact_range.merge(contact_meshset_range);
257 if (is_contact_block) {
259 <<
"Nb entities in contact surface: " << contact_range.size();
261 skin = intersect(skin, contact_range);
266 auto filter_true_skin = [&](
auto skin) {
268 ParallelComm *pcomm =
270 CHKERR pcomm->filter_pstatus(skin, PSTATUS_SHARED | PSTATUS_MULTISHARED,
271 PSTATUS_NOT, -1, &boundary_ents);
272 return boundary_ents;
275 auto boundary_ents = filter_true_skin(filter_blocks(get_skin()));
278 CHKERR simple->setFieldOrder(
"SIGMA", sigma_order, &boundary_ents);
284 moab::Interface::UNION);
286 ho_ents = boundary_ents;
295 auto project_ho_geometry = [&]() {
300 PetscBool project_geometry = PETSC_TRUE;
302 &project_geometry, PETSC_NULL);
303 if (project_geometry) {
304 CHKERR project_ho_geometry();
◆ tsSolve()
Definition at line 699 of file contact.cpp.
706 auto set_section_monitor = [&](
auto solver) {
709 CHKERR TSGetSNES(solver, &snes);
710 PetscViewerAndFormat *vf;
711 CHKERR PetscViewerAndFormatCreate(PETSC_VIEWER_STDOUT_WORLD,
712 PETSC_VIEWER_DEFAULT, &vf);
715 (
MoFEMErrorCode(*)(SNES, PetscInt, PetscReal,
void *))SNESMonitorFields,
720 auto scatter_create = [&](
auto D,
auto coeff) {
722 CHKERR is_manager->isCreateProblemFieldAndRank(
simple->getProblemName(),
723 ROW,
"U", coeff, coeff, is);
725 CHKERR ISGetLocalSize(is, &loc_size);
729 CHKERR VecScatterCreate(
D, is,
v, PETSC_NULL, &scatter);
734 auto set_time_monitor = [&](
auto dm,
auto solver) {
737 boost::shared_ptr<ForcesAndSourcesCore>
null;
743 auto set_essential_bc = [&]() {
747 auto pre_proc_ptr = boost::make_shared<FEMethod>();
748 auto post_proc_rhs_ptr = boost::make_shared<FEMethod>();
749 auto post_proc_lhs_ptr = boost::make_shared<FEMethod>();
752 auto time_scale = boost::make_shared<TimeScale>();
754 auto get_bc_hook_rhs = [&]() {
756 {time_scale},
false);
759 pre_proc_ptr->preProcessHook = get_bc_hook_rhs();
761 auto get_post_proc_hook_rhs = [&]() {
763 mField, post_proc_rhs_ptr, 1.);
765 auto get_post_proc_hook_lhs = [&]() {
767 mField, post_proc_lhs_ptr, 1.);
769 post_proc_rhs_ptr->postProcessHook = get_post_proc_hook_rhs();
771 ts_ctx_ptr->getPreProcessIFunction().push_front(pre_proc_ptr);
772 ts_ctx_ptr->getPreProcessIJacobian().push_front(pre_proc_ptr);
773 ts_ctx_ptr->getPostProcessIFunction().push_back(post_proc_rhs_ptr);
774 post_proc_lhs_ptr->postProcessHook = get_post_proc_hook_lhs();
775 ts_ctx_ptr->getPostProcessIJacobian().push_back(post_proc_lhs_ptr);
780 auto set_schur_pc = [&](
auto solver) {
781 boost::shared_ptr<SetUpSchur> schur_ptr;
790 auto dm =
simple->getDM();
802 CHKERR set_essential_bc();
805 auto solver = pip_mng->createTSIM();
806 CHKERR TSSetFromOptions(solver);
807 auto schur_pc_ptr = set_schur_pc(solver);
810 CHKERR set_section_monitor(solver);
811 CHKERR set_time_monitor(dm, solver);
812 CHKERR TSSetSolution(solver,
D);
814 CHKERR TSSolve(solver, NULL);
816 auto solver = pip_mng->createTSIM2();
817 CHKERR TSSetFromOptions(solver);
818 auto schur_pc_ptr = set_schur_pc(solver);
820 auto dm =
simple->getDM();
824 CHKERR set_section_monitor(solver);
825 CHKERR set_time_monitor(dm, solver);
826 CHKERR TS2SetSolution(solver,
D, DD);
828 CHKERR TSSolve(solver, NULL);
◆ mField
◆ mfrontInterface
◆ monitorPtr
boost::shared_ptr<Monitor> Contact::monitorPtr |
|
private |
◆ uXScatter
◆ uYScatter
◆ uZScatter
The documentation for this struct was generated from the following file:
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
#define MYPCOMM_INDEX
default communicator number PCOMM
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.
Specialization for DisplacementCubitBcData.
virtual MPI_Comm & get_comm() const =0
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
Get values at integration pts for tensor filed rank 1, i.e. vector field.
virtual int get_comm_rank() const =0
Specialization for DisplacementCubitBcData.
PipelineManager interface.
Definition of the displacement bc data structure.
Projection of edge entities with one mid-node on hierarchical basis.
Simple interface for fast problem set-up.
Approximate field values for given petsc vector.
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesVector< 1, SPACE_DIM, 1 > OpInertiaForce
#define CHKERR
Inline error check.
auto createDMVector(DM dm)
Get smart vector from DM.
Specialization for DisplacementCubitBcData.
virtual moab::Interface & get_moab()=0
Section manager is used to create indexes and sections.
Simple interface for fast problem set-up.
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM > OpMass
[Only used with Hooke equation (linear material model)]
void simple(double P1[], double P2[], double P3[], double c[], const int N)
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
Add operators pushing bases from local to physical configuration.
const double v
phase velocity of light in medium (cm/ns)
#define MOFEM_LOG(channel, severity)
Log.
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
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.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
const FTensor::Tensor2< T, Dim, Dim > Vec
@ MOFEM_DATA_INCONSISTENCY
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
Interface for managing meshsets containing materials and boundary conditions.
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, PetscBool *set)
FieldApproximationBase
approximation base
const double D
diffusivity
FTensor::Index< 'm', 3 > m
@ MOFEM_ATOM_TEST_INVALID
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
MoFEMErrorCode getCubitMeshsetPtr(const int ms_id, const CubitBCType cubit_bc_type, const CubitMeshSets **cubit_meshset_ptr) const
get cubit meshset
static boost::shared_ptr< SetUpSchur > createSetUpSchur(MoFEM::Interface &m_field)
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ HDIV
field with continuous normal traction
auto getDMTsCtx(DM dm)
Get TS context data structure used by DM.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)