NimbleSM
NimbleSM is a solid mechanics simulation code for dynamic systems
Loading...
Searching...
No Matches
nimble::NeohookeanMaterial Class Reference

#include <nimble_material.h>

Inheritance diagram for nimble::NeohookeanMaterial:
nimble::Material

Public Member Functions

NIMBLE_FUNCTION NeohookeanMaterial (const NeohookeanMaterial &mat)=default
 
NIMBLE_FUNCTION NeohookeanMaterial (MaterialParameters const &material_parameters)
 
NIMBLE_FUNCTION int NumStateVariables () const override
 
NIMBLE_FUNCTION void GetStateVariableLabel (int index, char label[MaterialParameters::MAX_MAT_MODEL_STR_LEN]) const override
 
NIMBLE_FUNCTION double GetStateVariableInitialValue (int index) const override
 
NIMBLE_FUNCTION double GetDensity () const override
 
NIMBLE_FUNCTION double GetBulkModulus () const override
 
NIMBLE_FUNCTION double GetShearModulus () const override
 
NIMBLE_FUNCTION void GetStress (int elem_id, int num_pts, double time_previous, double time_current, const double *deformation_gradient_n, const double *deformation_gradient_np1, const double *stress_n, double *stress_np1, const double *state_data_n, double *state_data_np1, DataManager &data_manager, bool is_output_step) override
 
NIMBLE_FUNCTION void GetTangent (int num_pts, double *material_tangent) const override
 
- Public Member Functions inherited from nimble::Material
NIMBLE_FUNCTION Material ()=default
 
NIMBLE_FUNCTION Material (const Material &mat)=default
 
virtual NIMBLE_FUNCTION ~Material ()=default
 
virtual NIMBLE_FUNCTION bool IsNGPLAMEModel () const
 

Static Public Member Functions

static void register_supported_material_parameters (MaterialFactoryBase &factory)
 

Protected Member Functions

NIMBLE_FUNCTION void GetStress (double time_previous, double time_current, nimble::Viewify< 1, const double > &deformation_gradient_n, nimble::Viewify< 1, const double > &deformation_gradient_np1, nimble::Viewify< 1, const double > &stress_n, nimble::Viewify< 1 > stress_np1) const override
 

Constructor & Destructor Documentation

◆ NeohookeanMaterial() [1/2]

NIMBLE_FUNCTION nimble::NeohookeanMaterial::NeohookeanMaterial ( const NeohookeanMaterial & mat)
default

◆ NeohookeanMaterial() [2/2]

nimble::NeohookeanMaterial::NeohookeanMaterial ( MaterialParameters const & material_parameters)
explicit
217 : Material(),
218 num_state_variables_(0),
219 dim_(3),
220 density_(material_parameters.GetParameterValue("density")),
221 bulk_modulus_(material_parameters.GetParameterValue("bulk_modulus")),
222 shear_modulus_(material_parameters.GetParameterValue("shear_modulus"))
223{
224}
NIMBLE_FUNCTION Material()=default

Member Function Documentation

◆ GetBulkModulus()

NIMBLE_FUNCTION double nimble::NeohookeanMaterial::GetBulkModulus ( ) const
inlineoverridevirtual

Implements nimble::Material.

473 {
474 return bulk_modulus_;
475 }

◆ GetDensity()

NIMBLE_FUNCTION double nimble::NeohookeanMaterial::GetDensity ( ) const
inlineoverridevirtual

Implements nimble::Material.

466 {
467 return density_;
468 }

◆ GetShearModulus()

NIMBLE_FUNCTION double nimble::NeohookeanMaterial::GetShearModulus ( ) const
inlineoverridevirtual

Implements nimble::Material.

480 {
481 return shear_modulus_;
482 }

◆ GetStateVariableInitialValue()

NIMBLE_FUNCTION double nimble::NeohookeanMaterial::GetStateVariableInitialValue ( int index) const
inlineoverridevirtual

Implements nimble::Material.

456 {
457 printf(
458 "\n**** Error, bad index in "
459 "NeohookeanMaterial::GetStateVariableInitialValue().\n");
460 return 0.0;
461 }

◆ GetStateVariableLabel()

NIMBLE_FUNCTION void nimble::NeohookeanMaterial::GetStateVariableLabel ( int index,
char label[MaterialParameters::MAX_MAT_MODEL_STR_LEN] ) const
inlineoverridevirtual

Implements nimble::Material.

447 {
448 printf(
449 "\n**** Error, bad index in "
450 "NeohookeanMaterial::GetStateVariableLabel().\n");
451 }

◆ GetStress() [1/2]

void nimble::NeohookeanMaterial::GetStress ( double time_previous,
double time_current,
nimble::Viewify< 1, const double > & deformation_gradient_n,
nimble::Viewify< 1, const double > & deformation_gradient_np1,
nimble::Viewify< 1, const double > & stress_n,
nimble::Viewify< 1 > stress_np1 ) const
overrideprotectedvirtual

Implements nimble::Material.

260{
261 double xj, fac, pressure, bxx, byy, bzz, bxy, byz, bzx, trace;
262
263 // left stretch and rotation
264 double v[6], r[9];
265 Polar_Decomp(deformation_gradient_np1.data(), v, r);
266
267 CheckVectorSanity(9, deformation_gradient_np1.data(), "neohookean deformation_gradient_np1");
268 CheckVectorSanity(6, v, "neohookean v");
269 CheckVectorSanity(9, r, "neohookean r");
270
271 xj = v[K_S_XX] * v[K_S_YY] * v[K_S_ZZ] + 2.0 * v[K_S_XY] * v[K_S_YZ] * v[K_S_ZX] - v[K_S_XX] * v[K_S_YZ] * v[K_S_YZ] -
272 v[K_S_YY] * v[K_S_ZX] * v[K_S_ZX] - v[K_S_ZZ] * v[K_S_XY] * v[K_S_XY];
273
274 double cbrt_xj = std::cbrt(xj);
275 fac = 1.0 / (cbrt_xj * cbrt_xj);
276
277 pressure = 0.5 * bulk_modulus_ * (xj - 1.0 / xj);
278
279 bxx = v[K_S_XX] * v[K_S_XX] + v[K_S_XY] * v[K_S_YX] + v[K_S_XZ] * v[K_S_ZX];
280
281 byy = v[K_S_YX] * v[K_S_XY] + v[K_S_YY] * v[K_S_YY] + v[K_S_YZ] * v[K_S_ZY];
282
283 bzz = v[K_S_ZX] * v[K_S_XZ] + v[K_S_ZY] * v[K_S_YZ] + v[K_S_ZZ] * v[K_S_ZZ];
284
285 bxy = v[K_S_XX] * v[K_S_XY] + v[K_S_XY] * v[K_S_YY] + v[K_S_XZ] * v[K_S_ZY];
286
287 byz = v[K_S_YX] * v[K_S_XZ] + v[K_S_YY] * v[K_S_YZ] + v[K_S_YZ] * v[K_S_ZZ];
288
289 bzx = v[K_S_ZX] * v[K_S_XX] + v[K_S_ZY] * v[K_S_YX] + v[K_S_ZZ] * v[K_S_ZX];
290
291 bxx = fac * bxx;
292 byy = fac * byy;
293 bzz = fac * bzz;
294 bxy = fac * bxy;
295 byz = fac * byz;
296 bzx = fac * bzx;
297
298 trace = bxx + byy + bzz;
299
300 bxx = bxx - trace / 3.0;
301 byy = byy - trace / 3.0;
302 bzz = bzz - trace / 3.0;
303
304 stress_np1(K_S_XX) = pressure + shear_modulus_ * bxx / xj;
305 stress_np1(K_S_YY) = pressure + shear_modulus_ * byy / xj;
306 stress_np1(K_S_ZZ) = pressure + shear_modulus_ * bzz / xj;
307 stress_np1(K_S_XY) = shear_modulus_ * bxy / xj;
308 stress_np1(K_S_YZ) = shear_modulus_ * byz / xj;
309 stress_np1(K_S_ZX) = shear_modulus_ * bzx / xj;
310}
Scalar * data() const
Definition nimble_view.h:130
NIMBLE_INLINE_FUNCTION void CheckVectorSanity(int vec_length, ScalarT const *const vec, const char *label)
Definition nimble_utils.h:114
NIMBLE_INLINE_FUNCTION void Polar_Decomp(const ScalarT *const mat, ScalarT *const left_stretch, ScalarT *const rotation)
Definition nimble_utils.h:861

◆ GetStress() [2/2]

void nimble::NeohookeanMaterial::GetStress ( int elem_id,
int num_pts,
double time_previous,
double time_current,
const double * deformation_gradient_n,
const double * deformation_gradient_np1,
const double * stress_n,
double * stress_np1,
const double * state_data_n,
double * state_data_np1,
DataManager & data_manager,
bool is_output_step )
overridevirtual

Implements nimble::Material.

240{
241 // Cauchy stress
242 double* sig = stress_np1;
243
244 nimble::Viewify<1, const double> null_view;
245 for (int pt = 0; pt < num_pts; pt++) {
246 nimble::Viewify<1, const double> def_grad(&deformation_gradient_np1[9 * pt], 9);
247 GetStress(time_previous, time_current, null_view, def_grad, null_view, {sig, 6});
248 sig += 6;
249 }
250}
NIMBLE_FUNCTION void GetStress(int elem_id, int num_pts, double time_previous, double time_current, const double *deformation_gradient_n, const double *deformation_gradient_np1, const double *stress_n, double *stress_np1, const double *state_data_n, double *state_data_np1, DataManager &data_manager, bool is_output_step) override
Definition nimble_material.cc:227

◆ GetTangent()

void nimble::NeohookeanMaterial::GetTangent ( int num_pts,
double * material_tangent ) const
overridevirtual

Implements nimble::Material.

346{
347 double lambda = bulk_modulus_ - 2.0 * shear_modulus_ / 3.0;
348 double mu = shear_modulus_;
349 double two_mu = 2.0 * shear_modulus_;
350
351 for (int int_pt = 0; int_pt < num_pts; int_pt++) {
352 int offset = int_pt * 36;
353 material_tangent[offset] = lambda + two_mu;
354 material_tangent[offset + 1] = lambda;
355 material_tangent[offset + 2] = lambda;
356 material_tangent[offset + 3] = 0.0;
357 material_tangent[offset + 4] = 0.0;
358 material_tangent[offset + 5] = 0.0;
359 material_tangent[offset + 6] = lambda;
360 material_tangent[offset + 7] = lambda + two_mu;
361 material_tangent[offset + 8] = lambda;
362 material_tangent[offset + 9] = 0.0;
363 material_tangent[offset + 10] = 0.0;
364 material_tangent[offset + 11] = 0.0;
365 material_tangent[offset + 12] = lambda;
366 material_tangent[offset + 13] = lambda;
367 material_tangent[offset + 14] = lambda + two_mu;
368 material_tangent[offset + 15] = 0.0;
369 material_tangent[offset + 16] = 0.0;
370 material_tangent[offset + 17] = 0.0;
371 material_tangent[offset + 18] = 0.0;
372 material_tangent[offset + 19] = 0.0;
373 material_tangent[offset + 20] = 0.0;
374 material_tangent[offset + 21] = mu;
375 material_tangent[offset + 22] = 0.0;
376 material_tangent[offset + 23] = 0.0;
377 material_tangent[offset + 24] = 0.0;
378 material_tangent[offset + 25] = 0.0;
379 material_tangent[offset + 26] = 0.0;
380 material_tangent[offset + 27] = 0.0;
381 material_tangent[offset + 28] = mu;
382 material_tangent[offset + 29] = 0.0;
383 material_tangent[offset + 30] = 0.0;
384 material_tangent[offset + 31] = 0.0;
385 material_tangent[offset + 32] = 0.0;
386 material_tangent[offset + 33] = 0.0;
387 material_tangent[offset + 34] = 0.0;
388 material_tangent[offset + 35] = mu;
389 }
390}

◆ NumStateVariables()

NIMBLE_FUNCTION int nimble::NeohookeanMaterial::NumStateVariables ( ) const
inlineoverridevirtual

Implements nimble::Material.

440 {
441 return num_state_variables_;
442 };

◆ register_supported_material_parameters()

void nimble::NeohookeanMaterial::register_supported_material_parameters ( MaterialFactoryBase & factory)
static
210{
211 factory.add_valid_double_parameter_name("bulk_modulus");
212 factory.add_valid_double_parameter_name("shear_modulus");
213 factory.add_valid_double_parameter_name("density");
214}

The documentation for this class was generated from the following files: