368 {
373 auto time_scale = boost::make_shared<TimeScale>();
374
375 auto add_domain_base_ops = [&](auto &pip) {
377);
378 };
379
380 auto common_data_ptr = boost::make_shared<ContactOps::CommonData>();
381 auto henky_common_data_ptr = boost::make_shared<HenckyOps::CommonData>();
382 henky_common_data_ptr->matGradPtr = common_data_ptr->mGradPtr();
383 henky_common_data_ptr->matDPtr = common_data_ptr->mDPtr();
384
385 auto add_domain_ops_lhs = [&](auto &pip) {
387
389 common_data_ptr->mDPtr(), Sev::verbose);
390
392 "U", common_data_ptr->mGradPtr()));
393 pip.push_back(
396 pip.push_back(
398 pip.push_back(
400 pip.push_back(
403 pip.push_back(
404 new OpKPiola(
"U",
"U", henky_common_data_ptr->getMatTangent()));
405
407 auto get_inertia_and_mass_dumping = [
this](
const double,
const double,
410 auto &fe_domain_lhs = pip_mng->getDomainLhsFE();
412 };
413 pip.push_back(
new OpMass(
"U",
"U", get_inertia_and_mass_dumping));
415 auto get_mass_dumping = [
this](
const double,
const double,
418 auto &fe_domain_lhs = pip_mng->getDomainLhsFE();
420 };
421 pip.push_back(
new OpMass(
"U",
"U", get_mass_dumping));
422 }
423
424 auto unity = []() { return 1; };
425 pip.push_back(
new OpMixDivULhs(
"SIGMA",
"U", unity,
true));
427
429 };
430
431 auto add_domain_ops_rhs = [&](auto &pip) {
433
435 pip,
mField,
"U", {time_scale}, Sev::inform);
436
438 common_data_ptr->mDPtr(), Sev::inform);
440 "U", common_data_ptr->mGradPtr()));
441
442 pip.push_back(
445 pip.push_back(
447 pip.push_back(
449 pip.push_back(
452 "U", henky_common_data_ptr->getMatFirstPiolaStress()));
453
455 "U", common_data_ptr->contactDispPtr()));
456
458 "SIGMA", common_data_ptr->contactStressPtr()));
460 "SIGMA", common_data_ptr->contactStressDivergencePtr()));
461
462 pip.push_back(
new OpMixDivURhs(
"SIGMA", common_data_ptr->contactDispPtr(),
463 [](double, double, double) { return 1; }));
464 pip.push_back(
466
468 "U", common_data_ptr->contactStressDivergencePtr()));
469 pip.push_back(
471
472
474 auto mat_acceleration = boost::make_shared<MatrixDouble>();
476 "U", mat_acceleration));
478 "U", mat_acceleration, [](
double,
double,
double) {
return rho; }));
479 }
481 auto mat_velocity = boost::make_shared<MatrixDouble>();
482 pip.push_back(
484 pip.push_back(
485 new OpInertiaForce(
"U", mat_velocity, [](
double,
double,
double) {
487 }));
488 }
490 };
491
492 auto add_boundary_base_ops = [&](auto &pip) {
494);
496 "U", common_data_ptr->contactDispPtr()));
498 "SIGMA", common_data_ptr->contactTractionPtr()));
499 };
500
501 auto add_boundary_ops_lhs = [&](auto &pip) {
508 pip,
mField,
"U", Sev::inform);
511 common_data_ptr));
512
515 "U", "U",
516
518
519 ));
520
523 };
524
525 auto add_boundary_ops_rhs = [&](auto &pip) {
527
528 auto u_mat_ptr = boost::make_shared<MatrixDouble>();
533 {boost::make_shared<TimeScale>()});
534
535
538 pip,
mField,
"U", {time_scale}, Sev::inform);
542 "U", common_data_ptr->contactDispPtr(),
543 [this](double, double, double) { return spring_stiffness; }));
546 };
547
548 add_domain_base_ops(pip_mng->getOpDomainLhsPipeline());
549 add_domain_base_ops(pip_mng->getOpDomainRhsPipeline());
550 add_domain_ops_lhs(pip_mng->getOpDomainLhsPipeline());
551 add_domain_ops_rhs(pip_mng->getOpDomainRhsPipeline());
552
553 add_boundary_base_ops(pip_mng->getOpBoundaryLhsPipeline());
554 add_boundary_base_ops(pip_mng->getOpBoundaryRhsPipeline());
555 CHKERR add_boundary_ops_lhs(pip_mng->getOpBoundaryLhsPipeline());
556 CHKERR add_boundary_ops_rhs(pip_mng->getOpBoundaryRhsPipeline());
557
560 };
561 CHKERR pip_mng->setDomainRhsIntegrationRule(integration_rule_vol);
562 CHKERR pip_mng->setDomainLhsIntegrationRule(integration_rule_vol);
565 };
566 CHKERR pip_mng->setBoundaryRhsIntegrationRule(integration_rule_boundary);
567 CHKERR pip_mng->setBoundaryLhsIntegrationRule(integration_rule_boundary);
568
570}
@ HDIV
field with continuous normal traction
static constexpr int approx_order
Add operators pushing bases from local to physical configuration.
Essential boundary conditions.
Calculate divergence of tonsorial field using vectorial base.
Calculate tenor field using vectorial base, i.e. Hdiv/Hcurl.
Calculate trace of vector (Hdiv/Hcurl) space.
Get field gradients at integration pts for scalar filed rank 0, i.e. vector field.
Approximate field values for given petsc vector.
Get values at integration pts for tensor filed rank 1, i.e. vector field.
Set indices on entities on finite element.
PipelineManager interface.