NEML2 2.1.0
Loading...
Searching...
No Matches
VariableStore.h
1// Copyright 2024, UChicago Argonne, LLC
2// All Rights Reserved
3// Software Name: NEML2 -- the New Engineering material Model Library, version 2
4// By: Argonne National Laboratory
5// OPEN SOURCE LICENSE (MIT)
6//
7// Permission is hereby granted, free of charge, to any person obtaining a copy
8// of this software and associated documentation files (the "Software"), to deal
9// in the Software without restriction, including without limitation the rights
10// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11// copies of the Software, and to permit persons to whom the Software is
12// furnished to do so, subject to the following conditions:
13//
14// The above copyright notice and this permission notice shall be included in
15// all copies or substantial portions of the Software.
16//
17// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23// THE SOFTWARE.
24
25#pragma once
26
27#include <memory>
28
29#include "neml2/models/map_types_fwd.h"
30#include "neml2/base/LabeledAxisAccessor.h"
31#include "neml2/misc/types.h"
32#include "neml2/tensors/jit.h"
33#include "neml2/equation_systems/SparseTensorList.h"
34
35namespace neml2
36{
37// Foward declarations
38class Model;
39class LabeledAxis;
40class VariableBase;
41template <typename T>
42class Variable;
43template <typename T>
44struct TensorName;
45
47ValueMap bind(const std::vector<VariableName> &, const std::vector<Tensor> &);
48
50{
51public:
53
54 VariableStore(const VariableStore &) = delete;
58 virtual ~VariableStore() = default;
59
60 LabeledAxis & declare_axis(const std::string & name);
61
65 const LabeledAxis & input_axis() const;
67
71 const LabeledAxis & output_axis() const;
73
74 using VariableStorage = std::map<VariableName, std::unique_ptr<VariableBase>>;
75 using DerivSparsity = std::vector<std::pair<VariableBase *, const VariableBase *>>;
77 std::vector<std::tuple<VariableBase *, const VariableBase *, const VariableBase *>>;
78
81 VariableStorage & input_variables() { return _input_variables; }
82 const VariableStorage & input_variables() const { return _input_variables; }
83 VariableStorage & output_variables() { return _output_variables; }
84 const VariableStorage & output_variables() const { return _output_variables; }
86
94
96 const TensorOptions & variable_options() const { return _options; }
97
100 virtual void clear_input();
101 virtual void clear_output();
102 virtual void clear_derivatives();
104
106 virtual void zero_undefined_input();
107
114 const std::optional<DerivSparsity> & derivative_sparsity() const;
116 const std::optional<SecDerivSparsity> & second_derivative_sparsity() const;
118
121 void assign_input(const ValueMap & vals);
123 void assign_input(const std::vector<VariableName> &, const SparseTensorList &);
125 void assign_output(const ValueMap & vals);
127 void assign_output(const std::vector<VariableName> &, const SparseTensorList &);
131 void assign_output_derivatives(const std::vector<VariableName> &,
132 const std::vector<VariableName> &,
133 const SparseTensorList &);
135
140 SparseTensorList collect_input(const std::vector<VariableName> &) const;
144 SparseTensorList collect_output(const std::vector<VariableName> &) const;
148 SparseTensorList collect_output_derivatives(const std::vector<VariableName> &,
149 const std::vector<VariableName> &) const;
153
154protected:
160 virtual void send_variables_to(const TensorOptions & options);
161
170 template <typename T>
171 const Variable<T> & declare_input_variable(const char * name, bool allow_duplicate = false);
172
181 template <typename T>
183 bool allow_duplicate = false);
184
192 template <typename T>
194
202 template <typename T>
204
207 const VariableName & new_name = {});
208
211 const VariableName & new_name = {});
212
214 void assign_input_stack(jit::Stack & stack);
215
217 void assign_output_stack(jit::Stack & stack, bool out, bool dout, bool d2out);
218
220 jit::Stack collect_input_stack() const;
221
223 jit::Stack collect_output_stack(bool out, bool dout, bool d2out) const;
224
225 // TensorName resolution may require declare_input_variable
226 template <typename T>
227 friend const T & resolve_tensor_name(const TensorName<T> &, Model *, const std::string &);
228
229private:
230 // Create a variable
231 template <typename T>
232 Variable<T> * create_variable(VariableStorage & variables,
233 const VariableName & name,
234 bool allow_duplicate = false);
235
237 Model * _object;
238
240 std::map<std::string, std::unique_ptr<LabeledAxis>> _axes;
241
243 LabeledAxis & _input_axis;
244
246 LabeledAxis & _output_axis;
247
249 VariableStorage _input_variables;
250
252 VariableStorage _output_variables;
253
255 TensorOptions _options;
256
258 std::map<VariableName, Size> _input_intmd_dims;
259
261 std::map<VariableName, Size> _output_intmd_dims;
262
264 std::optional<DerivSparsity> _deriv_sparsity = std::nullopt;
265
267 std::optional<SecDerivSparsity> _secderiv_sparsity = std::nullopt;
268
270 std::optional<DerivSparsity> _deriv_sparsity_nl_sys = std::nullopt;
271
273 std::optional<SecDerivSparsity> _secderiv_sparsity_nl_sys = std::nullopt;
274};
275} // namespace neml2
A labeled axis is used to associate layout of a tensor with human-interpretable names.
Definition LabeledAxis.h:48
The base class for all constitutive models.
Definition Model.h:83
Base class of variable.
Definition VariableBase.h:53
void assign_output_derivatives(const DerivMap &derivs)
Assign variable derivatives.
VariableBase & output_variable(const VariableName &)
VariableBase * clone_output_variable(const VariableBase &var, const VariableName &new_name={})
Clone a variable and put it on the output axis.
ValueMap collect_output() const
Collect output variable values.
void assign_output(const ValueMap &vals)
Assign output variable values.
std::vector< std::tuple< VariableBase *, const VariableBase *, const VariableBase * > > SecDerivSparsity
Definition VariableStore.h:76
const std::optional< DerivSparsity > & derivative_sparsity() const
Derivative sparsity.
virtual ~VariableStore()=default
void cache_derivative_sparsity()
Variable< T > & declare_output_variable(const VariableName &name)
Declare an output variable.
LabeledAxis & output_axis()
virtual void send_variables_to(const TensorOptions &options)
Send padding variables to options.
std::vector< std::pair< VariableBase *, const VariableBase * > > DerivSparsity
Definition VariableStore.h:75
SparseTensorList collect_output_derivatives(const std::vector< VariableName > &, const std::vector< VariableName > &) const
Collect variable derivatives for the given variable names.
SecDerivMap collect_output_second_derivatives() const
Collect variable second derivatives.
VariableStore(Model *object)
void assign_output_stack(jit::Stack &stack, bool out, bool dout, bool d2out)
Assign stack to output variables and derivatives.
Variable< T > & declare_output_variable(const char *name)
Declare an output variable.
ValueMap collect_input() const
VariableStorage & output_variables()
Definition VariableStore.h:83
friend const T & resolve_tensor_name(const TensorName< T > &, Model *, const std::string &)
void assign_output_derivatives(const std::vector< VariableName > &, const std::vector< VariableName > &, const SparseTensorList &)
Assign variable derivatives for the given variable names.
VariableBase & input_variable(const VariableName &)
const std::optional< SecDerivSparsity > & second_derivative_sparsity() const
Second derivative sparsity.
VariableStore(const VariableStore &)=delete
jit::Stack collect_output_stack(bool out, bool dout, bool d2out) const
Collect stack from output variables and derivatives.
DerivMap collect_output_derivatives() const
Collect variable derivatives.
virtual void clear_derivatives()
virtual void clear_input()
const LabeledAxis & input_axis() const
void assign_input(const std::vector< VariableName > &, const SparseTensorList &)
Assign input variable values for the given variable names.
const VariableStorage & input_variables() const
Definition VariableStore.h:82
std::map< VariableName, std::unique_ptr< VariableBase > > VariableStorage
Definition VariableStore.h:74
jit::Stack collect_input_stack() const
Collect stack from input variables.
LabeledAxis & declare_axis(const std::string &name)
virtual void clear_output()
VariableStore & operator=(const VariableStore &)=delete
void assign_input(const ValueMap &vals)
const VariableStorage & output_variables() const
Definition VariableStore.h:84
const Variable< T > & declare_input_variable(const char *name, bool allow_duplicate=false)
Declare an input variable.
VariableStore & operator=(VariableStore &&)=delete
void cache_second_derivative_sparsity()
Cache sparsity of second derivatives.
VariableStorage & input_variables()
Definition VariableStore.h:81
void assign_output(const std::vector< VariableName > &, const SparseTensorList &)
Assign output variable values for the given variable names.
const VariableBase & input_variable(const VariableName &) const
SparseTensorList collect_output(const std::vector< VariableName > &) const
Collect output variable values for the given variable names.
const LabeledAxis & output_axis() const
const Variable< T > & declare_input_variable(const VariableName &name, bool allow_duplicate=false)
Declare an input variable.
VariableStore(VariableStore &&)=delete
const TensorOptions & variable_options() const
Current tensor options for variables.
Definition VariableStore.h:96
void assign_input_stack(jit::Stack &stack)
Assign stack to input variables.
virtual void zero_undefined_input()
Fill undefined input variables with zeros.
SparseTensorList collect_input(const std::vector< VariableName > &) const
Collect input variable values for the given variable names.
LabeledAxis & input_axis()
const VariableBase * clone_input_variable(const VariableBase &var, const VariableName &new_name={})
Clone a variable and put it on the input axis.
const VariableBase & output_variable(const VariableName &) const
Concrete definition of a variable.
Definition Variable.h:37
Definition DiagnosticsInterface.h:31
std::map< LabeledAxisAccessor, Tensor > ValueMap
Definition map_types_fwd.h:33
std::map< LabeledAxisAccessor, ValueMap > DerivMap
Definition map_types_fwd.h:34
std::string name(ElasticConstant p)
std::map< LabeledAxisAccessor, DerivMap > SecDerivMap
Definition map_types_fwd.h:35
ValueMap bind(const std::vector< VariableName > &, const std::vector< Tensor > &)
Bind a vector of tensors to variable names.
LabeledAxisAccessor VariableName
Definition LabeledAxisAccessor.h:185
c10::TensorOptions TensorOptions
Definition types.h:66
Alias for a list of Tensors.
Definition SparseTensorList.h:42
The name of a tensor object that can be referenced in the input files.
Definition TensorName.h:47