a variable step method with the "first same as last" (FSAL) property.
Cache the last f
and x
vectors to use for the next step.
The assumption is that the nature of the function has not changed since the last step. If it has, the user would need to manually call destroy_fsal_cache so that the previous point was not reused.
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
real(kind=wp), | private, | allocatable | :: | t_saved |
cached |
||
real(kind=wp), | private, | dimension(:), allocatable | :: | x_saved |
cached |
||
real(kind=wp), | private, | dimension(:), allocatable | :: | f_saved |
cached |
user-callable method to stop the integration
User-callable method to stop the integration.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_class), | intent(inout) | :: | me |
get status code and message
Get the status of an integration.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_class), | intent(in) | :: | me | |||
integer, | intent(out), | optional | :: | istatus |
status code ( |
|
character(len=:), | intent(out), | optional, | allocatable | :: | message |
status message |
Returns true if there was an error. Can use rk_class_status to get more info.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_class), | intent(in) | :: | me |
Returns the properties of the method.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_class), | intent(in) | :: | me |
properties of the method
initialize the class (set n,f, and report)
Initialize the rk_variable_step_class.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_variable_step_class), | intent(inout) | :: | me | |||
integer, | intent(in) | :: | n |
number of equations |
||
procedure(deriv_func) | :: | f |
derivative function |
|||
real(kind=wp), | intent(in), | optional, | dimension(:) | :: | rtol |
relative tolerance (if size=1,
then same tol used for all
equations). If not present, a default
of |
real(kind=wp), | intent(in), | optional, | dimension(:) | :: | atol |
absolute tolerance (if size=1,
then same tol used for all
equations). If not present, a default
of |
type(stepsize_class), | intent(in), | optional | :: | stepsize_method |
method for varying the step size |
|
integer, | intent(in), | optional | :: | hinit_method |
which method (1 or 2) to use for
automatic initial step size
computation.
1 = use |
|
procedure(report_func), | optional | :: | report |
for reporting the steps |
||
procedure(event_func), | optional | :: | g |
for stopping at an event |
||
logical, | intent(in), | optional | :: | stop_on_errors |
stop the program for any errors (default is False) |
|
integer, | intent(in), | optional | :: | max_number_of_steps |
max number of steps allowed |
|
integer, | intent(in), | optional | :: | report_rate |
how often to call report function:
|
|
class(root_method), | intent(in), | optional | :: | solver |
the root-finding method to use for even finding.
if not present, then |
Main integration routine for the rk_variable_step_class.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_variable_step_class), | intent(inout) | :: | me | |||
real(kind=wp), | intent(in) | :: | t0 |
initial time |
||
real(kind=wp), | intent(in), | dimension(:) | :: | x0 |
initial state |
|
real(kind=wp), | intent(in) | :: | h |
initial abs(time step) |
||
real(kind=wp), | intent(in) | :: | tf |
final time |
||
real(kind=wp), | intent(out), | dimension(:) | :: | xf |
final state |
Event-finding integration routine for the rk_variable_step_class. Integrates until g(t,x)=0, or until t=tf (whichever happens first).
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_variable_step_class), | intent(inout) | :: | me | |||
real(kind=wp), | intent(in) | :: | t0 |
initial time |
||
real(kind=wp), | intent(in), | dimension(me%n) | :: | x0 |
initial state |
|
real(kind=wp), | intent(in) | :: | h |
abs(time step) |
||
real(kind=wp), | intent(in) | :: | tmax |
max final time if event not located |
||
real(kind=wp), | intent(in) | :: | tol |
function tolerance for root finding |
||
real(kind=wp), | intent(out) | :: | tf |
actual final time reached |
||
real(kind=wp), | intent(out), | dimension(me%n) | :: | xf |
final state (at tf) |
|
real(kind=wp), | intent(out) | :: | gf |
g value at tf |
Return some info about the integration.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_variable_step_class), | intent(in) | :: | me | |||
integer, | intent(out), | optional | :: | num_steps |
number of steps taken |
|
integer, | intent(out), | optional | :: | num_rejected_steps |
number of rejected steps |
|
real(kind=wp), | intent(out), | optional | :: | last_accepted_step_size |
the last accepted step size
|
Destructor for the FSAL variables.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_variable_step_fsal_class), | intent(inout) | :: | me |
Check the FSAL cache.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_variable_step_fsal_class), | intent(inout) | :: | me | |||
real(kind=wp), | intent(in) | :: | t | |||
real(kind=wp), | intent(in), | dimension(:) | :: | x | ||
real(kind=wp), | intent(out), | dimension(:) | :: | f |
Compute the function and add it to the FSAL cache.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rk_variable_step_fsal_class), | intent(inout) | :: | me | |||
real(kind=wp), | intent(in) | :: | t | |||
real(kind=wp), | intent(in), | dimension(:) | :: | x | ||
real(kind=wp), | intent(out), | dimension(:) | :: | f |
type,extends(rk_variable_step_class),abstract,public :: rk_variable_step_fsal_class !! a variable step method with the "first same as last" (FSAL) property. !! Cache the last `f` and `x` vectors to use for the next step. !! !! The assumption is that the nature of the !! function has not changed since the last step. !! If it has, the user would need to manually call [[destroy_fsal_cache]] !! so that the previous point was not reused. private real(wp),allocatable :: t_saved !! cached `t` real(wp),dimension(:),allocatable :: x_saved !! cached `x` real(wp),dimension(:),allocatable :: f_saved !! cached `f` contains private procedure,public :: destroy_fsal_cache procedure,public :: check_fsal_cache procedure,public :: set_fsal_cache end type rk_variable_step_fsal_class