7
7
//* Licensed under LGPL 2.1, please see LICENSE for details
8
8
//* https://www.gnu.org/licenses/lgpl-2.1.html
9
9
10
+ #include "DirectCentralDifference.h"
10
11
#include "DirectDirichletBCBase.h"
12
+ #include "MooseError.h"
11
13
#include "NonlinearSystemBase.h"
14
+ #include <iostream>
15
+ #include <ostream>
12
16
13
17
InputParameters
14
18
DirectDirichletBCBase ::validParams ()
@@ -21,21 +25,40 @@ DirectDirichletBCBase::DirectDirichletBCBase(const InputParameters & parameters)
21
25
: NodalBC (parameters ),
22
26
_mass_diag (_sys .getVector ("mass_matrix_diag_inverted" )),
23
27
_u_old (_var .nodalValueOld ()),
24
- _u_dot_old (_var .nodalValueDotOld ())
28
+ _u_dot_old (_var .nodalValueDotOld ()),
29
+ _exp_integrator (
30
+ dynamic_cast < const DirectCentralDifference * > (& _sys .getTimeIntegrator (_var .number ())))
25
31
{
32
+ if (!_exp_integrator )
33
+ mooseError ("Time integrator for the variable is not of the right type." );
26
34
}
27
35
28
36
Real
29
37
DirectDirichletBCBase ::computeQpResidual ()
30
38
{
31
39
// Get dof for current var
32
40
const auto dofnum = _variable -> nodalDofIndex ();
41
+ Real resid = 0 ;
42
+ // Compute residual to enforce BC based on time order
43
+ switch (_var_time_order )
44
+ {
45
+ case DirectCentralDifference ::FIRST :
46
+ resid = (computeQpValue () - _u_old ) / _dt ;
47
+ resid /= - _mass_diag (dofnum );
48
+ break ;
33
49
34
- // Compute residual to enforce BC
35
- // This is the force required to enforce the BC in a central difference scheme
36
- Real avg_dt = (_dt + _dt_old ) / 2 ;
37
- Real resid = ( computeQpValue () - _u_old ) / ( avg_dt * _dt ) - ( _u_dot_old ) / avg_dt ;
38
- resid /= - _mass_diag ( dofnum ) ;
39
-
50
+ case DirectCentralDifference :: SECOND :
51
+ Real avg_dt = ( _dt + _dt_old ) / 2 ;
52
+ resid = (computeQpValue () - _u_old ) / ( avg_dt * _dt ) - ( _u_dot_old ) / avg_dt ;
53
+ resid /= - _mass_diag ( dofnum ) ;
54
+ break ;
55
+ }
40
56
return resid ;
41
57
}
58
+
59
+ void
60
+ DirectDirichletBCBase ::timestepSetup ()
61
+ {
62
+ // Now is the point that the time integrator has the variable time orders setup
63
+ _var_time_order = _exp_integrator -> findVariableTimeOrder (_var .number ());
64
+ }
0 commit comments