Skip to content

Modify dual shape function construction to work for curved beams - #2124

Draft
dharinib98 wants to merge 1 commit into
4C-multiphysics:mainfrom
dharinib98:curved_beam_dual_LM
Draft

Modify dual shape function construction to work for curved beams#2124
dharinib98 wants to merge 1 commit into
4C-multiphysics:mainfrom
dharinib98:curved_beam_dual_LM

Conversation

@dharinib98

Copy link
Copy Markdown
Contributor

Description and Context

In this PR, the currently implemented dual LM construction have been modified according to the equations (3.64 - 3.65) from Popp, A.: Mortar methods for computational contact mechanics and general interface
problems. Dissertation, Technische Universität München (2012)

Related Issues and Pull Requests

#2009

@dharinib98 dharinib98 self-assigned this Jul 12, 2026
Comment on lines +301 to +308
Core::LinAlg::Matrix<1, Beam::n_nodes_ * Beam::n_val_, double> N_mortar_primal(
Core::LinAlg::Initialization::zero);
Core::LinAlg::Matrix<Mortar::n_dof_, Mortar::n_dof_, double> local_D_mortar(
Core::LinAlg::Initialization::zero);
Core::LinAlg::Matrix<Mortar::n_dof_, Mortar::n_dof_, double> local_M_mortar(
Core::LinAlg::Initialization::zero);
Core::LinAlg::Matrix<Mortar::n_dof_, Mortar::n_dof_, double> local_A(
Core::LinAlg::Initialization::zero);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not a big fan of adding these matrices here for all cases, even tough they war only needed for one special case.

N_beam, projected_gauss_point.get_eta(), this->ele1pos_.shape_function_data_);
N_beam, eta, this->ele1pos_.shape_function_data_);

if constexpr (std::is_same_v<Mortar, BeamInteraction::HermiteDual>)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With this proposed change, do we even need the explicit implementation of the dual shape functions any more?

for (unsigned int i_row = 0; i_row < LambdaType::n_dof_; i_row++)
for (unsigned int i_col = 0; i_col < BeamType::n_dof_; i_col++)
EXPECT_NEAR(local_D(i_row, i_col), result_local_D(i_row, i_col), 1e-11);
EXPECT_NEAR(local_D(i_row, i_col), result_local_D(i_row, i_col), 1e-11;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this a syntax error?

result_local_D(11, 2) = 0.000000000003244959856374408;
result_local_D(11, 5) = -0.0000000000001378064329315976;
result_local_D(11, 8) = -0.00000000001687716633114178;
result_local_D(11, 11) = 0.2121320343565152;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need to adapt the test results?


// compute local_A matrix
const unsigned int n_segments = this->line_to_3D_segments_.size();
if constexpr (std::is_same_v<Mortar, BeamInteraction::HermiteDual>)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have to talk about this general procedure. This proposed solution should work fine, but I think will fail if the beam spans over multiple solid elements. We have to at least investigate what happens in this case.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants