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/LabeledAxisAccessor.h"
18 #include "neml2/base/Parser.h"
19 #include "neml2/base/Factory.h"
20 #include "neml2/models/Model.h"
21 #include "RankTwoTensor.h"
22 #include "RankFourTensor.h"
23 #include "SymmetricRankTwoTensor.h"
25 #include "MaterialProperty.h"
26 
27 #endif
28 
29 class MooseObject;
30 class Action;
31 class SubProblem;
32 
33 namespace NEML2Utils
34 {
35 #ifdef NEML2_ENABLED
36 
44 std::shared_ptr<neml2::Model>
45 getModel(neml2::Factory & factory, const std::string & name, neml2::Dtype dtype = neml2::kFloat64);
46 
48 void assertVariable(const neml2::VariableName &);
49 
51 void assertOldVariable(const neml2::VariableName &);
52 
54 neml2::VariableName parseVariableName(const std::string &);
55 
56 template <typename T>
57 struct Layout
58 {
59 };
60 template <>
61 struct Layout<Real>
62 {
63  static constexpr std::array<neml2::Size, 0> shape{};
64  static constexpr std::array<neml2::Size, 1> strides{1};
65 };
66 template <>
68 {
69  static constexpr std::array<neml2::Size, 1> shape{3};
70  static constexpr std::array<neml2::Size, 2> strides{3, 1};
71 };
72 template <>
74 {
75  static constexpr std::array<neml2::Size, 2> shape{3, 3};
76  static constexpr std::array<neml2::Size, 3> strides{9, 3, 1};
77 };
78 template <>
80 {
81  static constexpr std::array<neml2::Size, 1> shape{6};
82  static constexpr std::array<neml2::Size, 2> strides{6, 1};
83 };
84 template <>
86 {
87  static constexpr std::array<neml2::Size, 4> shape{3, 3, 3, 3};
88  static constexpr std::array<neml2::Size, 5> strides{81, 27, 9, 3, 1};
89 };
90 template <>
92 {
93  static constexpr std::array<neml2::Size, 2> shape{6, 6};
94  static constexpr std::array<neml2::Size, 3> strides{36, 6, 1};
95 };
96 
108 template <typename T>
109 neml2::Tensor
110 fromBlob(const std::vector<T> & data)
111 {
112  // The const_cast is fine because torch works with non-const ptr so that it can optionally handle
113  // deallocation. But we are not going to let torch do that.
114  const auto torch_tensor = at::from_blob(const_cast<T *>(data.data()),
115  neml2::utils::add_shapes(data.size(), Layout<T>::shape),
116  at::TensorOptions().dtype(neml2::kFloat64));
117  return neml2::Tensor(torch_tensor, 1);
118 }
119 
133 template <typename T>
134 void
135 copyTensorToMOOSEData(const at::Tensor & src, T & dest)
136 {
137  if (src.dtype() != neml2::kFloat64)
138  mooseError(
139  "Cannot copy at::Tensor with dtype ", src.dtype(), " into ", demangle(typeid(T).name()));
140  if (src.numel() != Layout<T>::strides[0])
141  mooseError("Cannot copy at::Tensor with shape ",
142  src.sizes(),
143  " into ",
144  demangle(typeid(T).name()),
145  " with different number of elements.");
146  auto dest_tensor = at::from_blob(reinterpret_cast<Real *>(&dest),
148  at::TensorOptions().dtype(neml2::kFloat64));
149  dest_tensor.copy_(src.reshape(Layout<T>::shape));
150 }
151 
152 static std::string NEML2_help_message = R""""(
153 ==============================================================================
154 To debug NEML2 related issues:
155 1. Build and run MOOSE in dbg mode.
156 2. Re-run the simulation using the dbg executable, and often times
157  NEML2 will provide a more helpful error message.
158 3. If the error message is not helpful, or if there is still no error message,
159  run the simulation through a debugger: See
160  https://mooseframework.inl.gov/application_development/debugging.html
161 4. If the issue is due to a NEML2 bug, feel free to report it at
162  https://github.com/applied-material-modeling/neml2/issues
163 ==============================================================================
164 )"""";
165 
166 #endif // NEML2_ENABLED
167 
169 bool shouldCompute(const SubProblem &);
170 
174 std::string docstring(const std::string & desc);
175 
179 void assertNEML2Enabled();
180 
181 } // 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:302
bool shouldCompute(const SubProblem &)
Determine whether the NEML2 material model should be evaluated.
Definition: NEML2Utils.C:59
void assertOldVariable(const neml2::VariableName &)
Assert that the NEML2 variable name sits on either the old_forces or the old_state subaxis...
Definition: NEML2Utils.C:39
static std::string NEML2_help_message
Definition: NEML2Utils.h:152
Base class for actions.
Definition: Action.h:33
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:135
std::string docstring(const std::string &desc)
Augment docstring if NEML2 is not enabled.
Definition: NEML2Utils.C:77
std::string demangle(const char *name)
void assertNEML2Enabled()
Assert that NEML2 is enabled.
Definition: NEML2Utils.C:87
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:18
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...
void assertVariable(const neml2::VariableName &)
Assert that the NEML2 variable name sits on either the forces or the state subaxis.
Definition: NEML2Utils.C:29
neml2::VariableName parseVariableName(const std::string &)
Parse a raw string into NEML2 variable name.
Definition: NEML2Utils.C:49
neml2::Tensor fromBlob(const std::vector< T > &data)
Map from std::vector<T> to neml2::Tensor without copying the data.
Definition: NEML2Utils.h:110