https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
17ADCubicTransition::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
29void
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 using std::pow;
37
38 DenseMatrix<ADReal> mat(4, 4);
39
40 mat(0, 0) = pow(_x1, 3);
41 mat(0, 1) = pow(_x1, 2);
42 mat(0, 2) = _x1;
43 mat(0, 3) = 1.0;
44
45 mat(1, 0) = pow(_x2, 3);
46 mat(1, 1) = pow(_x2, 2);
47 mat(1, 2) = _x2;
48 mat(1, 3) = 1.0;
49
50 mat(2, 0) = 3.0 * pow(_x1, 2);
51 mat(2, 1) = 2.0 * _x1;
52 mat(2, 2) = 1.0;
53 mat(2, 3) = 0.0;
54
55 mat(3, 0) = 3.0 * pow(_x2, 2);
56 mat(3, 1) = 2.0 * _x2;
57 mat(3, 2) = 1.0;
58 mat(3, 3) = 0.0;
59
60 DenseVector<ADReal> rhs(4);
61 rhs(0) = f1_end_value;
62 rhs(1) = f2_end_value;
63 rhs(2) = df1dx_end_value;
64 rhs(3) = df2dx_end_value;
65
66 DenseVector<ADReal> coefs(4);
67 mat.lu_solve(rhs, coefs);
68
69 _A = coefs(0);
70 _B = coefs(1);
71 _C = coefs(2);
72 _D = coefs(3);
73
74 _initialized = true;
75}
76
78ADCubicTransition::value(const ADReal & x, const ADReal & f1, const ADReal & f2) const
79{
80 mooseAssert(_initialized, "initialize() must be called.");
81 using std::pow;
82
83 if (x <= _x1)
84 return f1;
85 else if (x >= _x2)
86 return f2;
87 else
88 return _A * pow(x, 3) + _B * pow(x, 2) + _C * x + _D;
89}
DualNumber< Real, DNDerivativeType, true > ADReal
const std::vector< double > x
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
bool _initialized
Flag that transition has been initialized.
virtual ADReal value(const ADReal &x, const ADReal &f1, const ADReal &f2) const override
Computes the transition value.
ADCubicTransition(const ADReal &x_center, const ADReal &transition_width)
Constructor.
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.
Base class for smooth transitions between two functions of one variable.
const ADReal _x2
Right end point of transition.
const ADReal _x1
Left end point of transition.