NEML2 1.4.0
Loading...
Searching...
No Matches
ForceRate.cxx
1// Copyright 2023, 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#include "neml2/models/ForceRate.h"
26#include "neml2/tensors/SSR4.h"
27
28namespace neml2
29{
30register_NEML2_object(ScalarForceRate);
31register_NEML2_object(SR2ForceRate);
32
33template <typename T>
36{
38 options.doc() = "Calculate the first order discrete time derivative of a force variable as \\f$ "
39 "\\dot{f} = \\frac{f-f_n}{t-t_n} \\f$, where \\f$ f \\f$ is the force variable, "
40 "and \\f$ t \\f$ is time.";
41
42 options.set<VariableName>("force");
43 options.set("force").doc() = "The force variable to take time derivative with";
44
45 options.set<VariableName>("time") = {"t"};
46 options.set("time").doc() = "Time";
47
48 return options;
49}
50
51template <typename T>
53 : Model(options),
54 _df_dt(declare_output_variable<T>(
55 options.get<VariableName>("force").with_suffix("_rate").on("forces"))),
56 _f(declare_input_variable<T>(options.get<VariableName>("force").on("forces"))),
57 _fn(declare_input_variable<T>(options.get<VariableName>("force").on("old_forces"))),
58 _t(declare_input_variable<Scalar>(options.get<VariableName>("time").on("forces"))),
59 _tn(declare_input_variable<Scalar>(options.get<VariableName>("time").on("old_forces")))
60{
61}
62
63template <typename T>
64void
66{
67 auto df = _f - _fn;
68 auto dt = _t - _tn;
69
70 if (out)
71 _df_dt = df / dt;
72
73 if (dout_din || d2out_din2)
74 {
75 auto I = T::identity_map(options());
76
77 if (dout_din)
78 {
79 _df_dt.d(_f) = I / dt;
80 _df_dt.d(_fn) = -I / dt;
81 _df_dt.d(_t) = -df / dt / dt;
82 _df_dt.d(_tn) = df / dt / dt;
83 }
84
85 if (d2out_din2)
86 {
87 _df_dt.d(_f, _t) = -I / dt / dt;
88 _df_dt.d(_f, _tn) = I / dt / dt;
89
90 _df_dt.d(_fn, _t) = I / dt / dt;
91 _df_dt.d(_fn, _tn) = -I / dt / dt;
92
93 _df_dt.d(_t, _f) = -I / dt / dt;
94 _df_dt.d(_t, _fn) = I / dt / dt;
95 _df_dt.d(_t, _t) = 2 * df / dt / dt / dt;
96 _df_dt.d(_t, _tn) = -2 * df / dt / dt / dt;
97
98 _df_dt.d(_tn, _f) = I / dt / dt;
99 _df_dt.d(_tn, _fn) = -I / dt / dt;
100 _df_dt.d(_tn, _t) = -2 * df / dt / dt / dt;
101 _df_dt.d(_tn, _tn) = 2 * df / dt / dt / dt;
102 }
103 }
104}
105
106template class ForceRate<Scalar>;
107template class ForceRate<SR2>;
108} // namespace neml2
The wrapper (decorator) for cross-referencing unresolved values at parse time.
Definition CrossRef.h:52
CrossRef()=default
ForceRate(const OptionSet &options)
Definition ForceRate.cxx:52
static OptionSet expected_options()
Definition ForceRate.cxx:35
void set_value(bool out, bool dout_din, bool d2out_din2) override
The map between input -> output, and optionally its derivatives.
Definition ForceRate.cxx:65
The accessor containing all the information needed to access an item in a LabeledAxis.
Definition LabeledAxisAccessor.h:44
The base class for all constitutive models.
Definition Model.h:53
static OptionSet expected_options()
Definition Model.cxx:33
A custom map-like data structure. The keys are strings, and the values can be nonhomogeneously typed.
Definition OptionSet.h:59
const std::string & doc() const
A readonly reference to the option set's docstring.
Definition OptionSet.h:91
T & set(const std::string &)
Definition OptionSet.h:436
The (logical) scalar.
Definition Scalar.h:38
Definition CrossRef.cxx:32