Skip to content

Add anisotropic material mechanics#264

Open
streeve wants to merge 26 commits intoORNL:mainfrom
streeve:anisotropic
Open

Add anisotropic material mechanics#264
streeve wants to merge 26 commits intoORNL:mainfrom
streeve:anisotropic

Conversation

@streeve
Copy link
Copy Markdown
Collaborator

@streeve streeve commented Nov 6, 2025

Still missing actual dependence on orientation; most of the models still default to isotropic only (all of LPS, etc.)

@streeve streeve requested a review from pabloseleson November 6, 2025 19:57
@streeve streeve self-assigned this Nov 6, 2025

template <typename PeridynamicsModelType, typename MechanicsModelType = Elastic,
typename DamageType = Fracture,
typename AnisotropyType = Isotropic, typename DamageType = Fracture,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Why we use here "AnisotropyType = Isotropic"?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

The default anisotropy is "no anisotropy"

// matter which particle we check.
f_mag = model( CabanaPD::ForceCoeffTag{}, 0, 0, s0, vol );
f_mag = model( CabanaPD::ForceCoeffTag{}, 0, 0, s0, vol,
0.0, xi, xi_x, xi_y, xi_z );
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Is "0.0" input argument arbitrary?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Should be removed now

using base_type::delta;
using base_type::K;
double c;
double _c;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Could you please remind me what is this change for?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Variable and (new) function can't have the same name

BaseForceModelPMB( PMB model, NoFracture fracture, Cubic,
const double delta, const double _C11,
const double _C12 )
: base_type( model, fracture, delta, 1.0 / 3.0 * ( _C11 + 2.0 * _C12 ) )
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

What is "1.0 / 3.0 * ( _C11 + 2.0 * _C12 )" for?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

We need K to create the base model. The previous assumption was that every model uses K

@streeve streeve mentioned this pull request Dec 30, 2025
13 tasks

// Break if beyond critical stretch unless in no-fail zone.
if ( model( CriticalStretchTag{}, i, j, r, xi ) &&
if ( model( CriticalStretchTag{}, i, j, r, xi, xi_z ) &&
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Note adding xi_z only (instead of all the bond components) is specific for transversely isotropic. Other symmetries would require xi_x and/or xi_y.


// Break if beyond critical stretch unless in no-fail zone.
if ( model( CriticalStretchTag{}, i, j, r, xi ) &&
if ( model( CriticalStretchTag{}, i, j, r, xi, xi_z ) &&
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same comment as above.

, C33( _C33 )
{
A1111 = 75.0 / 4.0 * C11 - 75.0 / 2.0 * C13 + 15.0 / 4.0 * C33;
A1133 = -25.0 / 3.0 * C11 + 115.0 / 2.0 * C13 + 5.0 / 4.0 * C33;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This should be:

A1133 = -25.0 / 3.0 * C11 + 115.0 / 2.0 * C13 - 15.0 / 2.0 * C33;

BaseForceModelPMB( PMB model, Elastic, NoFracture fracture,
TransverselyIsotropic, const double delta,
const double _C11, const double _C13, const double _C33 )
: base_type( model, fracture, delta, 1.0 / 3.0 * ( _C11 + 2.0 * _C13 ) )
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

What is "1.0 / 3.0 * ( _C11 + 2.0 * _C13 )" for?

}

KOKKOS_FUNCTION
auto lambda( const double xi, const double xi1, const double xi2,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

We may need to think about whether to use xi_x, xi_y, xi_z, instead of xi1, xi2, xi3 for consistency with the rest of the code.

const double xi_y, const double xi_z,
const int = -1 ) const
{
return lambda( xi, xi_x, xi_y, xi_z ) * s * vol;
Copy link
Copy Markdown
Collaborator

@pabloseleson pabloseleson Mar 16, 2026

Choose a reason for hiding this comment

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

This function should be "c" instead of \lambda.

Note:

Image

and

Image

So, c = \lambda * xi^3

const double xi_y, const double xi_z,
const int = -1 ) const
{
return lambda( xi, xi_x, xi_y, xi_z ) * s * vol;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same comment as above (c vs. \lambda)

KOKKOS_INLINE_FUNCTION
auto operator()( EnergyTag, const int, const int, const double,
const double, const double, const int = -1 ) const
{
Copy link
Copy Markdown
Collaborator

@pabloseleson pabloseleson Mar 16, 2026

Choose a reason for hiding this comment

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

We need to implement this, also for transversely isotropic.

// 0.25 factor is due to 1/2 from outside the integral and 1/2 from
// the integrand (pairwise potential).
return 0.25 * c * stretch_term * xi * vol;
return 0.25 * c() * stretch_term * xi * vol;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

What is this for? Bind energy has stretch^2

, s_Y( sigma_y )
{
for ( std::size_t d = 0; d < s_Y.size(); d++ )
s_Y[d] /= ( 3.0 * base_type::K );
Copy link
Copy Markdown
Collaborator

@pabloseleson pabloseleson Mar 16, 2026

Choose a reason for hiding this comment

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

This is not anisotropic since it depends on K and not K[d]


// Must extract again if in the plastic regime.
s_p = _s_p( i, n );
return lambda( xi, xi_x, xi_y, xi_z ) * ( s - s_p ) * vol;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same comment c vs. \lambda aboive

auto operator()( EnergyTag, const int, const int, const double,
const double, const double, const int = -1 ) const
{
// TODO: implement energy.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Missing

const double xi, const double xi_z ) const
{
auto bond_break_coeff =
s0[0] + ( s0[1] - s0[0] ) * xi_z * xi_z / ( xi * xi );
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is wrong. For isotropic:

bond_break_coeff = ( 1.0 + s0 ) * ( 1.0 + s0 );

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