https://mooseframework.inl.gov
ADCubicTransition.C
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 #include "ADCubicTransition.h"
11 #include "MooseError.h"
12 #include "ADReal.h"
13 
14 #include "libmesh/dense_vector.h"
15 #include "DenseMatrix.h"
16 
17 ADCubicTransition::ADCubicTransition(const ADReal & x_center, const ADReal & transition_width)
18  : ADSmoothTransition(x_center, transition_width),
19 
20  _A(0.0),
21  _B(0.0),
22  _C(0.0),
23  _D(0.0),
24 
25  _initialized(false)
26 {
27 }
28 
29 void
31  const ADReal & f2_end_value,
32  const ADReal & df1dx_end_value,
33  const ADReal & df2dx_end_value)
34 {
35  // compute cubic polynomial coefficients
36 
37  DenseMatrix<ADReal> mat(4, 4);
38 
39  mat(0, 0) = std::pow(_x1, 3);
40  mat(0, 1) = std::pow(_x1, 2);
41  mat(0, 2) = _x1;
42  mat(0, 3) = 1.0;
43 
44  mat(1, 0) = std::pow(_x2, 3);
45  mat(1, 1) = std::pow(_x2, 2);
46  mat(1, 2) = _x2;
47  mat(1, 3) = 1.0;
48 
49  mat(2, 0) = 3.0 * std::pow(_x1, 2);
50  mat(2, 1) = 2.0 * _x1;
51  mat(2, 2) = 1.0;
52  mat(2, 3) = 0.0;
53 
54  mat(3, 0) = 3.0 * std::pow(_x2, 2);
55  mat(3, 1) = 2.0 * _x2;
56  mat(3, 2) = 1.0;
57  mat(3, 3) = 0.0;
58 
59  DenseVector<ADReal> rhs(4);
60  rhs(0) = f1_end_value;
61  rhs(1) = f2_end_value;
62  rhs(2) = df1dx_end_value;
63  rhs(3) = df2dx_end_value;
64 
65  DenseVector<ADReal> coefs(4);
66  mat.lu_solve(rhs, coefs);
67 
68  _A = coefs(0);
69  _B = coefs(1);
70  _C = coefs(2);
71  _D = coefs(3);
72 
73  _initialized = true;
74 }
75 
76 ADReal
77 ADCubicTransition::value(const ADReal & x, const ADReal & f1, const ADReal & f2) const
78 {
79  mooseAssert(_initialized, "initialize() must be called.");
80 
81  if (x <= _x1)
82  return f1;
83  else if (x >= _x2)
84  return f2;
85  else
86  return _A * std::pow(x, 3) + _B * std::pow(x, 2) + _C * x + _D;
87 }
bool _initialized
Flag that transition has been initialized.
DualNumber< Real, DNDerivativeType, true > ADReal
virtual ADReal value(const ADReal &x, const ADReal &f1, const ADReal &f2) const override
Computes the transition value.
const std::vector< double > x
ADCubicTransition(const ADReal &x_center, const ADReal &transition_width)
Constructor.
Base class for smooth transitions between two functions of one variable.
const ADReal _x2
Right end point of transition.
void initialize(const ADReal &f1_end_value, const ADReal &f2_end_value, const ADReal &df1dx_end_value, const ADReal &df2dx_end_value)
Computes the derivative of the transition value.
const ADReal _x1
Left end point of transition.
MooseUnits pow(const MooseUnits &, int)