foodie_integrator_adams_bashforth_moulton Module

module~~foodie_integrator_adams_bashforth_moulton~~UsesGraph module~foodie_integrator_adams_bashforth_moulton foodie_integrator_adams_bashforth_moulton module~foodie_integrator_adams_bashforth foodie_integrator_adams_bashforth module~foodie_integrator_adams_bashforth->module~foodie_integrator_adams_bashforth_moulton module~foodie_error_codes foodie_error_codes module~foodie_error_codes->module~foodie_integrator_adams_bashforth_moulton module~foodie_error_codes->module~foodie_integrator_adams_bashforth module~foodie_integrator_adams_moulton foodie_integrator_adams_moulton module~foodie_error_codes->module~foodie_integrator_adams_moulton module~foodie_integrator_multistep_object foodie_integrator_multistep_object module~foodie_integrator_multistep_object->module~foodie_integrator_adams_bashforth_moulton module~foodie_integrator_multistep_object->module~foodie_integrator_adams_bashforth module~foodie_integrator_multistep_object->module~foodie_integrator_adams_moulton module~foodie_integrator_adams_moulton->module~foodie_integrator_adams_bashforth_moulton module~foodie_integrand_object foodie_integrand_object module~foodie_integrand_object->module~foodie_integrator_adams_bashforth_moulton module~foodie_integrand_object->module~foodie_integrator_adams_bashforth module~foodie_integrand_object->module~foodie_integrator_multistep_object module~foodie_integrand_object->module~foodie_integrator_adams_moulton penf penf penf->module~foodie_integrator_adams_bashforth_moulton penf->module~foodie_integrator_adams_bashforth penf->module~foodie_error_codes penf->module~foodie_integrator_multistep_object penf->module~foodie_integrator_adams_moulton penf->module~foodie_integrand_object module~foodie_integrator_object foodie_integrator_object penf->module~foodie_integrator_object module~foodie_integrator_object->module~foodie_integrator_adams_bashforth_moulton module~foodie_integrator_object->module~foodie_integrator_adams_bashforth module~foodie_integrator_object->module~foodie_integrator_multistep_object module~foodie_integrator_object->module~foodie_integrator_adams_moulton iso_fortran_env iso_fortran_env iso_fortran_env->module~foodie_integrator_multistep_object iso_fortran_env->module~foodie_integrator_object
Help

FOODIE integrator: provide a predictor-corrector class of Adams-Bashforth-Moutlon multi-step schemes, from 1st to 4rd order accurate.

Considering the following ODE system:

$$ U_t = R(t,U) $$

where \(U_t = \frac{dU}{dt}\), U is the vector of state variables being a function of the time-like independent variable t, R is the (vectorial) residual function, the Adams-Bashforth-Moulton class scheme implemented is:

predictor

$$ U^{n+N_s^p} = U^{n+N_s^p-1} +\Delta t \left[ \sum_{s=1}^{N_s^p}{ b_s^p \cdot R(t^{n+s-1}, U^{n+s-1}) } \right] $$

corrector

$$ U^{n+N_s^c} = U^{n+N_s^c-1} +\Delta t \left[ \sum_{s=0}^{N_s^c}{ b_s^c \cdot R(t^{n+s}, U^{n+s}) } \right] $$

where \(N_s^p\) is the number of previous steps considered for the predictor and \(N_s^c\) is the number of previous steps considered for the corrector.

The coefficients \(b_s^{p,c}\) define the actual scheme, that is selected accordingly to the number of steps used. The predictor and corrector schemes should have the same formal order of accuracy, thus \(N_s^p=N_s^c+1\) should hold.

Currently, the following schemes are available:

P=AB(1)-C=AM(0) step, Explicit/Implicit Farward/Backward Euler, 1st order

This scheme is TVD and reverts to Explicit/Implicit Farward/Backward Euler, it being 1st order. The b coefficient is: $$b^p = \left[b_1\right] = \left[1\right]$$ $$b^c = \left[b_0\right] = \left[1\right]$$ The scheme is: $$ U^{n+1,p} = U^{n} + \Delta t R(t^{n},U^{n}) $$ $$ U^{n+1,c} = U^{n} + \Delta t R(t^{n+1},U^{n+1,p}) $$

P=AB(2)-C=AM(1) steps

This scheme is 2nd order. The b coefficients are: $$b^p = \left[ {\begin{array}{*{20}{c}} b_1 & b_2 \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} -\frac{1}{2} & \frac{3}{2} \end{array}} \right]$$ $$b^c = \left[ {\begin{array}{*{20}{c}} b_0 & b_1 \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} \frac{1}{2} & \frac{1}{2} \end{array}} \right]$$ The scheme is: $$ U^{n+2,p} = U^{n+1} +\Delta t \left[ \frac{3}{2} R(t^{n+1}, U^{n+1})-\frac{1}{2} R(t^{n}, U^{n}) \right] $$ $$ U^{n+2,c} = U^{n+1} +\Delta t \left[ \frac{1}{2} R(t^{n+2,p}, U^{n+2})+\frac{1}{2} R(t^{n+1}, U^{n+1}) \right] $$

P=AB(3)-C=AM(2) steps

This scheme is 3rd order. The b coefficients are: $$b^p = \left[ {\begin{array}{*{20}{c}} b_1 & b_2 & b_3 \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} \frac{5}{12} & -\frac{4}{3} & \frac{23}{12} \end{array}} \right]$$ $$b^c = \left[ {\begin{array}{*{20}{c}} b_0 & b_1 & b_2 \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} -\frac{1}{12} & \frac{2}{3} & \frac{5}{12} \end{array}} \right]$$ The scheme is: $$ U^{n+3,p} = U^{n+2} +\Delta t \left[ \frac{23}{12}R(t^{n+2}, U^{n+2}) - \frac{4}{3}R(t^{n+1}, U^{n+1}) +\frac{5}{12} R(t^{n}, U^{n}) \right] $$ $$ U^{n+3,c} = U^{n+2} +\Delta t \left[ \frac{5}{12}R(t^{n+3}, U^{n+3,p}) + \frac{2}{3}R(t^{n+2}, U^{n+2}) -\frac{1}{12} R(t^{n+1}, U^{n+1}) \right] $$

P=AB(4)-C=AM(3) steps

This scheme is 4th order. The b coefficients are: $$b^p = \left[ {\begin{array}{*{20}{c}} b_1 & b_2 & b_3 & b_4 \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} -\frac{9}{24} & \frac{37}{24} & -\frac{59}{24} & \frac{55}{24} \end{array}} \right]$$ $$b^c = \left[ {\begin{array}{*{20}{c}} b_0 & b_1 & b_2 & b_3 \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} \frac{1}{24} & -\frac{5}{24} & \frac{19}{24} & \frac{9}{24} \end{array}} \right]$$ The scheme is: $$ U^{n+4,p} = U^{n+3} +\Delta t \left[ \frac{55}{24}R(t^{n+3}, U^{n+3}) - \frac{59}{24}R(t^{n+2}, U^{n+2}) +\frac{37}{24} R(t^{n+1}, U^{n+1}) - \frac{9}{24} R(t^{n}, U^{n}) \right] $$ $$ U^{n+4,c} = U^{n+3} +\Delta t \left[ \frac{9}{24}R(t^{n+4}, U^{n+4,p}) + \frac{19}{24}R(t^{n+3}, U^{n+3}) -\frac{5}{24} R(t^{n+2}, U^{n+2}) + \frac{1}{24} R(t^{n+1}, U^{n+1}) \right] $$

Bibliography

Used By

module~~foodie_integrator_adams_bashforth_moulton~~UsedByGraph module~foodie_integrator_adams_bashforth_moulton foodie_integrator_adams_bashforth_moulton module~foodie foodie module~foodie_integrator_adams_bashforth_moulton->module~foodie program~integrate_burgers integrate_burgers module~foodie->program~integrate_burgers program~integrate_lorenz integrate_lorenz module~foodie->program~integrate_lorenz module~type_euler_1d type_euler_1D module~foodie->module~type_euler_1d module~foodie_test_integrand_tester_object foodie_test_integrand_tester_object module~foodie->module~foodie_test_integrand_tester_object module~foodie_test_lcce_test foodie_test_lcce_test module~foodie->module~foodie_test_lcce_test module~type_euler_1d_openmp type_euler_1D_openmp module~foodie->module~type_euler_1d_openmp program~integrate_euler_1d_caf~2 integrate_euler_1D_caf module~foodie->program~integrate_euler_1d_caf~2 module~foodie_test_oscillation_test foodie_test_oscillation_test module~foodie->module~foodie_test_oscillation_test program~integrate_euler_1d integrate_euler_1D module~foodie->program~integrate_euler_1d module~foodie_test_object foodie_test_object module~foodie->module~foodie_test_object module~foodie_test_integrand_oscillation foodie_test_integrand_oscillation module~foodie->module~foodie_test_integrand_oscillation module~foodie_test_integrand_lcce foodie_test_integrand_lcce module~foodie->module~foodie_test_integrand_lcce module~type_euler_1d_caf type_euler_1D_caf module~foodie->module~type_euler_1d_caf module~type_burgers type_burgers module~foodie->module~type_burgers module~foodie_test_integrand_ladvection foodie_test_integrand_ladvection module~foodie->module~foodie_test_integrand_ladvection program~integrate_euler_1d_openmp integrate_euler_1D_openmp module~foodie->program~integrate_euler_1d_openmp module~type_lorenz type_lorenz module~foodie->module~type_lorenz module~type_euler_1d->program~integrate_euler_1d module~foodie_test_integrand_tester_object->module~foodie_test_object module~foodie_test_integrand_tester_object->module~foodie_test_integrand_oscillation module~foodie_test_integrand_tester_object->module~foodie_test_integrand_lcce module~foodie_test_integrand_tester_object->module~foodie_test_integrand_ladvection program~foodie_test_lcce foodie_test_lcce module~foodie_test_lcce_test->program~foodie_test_lcce module~type_euler_1d_openmp->program~integrate_euler_1d_openmp program~foodie_test_oscillation foodie_test_oscillation module~foodie_test_oscillation_test->program~foodie_test_oscillation program~foodie_tester foodie_tester module~foodie_test_object->program~foodie_tester module~foodie_test_integrand_oscillation->module~foodie_test_oscillation_test module~foodie_test_integrand_oscillation->module~foodie_test_object module~foodie_test_integrand_lcce->module~foodie_test_lcce_test module~foodie_test_integrand_lcce->module~foodie_test_object module~type_euler_1d_caf->program~integrate_euler_1d_caf~2 module~type_burgers->program~integrate_burgers module~foodie_test_integrand_ladvection->module~foodie_test_object module~type_lorenz->program~integrate_lorenz
Help


Variables

TypeVisibility AttributesNameInitial
character(len=99), private, parameter:: class_name_ ='adams_bashforth_moulton'

Name of the class of schemes.

logical, private, parameter:: has_fast_mode_ =.true.

Flag to check if integrator provides fast mode integrate.

character(len=99), private, parameter:: supported_schemes_(1:16) =[trim(class_name_)//'_1 ', trim(class_name_)//'_2 ', trim(class_name_)//'_3 ', trim(class_name_)//'_4 ', trim(class_name_)//'_5 ', trim(class_name_)//'_6 ', trim(class_name_)//'_7 ', trim(class_name_)//'_8 ', trim(class_name_)//'_9 ', trim(class_name_)//'_10', trim(class_name_)//'_11', trim(class_name_)//'_12', trim(class_name_)//'_13', trim(class_name_)//'_14', trim(class_name_)//'_15', trim(class_name_)//'_16']

List of supported schemes.


Derived Types

FOODIE integrator: provide an explicit class of Adams-Bashforth-Moulton multi-step schemes, from 1st to 4rd order accurate.

Components

TypeVisibility AttributesNameInitial
real(kind=R_P), public, allocatable:: Dt(:)

Previous time steps.

logical, public :: autoupdate

Perform cyclic autoupdate of previous time steps buffers.

class(integrand_object), public, allocatable:: buffer

Buffer used for fast integration.

type(integrator_adams_moulton), private :: corrector

Corrector solver.

character(len=:), public, allocatable:: description_

Informative description of the integrator.

integer(kind=I_P), public :: error =0

Error status code.

character(len=:), public, allocatable:: error_message

Error message, hopefully meaningful.

integer(kind=I_P), public :: iterations

Implicit iterations.

type(integrator_adams_bashforth), private :: predictor

Predictor solver.

class(integrand_object), public, allocatable:: previous(:)

Previous steps.

integer(kind=I_P), public :: registers

Number of registers used for steps.

integer(kind=I_P), public :: steps

Number of time steps.

real(kind=R_P), public, allocatable:: t(:)

Previous times.

Type-Bound Procedures

procedure, public, pass(self) :: allocate_integrand_members

Allocate integrand members.

procedure, public, pass(lhs) :: assign_abstract

Assign ony members of abstract integrator_object type.

procedure, public, pass(lhs) :: assign_multistep

Assign members of integrator_multistep_object and parents.

generic, public :: assignment(=) => integr_assign_integr

Overload =.

procedure, public, pass(self) :: check_error

Check for error occurrencies.

procedure, public, pass(self) :: class_name

Return the class name of schemes.

procedure, public, pass(self) :: description

Return informative integrator description.

procedure, public, pass(self) :: destroy

Destroy the integrator.

procedure, public, pass(self) :: destroy_abstract

Destroy only members of abstract integrator_object type.

procedure, public, pass(self) :: destroy_multistep

Destroy the integrator.

procedure, public, pass(self) :: has_fast_mode

Return .true. if the integrator class has fast mode integrate.

procedure, public, pass(self) :: initialize

Initialize (create) the integrator.

procedure, public, pass(lhs) :: integr_assign_integr

Operator =.

procedure, public, pass(self) :: integrate

Integrate integrand field.

procedure, public, pass(self) :: integrate_fast

Integrate integrand field.

procedure, public, pass(self) :: is_multistage

Return .true. for multistage integrator.

procedure, public, pass(self) :: is_multistep

Return .true. for multistep integrator.

procedure, public, pass(self) :: is_supported

Return .true. if the integrator class support the given scheme.

procedure, public, pass(self) :: scheme_number

Return the scheme number in the list of supported schemes.

procedure, public, pass(self) :: stages_number

Return number of stages used.

procedure, public, pass(self) :: steps_number

Return number of steps used.

procedure, public, pass(self) :: supported_schemes

Return the list of supported schemes.

procedure, public, pass(self) :: trigger_error

Trigger an error.

procedure, public, nopass :: update_previous

Cyclic update previous time steps.


Functions

private pure function class_name(self)

Return the class name of schemes.

Arguments

Type IntentOptional AttributesName
class(integrator_adams_bashforth_moulton), intent(in) :: self

Integrator.

Return Value character(len=99)

Class name.

private elemental function has_fast_mode(self)

Return .true. if the integrator class has fast mode integrate.

Arguments

Type IntentOptional AttributesName
class(integrator_adams_bashforth_moulton), intent(in) :: self

Integrator.

Return Value logical

Inquire result.

private elemental function is_supported(self, scheme)

Return .true. if the integrator class support the given scheme.

Arguments

Type IntentOptional AttributesName
class(integrator_adams_bashforth_moulton), intent(in) :: self

Integrator.

character(len=*), intent(in) :: scheme

Selected scheme.

Return Value logical

Inquire result.

private elemental function scheme_number(self, scheme)

Return the scheme number in the list of supported schemes.

Arguments

Type IntentOptional AttributesName
class(integrator_adams_bashforth_moulton), intent(in) :: self

Integrator.

character(len=*), intent(in) :: scheme

Selected scheme.

Return Value integer(kind=I_P)

Scheme number in the list of supported schemes.

private pure function supported_schemes(self) result(schemes)

Return the list of supported schemes.

Arguments

Type IntentOptional AttributesName
class(integrator_adams_bashforth_moulton), intent(in) :: self

Integrator.

Return Value character(len=99), allocatable, (:)

Queried scheme.


Subroutines

private elemental subroutine destroy(self)

Destroy the integrator.

Arguments

Type IntentOptional AttributesName
class(integrator_adams_bashforth_moulton), intent(inout) :: self

Integrator.

private subroutine initialize(self, scheme, iterations, autoupdate, U, stop_on_fail)

Create the actual Adams-Bashforth-Moulton integrator: initialize the b coefficients.

Arguments

Type IntentOptional AttributesName
class(integrator_adams_bashforth_moulton), intent(inout) :: self

Integrator.

character(len=*), intent(in) :: scheme

Selected scheme.

integer(kind=I_P), intent(in), optional :: iterations

Implicit iterations.

logical, intent(in), optional :: autoupdate

Enable cyclic autoupdate of previous time steps.

class(integrand_object), intent(in), optional :: U

Integrand molding prototype.

logical, intent(in), optional :: stop_on_fail

Stop execution if initialization fail.

private subroutine integr_assign_integr(lhs, rhs)

Operator =.

Arguments

Type IntentOptional AttributesName
class(integrator_adams_bashforth_moulton), intent(inout) :: lhs

Left hand side.

class(integrator_object), intent(in) :: rhs

Right hand side.

private subroutine integrate(self, U, Dt, t)

Integrate field with Adams-Bashforth-Moulton class scheme.

Arguments

Type IntentOptional AttributesName
class(integrator_adams_bashforth_moulton), intent(inout) :: self

Integrator.

class(integrand_object), intent(inout) :: U

Field to be integrated.

real(kind=R_P), intent(in) :: Dt

Time steps.

real(kind=R_P), intent(in) :: t

Times.

private subroutine integrate_fast(self, U, Dt, t)

Integrate field with Adams-Bashforth-Moulton class scheme, fast mode.

Arguments

Type IntentOptional AttributesName
class(integrator_adams_bashforth_moulton), intent(inout) :: self

Integrator.

class(integrand_object), intent(inout) :: U

Field to be integrated.

real(kind=R_P), intent(in) :: Dt

Time steps.

real(kind=R_P), intent(in) :: t

Times.