NimbleSM
NimbleSM is a solid mechanics simulation code for dynamic systems
Loading...
Searching...
No Matches
nimble_material.h
Go to the documentation of this file.
1/*
2//@HEADER
3// ************************************************************************
4//
5// NimbleSM
6// Copyright 2018
7// National Technology & Engineering Solutions of Sandia, LLC (NTESS)
8//
9// Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government
10// retains certain rights in this software.
11//
12// Redistribution and use in source and binary forms, with or without
13// modification, are permitted provided that the following conditions are
14// met:
15//
16// 1. Redistributions of source code must retain the above copyright
17// notice, this list of conditions and the following disclaimer.
18//
19// 2. Redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution.
22//
23// 3. Neither the name of the Corporation nor the names of the
24// contributors may be used to endorse or promote products derived from
25// this software without specific prior written permission.
26//
27// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY EXPRESS OR IMPLIED
28// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
29// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
30// NO EVENT SHALL NTESS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
32// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact David Littlewood (djlittl@sandia.gov)
39//
40// ************************************************************************
41//@HEADER
42*/
43
44#ifndef NIMBLE_MATERIAL_H
45#define NIMBLE_MATERIAL_H
46
47#include <algorithm>
48#include <string>
49
50#include "nimble_data_utils.h"
51#include "nimble_defs.h"
52#include "nimble_utils.h"
53#include "nimble_view.h"
54
55namespace nimble {
56
57class DataManager;
59class MaterialFactory;
60
62{
63 public:
64 static const int MAX_NUM_MAT_PARAM = 64;
65 static const int MAX_MAT_MODEL_STR_LEN = 64;
66
67 inline MaterialParameters() : num_material_points_(0) {}
68
71 const std::string& material_name,
72 const std::map<std::string, std::string>& string_params,
73 const std::map<std::string, double>& double_params,
74 int num_material_points = 0)
75 : material_name_(material_name),
76 material_string_parameters_(string_params),
77 material_double_parameters_(double_params),
78 num_material_points_(num_material_points)
79 {
80 }
81
82 static inline void
84 {
85 std::transform(s.begin(), s.end(), s.begin(), ::toupper);
86 }
87
88 inline ~MaterialParameters() = default;
89
90 inline void
91 AddParameter(const char* parameter_name, double parameter_value)
92 {
93 material_double_parameters_.insert(std::make_pair(std::string(parameter_name), parameter_value));
94 }
95
96 inline void
97 AddStringParameter(const char* parameter_name, const char* parameter_value)
98 {
99 material_string_parameters_.insert(std::make_pair(std::string(parameter_name), std::string(parameter_value)));
100 }
101
102 inline bool
103 IsParameter(const char* parameter_name) const
104 {
105 return material_double_parameters_.find(parameter_name) != material_double_parameters_.end();
106 }
107
108 inline bool
109 IsStringParameter(const char* parameter_name) const
110 {
111 return material_string_parameters_.find(parameter_name) != material_string_parameters_.end();
112 }
113
114 inline std::string
115 GetMaterialName(bool upper_case = false) const
116 {
117 std::string name = material_name_;
118 if (upper_case) { ConvertStringToUpperCase(name); }
119 return name;
120 }
121
122 inline int
124 {
125 return static_cast<int>(material_double_parameters_.size());
126 }
127
128 inline int
130 {
131 return static_cast<int>(material_string_parameters_.size());
132 }
133
134 inline double
135 GetParameterValue(const char* parameter_name) const
136 {
137 try {
138 return material_double_parameters_.at(parameter_name);
139 } catch (...) {
140 std::string errMsg = "Double parameter '" + std::string(parameter_name) + "' does not exist";
141 throw std::invalid_argument(errMsg);
142 }
143 }
144
145 inline const std::string&
146 GetStringParameterValue(const char* parameter_name) const
147 {
148 try {
149 return material_string_parameters_.at(parameter_name);
150 } catch (...) {
151 std::string errMsg = "String parameter '" + std::string(parameter_name) + "' does not exist";
152 throw std::invalid_argument(errMsg);
153 }
154 }
155
156 inline int
158 {
159 return num_material_points_;
160 }
161
162 inline const std::map<std::string, double>&
164 {
165 return material_double_parameters_;
166 }
167
168 inline const std::map<std::string, std::string>&
170 {
171 return material_string_parameters_;
172 }
173
174 inline void
175 Print() const
176 {
177 printf("\n--MaterialParameters\n");
178 printf(" material name %s\n", material_name_.c_str());
179 int num_material_double_parameters_ = static_cast<int>(material_double_parameters_.size());
180 printf(" number of material double parameters %d\n", num_material_double_parameters_);
181 for (const auto& p : material_double_parameters_) { printf(" %s %f\n", p.first.c_str(), p.second); }
182 int num_material_string_parameters_ = static_cast<int>(material_string_parameters_.size());
183 printf(" number of material string parameters %d\n", num_material_string_parameters_);
184 for (const auto& p : material_string_parameters_) { printf(" %s %s\n", p.first.c_str(), p.second.c_str()); }
185 }
186
187 private:
188 std::string material_name_;
189
190 std::map<std::string, double> material_double_parameters_;
191 std::map<std::string, std::string> material_string_parameters_;
192
193 int num_material_points_;
194};
195
197{
198 public:
200 Material() = default;
201
203 Material(const Material& mat) = default;
204
206 virtual ~Material() = default;
207
209 virtual bool
211 {
212 return false;
213 }
214
216 virtual int
217 NumStateVariables() const = 0;
218
220 virtual void
222
224 virtual double
225 GetStateVariableInitialValue(int index) const = 0;
226
228 virtual double
229 GetDensity() const = 0;
230
232 virtual double
233 GetBulkModulus() const = 0;
234
236 virtual double
237 GetShearModulus() const = 0;
238
240 virtual void
242 int elem_id,
243 int num_pts,
244 double time_previous,
245 double time_current,
246 const double* deformation_gradient_n,
247 const double* deformation_gradient_np1,
248 const double* stress_n,
249 double* stress_np1,
250 const double* state_data_n,
251 double* state_data_np1,
252 DataManager& data_manager,
253 bool is_output_step) = 0;
254
255#ifdef NIMBLE_HAVE_KOKKOS
256 struct DeviceElemState
257 {
258 //-- Variable to store one scalar per integration point
260 //-- Variable to store one vector (dim 3) per integration point
262 //-- Variable to store one symmetric tensor (6 entries) per integration point
264 //-- Variable to store one full tensor (9 entries) per integration point
266 };
267
269 virtual void
270 GetStress(
271 double time_previous,
272 double time_current,
273 const nimble_kokkos::DeviceFullTensorIntPtSingleEntryView& deformation_gradient_n,
274 const nimble_kokkos::DeviceFullTensorIntPtSingleEntryView& deformation_gradient_np1,
277 const nimble::Material::DeviceElemState& state_n,
278 nimble::Material::DeviceElemState& state_np1) const
279 {
280 const int def_g_len = 9, stress_len = 6;
281 nimble::Viewify<1, const double> def_g_n(deformation_gradient_n.data(), def_g_len);
282 nimble::Viewify<1, const double> def_g_np1(deformation_gradient_np1.data(), def_g_len);
283 nimble::Viewify<1, const double> s_n(stress_n.data(), stress_len);
284 nimble::Viewify<1> s_np1(stress_np1.data(), stress_len);
285 GetStress(time_previous, time_current, def_g_n, def_g_np1, s_n, s_np1);
286 }
287#endif
288
290 virtual void
291 GetTangent(int num_pts, double* material_tangent) const = 0;
292
293#ifdef NIMBLE_HAVE_UQ
295 virtual void
296 GetOffNominalStress(
297 const double& bulk_mod,
298 const double& shear_mod,
299 int num_pts,
300 const double* deformation_gradient_np1,
301 double* stress_np1) = 0;
302#endif
303
304 protected:
306 virtual void
308 double time_previous,
309 double time_current,
310 nimble::Viewify<1, const double>& deformation_gradient_n,
311 nimble::Viewify<1, const double>& deformation_gradient_np1,
313 nimble::Viewify<1> stress_np1) const = 0;
314};
315
317{
318 public:
319 static void
321
323 explicit ElasticMaterial(MaterialParameters const& material_parameters);
324
326 ElasticMaterial(const ElasticMaterial& mat) = default;
327
329 int
330 NumStateVariables() const override
331 {
332 return num_state_variables_;
333 };
334
336 void
338 {
339 printf(
340 "\n**** Error, bad index in "
341 "ElasticMaterial::GetStateVariableLabel().\n");
342 }
343
345 double
346 GetStateVariableInitialValue(int index) const override
347 {
348 printf(
349 "\n**** Error, bad index in "
350 "ElasticMaterial::GetStateVariableInitialValue().\n");
351 return 0.0;
352 }
353
355 double
356 GetDensity() const override
357 {
358 return density_;
359 }
360
362 double
363 GetBulkModulus() const override
364 {
365 return bulk_modulus_;
366 }
367
369 double
370 GetShearModulus() const override
371 {
372 return shear_modulus_;
373 }
374
376 void
377 GetStress(
378 int elem_id,
379 int num_pts,
380 double time_previous,
381 double time_current,
382 const double* deformation_gradient_n,
383 const double* deformation_gradient_np1,
384 const double* stress_n,
385 double* stress_np1,
386 const double* state_data_n,
387 double* state_data_np1,
388 DataManager& data_manager,
389 bool is_output_step) override;
390
392 void
393 GetTangent(int num_pts, double* material_tangent) const override;
394
395#ifdef NIMBLE_HAVE_UQ
397 void
398 GetOffNominalStress(
399 const double& bulk_mod,
400 const double& shear_mod,
401 int num_pts,
402 const double* deformation_gradient_np1,
403 double* stress_np1) override;
404#endif
405
406 protected:
408 void
409 GetStress(
410 double time_previous,
411 double time_current,
412 nimble::Viewify<1, const double>& deformation_gradient_n,
413 nimble::Viewify<1, const double>& deformation_gradient_np1,
415 nimble::Viewify<1> stress_np1) const override;
416
417 private:
418 int num_state_variables_;
419 int dim_;
420 double density_;
421 double bulk_modulus_;
422 double shear_modulus_;
423};
424
426{
427 public:
428 static void
430
433
435 explicit NeohookeanMaterial(MaterialParameters const& material_parameters);
436
438 int
439 NumStateVariables() const override
440 {
441 return num_state_variables_;
442 };
443
445 void
447 {
448 printf(
449 "\n**** Error, bad index in "
450 "NeohookeanMaterial::GetStateVariableLabel().\n");
451 }
452
454 double
455 GetStateVariableInitialValue(int index) const override
456 {
457 printf(
458 "\n**** Error, bad index in "
459 "NeohookeanMaterial::GetStateVariableInitialValue().\n");
460 return 0.0;
461 }
462
464 double
465 GetDensity() const override
466 {
467 return density_;
468 }
469
471 double
472 GetBulkModulus() const override
473 {
474 return bulk_modulus_;
475 }
476
478 double
479 GetShearModulus() const override
480 {
481 return shear_modulus_;
482 }
483
485 void
486 GetStress(
487 int elem_id,
488 int num_pts,
489 double time_previous,
490 double time_current,
491 const double* deformation_gradient_n,
492 const double* deformation_gradient_np1,
493 const double* stress_n,
494 double* stress_np1,
495 const double* state_data_n,
496 double* state_data_np1,
497 DataManager& data_manager,
498 bool is_output_step) override;
499
501 void
502 GetTangent(int num_pts, double* material_tangent) const override;
503
504#ifdef NIMBLE_HAVE_UQ
506 void
507 GetOffNominalStress(
508 const double& bulk_mod,
509 const double& shear_mod,
510 int num_pts,
511 const double* deformation_gradient_np1,
512 double* stress_np1) override;
513#endif
514
515 protected:
517 void
518 GetStress(
519 double time_previous,
520 double time_current,
521 nimble::Viewify<1, const double>& deformation_gradient_n,
522 nimble::Viewify<1, const double>& deformation_gradient_np1,
524 nimble::Viewify<1> stress_np1) const override;
525
526 private:
527 int num_state_variables_;
528 int dim_;
529 double density_;
530 double bulk_modulus_;
531 double shear_modulus_;
532};
533
534} // namespace nimble
535
536#endif // NIMBLE_MATERIAL_H
Definition nimble_data_manager.h:70
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:69
NIMBLE_FUNCTION double GetStateVariableInitialValue(int index) const override
Definition nimble_material.h:346
NIMBLE_FUNCTION void GetTangent(int num_pts, double *material_tangent) const override
Definition nimble_material.cc:161
static void register_supported_material_parameters(MaterialFactoryBase &factory)
Definition nimble_material.cc:52
NIMBLE_FUNCTION void GetStateVariableLabel(int index, char label[MaterialParameters::MAX_MAT_MODEL_STR_LEN]) const override
Definition nimble_material.h:337
NIMBLE_FUNCTION double GetDensity() const override
Definition nimble_material.h:356
NIMBLE_FUNCTION int NumStateVariables() const override
Definition nimble_material.h:330
NIMBLE_FUNCTION double GetBulkModulus() const override
Definition nimble_material.h:363
NIMBLE_FUNCTION ElasticMaterial(const ElasticMaterial &mat)=default
NIMBLE_FUNCTION double GetShearModulus() const override
Definition nimble_material.h:370
NIMBLE_FUNCTION ElasticMaterial(MaterialParameters const &material_parameters)
Definition nimble_material.cc:59
Definition nimble_material_factory_base.h:61
Definition nimble_material_factory.h:52
virtual NIMBLE_FUNCTION int NumStateVariables() const =0
virtual NIMBLE_FUNCTION ~Material()=default
NIMBLE_FUNCTION Material()=default
virtual NIMBLE_FUNCTION double GetBulkModulus() const =0
virtual NIMBLE_FUNCTION void GetTangent(int num_pts, double *material_tangent) const =0
virtual NIMBLE_FUNCTION double GetDensity() const =0
virtual NIMBLE_FUNCTION bool IsNGPLAMEModel() const
Definition nimble_material.h:210
NIMBLE_FUNCTION Material(const Material &mat)=default
virtual NIMBLE_FUNCTION void GetStateVariableLabel(int index, char label[MaterialParameters::MAX_MAT_MODEL_STR_LEN]) const =0
virtual NIMBLE_FUNCTION double GetShearModulus() const =0
virtual 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 =0
virtual NIMBLE_FUNCTION double GetStateVariableInitialValue(int index) const =0
virtual 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)=0
Definition nimble_material.h:62
MaterialParameters()
Definition nimble_material.h:67
double GetParameterValue(const char *parameter_name) const
Definition nimble_material.h:135
bool IsParameter(const char *parameter_name) const
Definition nimble_material.h:103
std::string GetMaterialName(bool upper_case=false) const
Definition nimble_material.h:115
int GetNumMaterialPoints() const
Definition nimble_material.h:157
int GetNumParameters() const
Definition nimble_material.h:123
static const int MAX_MAT_MODEL_STR_LEN
Definition nimble_material.h:65
static void ConvertStringToUpperCase(std::string &s)
Definition nimble_material.h:83
const std::map< std::string, std::string > & GetStringParameters() const
Definition nimble_material.h:169
static const int MAX_NUM_MAT_PARAM
Definition nimble_material.h:64
void AddParameter(const char *parameter_name, double parameter_value)
Definition nimble_material.h:91
NIMBLE_INLINE_FUNCTION MaterialParameters(const std::string &material_name, const std::map< std::string, std::string > &string_params, const std::map< std::string, double > &double_params, int num_material_points=0)
Definition nimble_material.h:70
const std::map< std::string, double > & GetParameters() const
Definition nimble_material.h:163
const std::string & GetStringParameterValue(const char *parameter_name) const
Definition nimble_material.h:146
void Print() const
Definition nimble_material.h:175
bool IsStringParameter(const char *parameter_name) const
Definition nimble_material.h:109
void AddStringParameter(const char *parameter_name, const char *parameter_value)
Definition nimble_material.h:97
int GetNumStringParameters() const
Definition nimble_material.h:129
NIMBLE_FUNCTION double GetDensity() const override
Definition nimble_material.h:465
NIMBLE_FUNCTION double GetShearModulus() const override
Definition nimble_material.h:479
NIMBLE_FUNCTION void GetTangent(int num_pts, double *material_tangent) const override
Definition nimble_material.cc:345
NIMBLE_FUNCTION NeohookeanMaterial(const NeohookeanMaterial &mat)=default
NIMBLE_FUNCTION int NumStateVariables() const override
Definition nimble_material.h:439
NIMBLE_FUNCTION double GetBulkModulus() const override
Definition nimble_material.h:472
NIMBLE_FUNCTION double GetStateVariableInitialValue(int index) const override
Definition nimble_material.h:455
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
static void register_supported_material_parameters(MaterialFactoryBase &factory)
Definition nimble_material.cc:209
NIMBLE_FUNCTION void GetStateVariableLabel(int index, char label[MaterialParameters::MAX_MAT_MODEL_STR_LEN]) const override
Definition nimble_material.h:446
Definition nimble_view.h:72
Field< FieldType::DeviceSymTensorIntPt >::SingleEntryView DeviceSymTensorIntPtSingleEntryView
Definition nimble_kokkos_defs.h:593
Field< FieldType::DeviceVectorIntPt >::SingleEntryView DeviceVectorIntPtSingleEntryView
Definition nimble_kokkos_defs.h:599
Field< FieldType::DeviceScalarIntPt >::SingleEntryView DeviceScalarIntPtSingleEntryView
Definition nimble_kokkos_defs.h:596
Field< FieldType::DeviceFullTensorIntPt >::SingleEntryView DeviceFullTensorIntPtSingleEntryView
Definition nimble_kokkos_defs.h:590
Definition kokkos_contact_manager.h:49
#define NIMBLE_INLINE_FUNCTION
Definition nimble_defs.h:50
#define NIMBLE_FUNCTION
Definition nimble_defs.h:49