https://mooseframework.inl.gov
NEML2Utils.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include <string>
13 
14 #ifdef NEML2_ENABLED
15 
16 #include "neml2/tensors/tensors.h"
17 #include "neml2/base/Factory.h"
18 #include "neml2/models/Model.h"
19 #include "RankTwoTensor.h"
20 #include "RankFourTensor.h"
21 #include "SymmetricRankTwoTensor.h"
23 #include "MaterialProperty.h"
24 
25 #endif
26 
27 class MooseObject;
28 class Action;
29 class SubProblem;
30 
31 namespace NEML2Utils
32 {
33 #ifdef NEML2_ENABLED
34 
35 enum class MOOSEIOType
36 {
37  // unbatched
38  TIME,
39  SCALAR,
40  // batched
41  FUNCTION,
42  VARIABLE,
43  MATERIAL
44 };
45 
46 std::string stringify(MOOSEIOType type);
47 
55 std::shared_ptr<neml2::Model>
56 getModel(neml2::Factory & factory, const std::string & name, neml2::Dtype dtype = neml2::kFloat64);
57 
58 template <typename T>
59 struct Layout
60 {
61 };
62 template <>
63 struct Layout<Real>
64 {
65  static constexpr std::array<neml2::Size, 0> shape{};
66  static constexpr std::array<neml2::Size, 1> strides{1};
67 };
68 template <>
70 {
71  static constexpr std::array<neml2::Size, 1> shape{3};
72  static constexpr std::array<neml2::Size, 2> strides{3, 1};
73 };
74 template <>
76 {
77  static constexpr std::array<neml2::Size, 2> shape{3, 3};
78  static constexpr std::array<neml2::Size, 3> strides{9, 3, 1};
79 };
80 template <>
82 {
83  static constexpr std::array<neml2::Size, 1> shape{6};
84  static constexpr std::array<neml2::Size, 2> strides{6, 1};
85 };
86 template <>
88 {
89  static constexpr std::array<neml2::Size, 4> shape{3, 3, 3, 3};
90  static constexpr std::array<neml2::Size, 5> strides{81, 27, 9, 3, 1};
91 };
92 template <>
94 {
95  static constexpr std::array<neml2::Size, 2> shape{6, 6};
96  static constexpr std::array<neml2::Size, 3> strides{36, 6, 1};
97 };
98 
110 template <typename T>
111 neml2::Tensor
112 fromBlob(const std::vector<T> & data)
113 {
114  // The const_cast is fine because torch works with non-const ptr so that it can optionally handle
115  // deallocation. But we are not going to let torch do that.
116  const auto torch_tensor = at::from_blob(const_cast<T *>(data.data()),
117  neml2::utils::add_shapes(data.size(), Layout<T>::shape),
118  at::TensorOptions().dtype(neml2::kFloat64));
119  return neml2::Tensor(torch_tensor, 1);
120 }
121 
135 template <typename T>
136 void
137 copyTensorToMOOSEData(const at::Tensor & src, T & dest)
138 {
139  if (src.dtype() != neml2::kFloat64)
140  mooseError(
141  "Cannot copy at::Tensor with dtype ", src.dtype(), " into ", demangle(typeid(T).name()));
142  if (src.numel() != Layout<T>::strides[0])
143  mooseError("Cannot copy at::Tensor with shape ",
144  src.sizes(),
145  " into ",
146  demangle(typeid(T).name()),
147  " with different number of elements.");
148  auto dest_tensor = at::from_blob(reinterpret_cast<Real *>(&dest),
150  at::TensorOptions().dtype(neml2::kFloat64));
151  dest_tensor.copy_(src.reshape(Layout<T>::shape));
152 }
153 
154 static std::string NEML2_help_message = R""""(
155 ==============================================================================
156 To debug NEML2 related issues:
157 1. Build and run MOOSE in dbg mode.
158 2. Re-run the simulation using the dbg executable, and often times
159  NEML2 will provide a more helpful error message.
160 3. If the error message is not helpful, or if there is still no error message,
161  run the simulation through a debugger: See
162  https://mooseframework.inl.gov/application_development/debugging.html
163 4. If the issue is due to a NEML2 bug, feel free to report it at
164  https://github.com/applied-material-modeling/neml2/issues
165 ==============================================================================
166 )"""";
167 
168 #endif // NEML2_ENABLED
169 
171 bool shouldCompute(const SubProblem &);
172 
176 std::string docstring(const std::string & desc);
177 
181 void assertNEML2Enabled();
182 
183 } // namespace NEML2Utils
std::string name(const ElemQuality q)
RankFourTensorTempl is designed to handle any N-dimensional fourth order tensor, C.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
bool shouldCompute(const SubProblem &)
Determine whether the NEML2 material model should be evaluated.
Definition: NEML2Utils.C:53
static std::string NEML2_help_message
Definition: NEML2Utils.h:154
Base class for actions.
Definition: Action.h:34
std::string stringify(MOOSEIOType type)
Definition: NEML2Utils.C:18
Every object that can be built by the factory should be derived from this class.
Definition: MooseObject.h:28
void copyTensorToMOOSEData(const at::Tensor &src, T &dest)
Directly copy a contiguous chunk of memory of a at::Tensor to a MOOSE data of type T...
Definition: NEML2Utils.h:137
std::string docstring(const std::string &desc)
Augment docstring if NEML2 is not enabled.
Definition: NEML2Utils.C:71
std::string demangle(const char *name)
void assertNEML2Enabled()
Assert that NEML2 is enabled.
Definition: NEML2Utils.C:81
std::shared_ptr< neml2::Model > getModel(neml2::Factory &factory, const std::string &name, neml2::Dtype dtype=neml2::kFloat64)
Get the NEML2 Model.
Definition: NEML2Utils.C:38
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Generic class for solving transient nonlinear problems.
Definition: SubProblem.h:78
SymmetricRankFourTensorTempl is designed to handle an N-dimensional fourth order tensor with minor sy...
neml2::Tensor fromBlob(const std::vector< T > &data)
Map from std::vector<T> to neml2::Tensor without copying the data.
Definition: NEML2Utils.h:112