Semi-Lagrangian Library
Modular library for kinetic and gyrokinetic simulations of plasmas in fusion energy devices.
|
Base class of operator splitting library. It is only used with particle-in-cell method.
The operator splitting module provides a generic implementation of composition algorithms of different order for two operators T and V for solving \( \frac{dU}{dt} = (T+V) U \). The solution on one time step can be written \( U(\Delta t) = \mathcal{S}_{T+V} U(0) \). The composition algorithm consists in successive solutions of the split equations \( \frac{dU}{dt} = T U \) and \( \frac{dU}{dt} = V U \). Alternating the two reduced solution operators \( \mathcal{S}_{T} \) and \(\mathcal{S}_{V} \) with adequately chosen time increments yields arbitrary order in time for the full solution.
The application of an operator splitting method to a concrete problem is done by extending the sll_t_operator_splitting splitting base class by a new type containing on the one hand the data on which the operators act and a specific implementation of the two operators
Derived types and interfaces | |
type | sll_t_operator_splitting |
operator splitting object More... | |
Functions/Subroutines | |
subroutine | operator (this, dt) |
dummy implementation of an sll_t_operator_splitting needed to provide the interface. The class cannot be abstract because the splitting coefficients are initialised here as they are generic for any type of operator. More... | |
class(sll_t_operator_splitting) function, pointer | new_operator_splitting (split_case, split_step, nb_split_step, split_begin_T, dt) |
Returns a pointer to a heap-allocated sll_t_operator_splitting object. More... | |
subroutine, public | sll_s_operator_splitting_init (split, split_case, split_step, nb_split_step, split_begin_T, dt) |
Initialises data for operator splitting. More... | |
subroutine, public | sll_s_do_split_steps (split, dt, number_time_steps) |
Apply the composition method for given number of times steps. More... | |
Variables | |
integer(kind=i32), parameter | sll_user_defined = 0 |
user defined splitting More... | |
integer(kind=i32), parameter, public | sll_p_lie_tv = 1 |
Lie splitting T first (order 1) More... | |
integer(kind=i32), parameter, public | sll_p_lie_vt = 2 |
Lie splitting V first x (order 1) More... | |
integer(kind=i32), parameter, public | sll_p_strang_tvt = 3 |
Strang splitting T first (order 2) More... | |
integer(kind=i32), parameter, public | sll_p_strang_vtv = 4 |
Strang splitting V first (order 2) More... | |
integer(kind=i32), parameter, public | sll_p_triple_jump_tvt = 5 |
Triple jump splitting T first (order 4) More... | |
integer(kind=i32), parameter, public | sll_p_triple_jump_vtv = 6 |
Triple jump splitting V first (order 4) More... | |
integer(kind=i32), parameter, public | sll_p_order6_tvt = 7 |
Order 6 splitting T first (order 6) More... | |
integer(kind=i32), parameter, public | sll_p_order6_vtv = 8 |
Order 6 splitting V first (order 6) More... | |
integer(kind=i32), parameter | sll_order6vp_tvt = 9 |
Specific Vlasov-Poisson splitting T first (order 6) More... | |
integer(kind=i32), parameter | sll_order6vp_vtv = 10 |
Specific Vlasov-Poisson splitting V first (order 6) More... | |
integer(kind=i32), parameter | sll_order6vpnew_tvt = 11 |
Specific Vlasov-Poisson splitting T first (order 6) More... | |
integer(kind=i32), parameter | sll_order6vpnew1_vtv = 12 |
Specific Vlasov-Poisson splitting V first (order 6) More... | |
integer(kind=i32), parameter | sll_order6vpnew2_vtv = 13 |
Specific Vlasov-Poisson splitting V first (order 6) More... | |
integer(kind=i32), parameter | sll_order6vp2d_vtv = 14 |
Specific Vlasov-Poisson splitting V first (order 6) More... | |
integer(kind=i32), parameter | sll_order6vpot_vtv = 15 |
Specific Vlasov-Poisson splitting V first (order 6) More... | |
|
private |
Returns a pointer to a heap-allocated sll_t_operator_splitting object.
[in] | split_case | splitting method to be chosen among SLL_USER_DEFINED : user provides coefficients sll_p_lie_tv : first order Lie with T first sll_p_lie_vt : first order Lie with V first sll_p_strang_tvt : second order Strang with T first sll_p_strang_vtv : second order Strang with V first sll_p_triple_jump_tvt : fourth order triple jump with T first sll_p_triple_jump_vtv : fourth order triple jump with V first sll_p_order6_tvt : sixth order with T first sll_p_order6_vtv : sixth order with V first SLL_ORDER6VP_TVT : sixth order optimized for Vlasov-Poisson with T first SLL_ORDER6VP_VTV : sixth order optimized for Vlasov-Poisson with V first SLL_ORDER6VPnew_TVT SLL_ORDER6VPnew1_VTV SLL_ORDER6VPnew2_VTV SLL_ORDER6VP2D_VTV SLL_ORDER6VPOT_VTV |
[in] | split_step | array containing splitting coefficients |
[in] | nb_split_step | number of split steps in the method |
[in] | split_begin_T | logical True if T first false else |
[in] | dt | time step |
Definition at line 126 of file sll_m_operator_splitting.F90.
|
private |
dummy implementation of an sll_t_operator_splitting needed to provide the interface. The class cannot be abstract because the splitting coefficients are initialised here as they are generic for any type of operator.
[in,out] | this | sll_t_operator_splitting object |
[in] | dt | time increment on which operator is applied |
Definition at line 88 of file sll_m_operator_splitting.F90.
subroutine, public sll_m_operator_splitting::sll_s_do_split_steps | ( | class(sll_t_operator_splitting) | split, |
real(kind=f64), intent(in) | dt, | ||
integer(kind=i32), intent(in) | number_time_steps | ||
) |
Apply the composition method for given number of times steps.
[in,out] | split | sll_t_operator_splitting object |
[in] | dt | : time step |
[in] | number_time_steps | : number of time steps to be performed |
Definition at line 514 of file sll_m_operator_splitting.F90.
subroutine, public sll_m_operator_splitting::sll_s_operator_splitting_init | ( | class(sll_t_operator_splitting) | split, |
integer(kind=i32), intent(in) | split_case, | ||
real(kind=f64), dimension(:), intent(in), optional | split_step, | ||
integer(kind=i32), intent(in), optional | nb_split_step, | ||
logical, intent(in), optional | split_begin_T, | ||
real(kind=f64), intent(in), optional | dt | ||
) |
Initialises data for operator splitting.
[in] | split | operator splitting object to be initialised |
[in] | split_case | splitting method to be chosen among SLL_USER_DEFINED : user provides coefficients sll_p_lie_tv : first order Lie with T first sll_p_lie_vt : first order Lie with V first sll_p_strang_tvt : second order Strang with T first sll_p_strang_vtv : second order Strang with V first sll_p_triple_jump_tvt : fourth order triple jump with T first sll_p_triple_jump_vtv : fourth order triple jump with V first sll_p_order6_tvt : sixth order with T first sll_p_order6_vtv : sixth order with V first SLL_ORDER6VP_TVT : sixth order optimized for Vlasov-Poisson with T first SLL_ORDER6VP_VTV : sixth order optimized for Vlasov-Poisson with V first SLL_ORDER6VPnew_TVT SLL_ORDER6VPnew1_VTV SLL_ORDER6VPnew2_VTV SLL_ORDER6VP2D_VTV SLL_ORDER6VPOT_VTV |
[in] | split_step | array containing splitting coefficients |
[in] | nb_split_step | number of split steps in the method |
[in] | split_begin_T | logical True if T first false else |
[in] | dt | time step |
Definition at line 175 of file sll_m_operator_splitting.F90.
|
private |
Specific Vlasov-Poisson splitting V first (order 6)
Definition at line 59 of file sll_m_operator_splitting.F90.
|
private |
Specific Vlasov-Poisson splitting T first (order 6)
Definition at line 54 of file sll_m_operator_splitting.F90.
|
private |
Specific Vlasov-Poisson splitting V first (order 6)
Definition at line 55 of file sll_m_operator_splitting.F90.
|
private |
Specific Vlasov-Poisson splitting V first (order 6)
Definition at line 57 of file sll_m_operator_splitting.F90.
|
private |
Specific Vlasov-Poisson splitting V first (order 6)
Definition at line 58 of file sll_m_operator_splitting.F90.
|
private |
Specific Vlasov-Poisson splitting T first (order 6)
Definition at line 56 of file sll_m_operator_splitting.F90.
|
private |
Specific Vlasov-Poisson splitting V first (order 6)
Definition at line 60 of file sll_m_operator_splitting.F90.
integer(kind=i32), parameter, public sll_p_lie_tv = 1 |
Lie splitting T first (order 1)
Definition at line 46 of file sll_m_operator_splitting.F90.
integer(kind=i32), parameter, public sll_p_lie_vt = 2 |
Lie splitting V first x (order 1)
Definition at line 47 of file sll_m_operator_splitting.F90.
integer(kind=i32), parameter, public sll_p_order6_tvt = 7 |
Order 6 splitting T first (order 6)
Definition at line 52 of file sll_m_operator_splitting.F90.
integer(kind=i32), parameter, public sll_p_order6_vtv = 8 |
Order 6 splitting V first (order 6)
Definition at line 53 of file sll_m_operator_splitting.F90.
integer(kind=i32), parameter, public sll_p_strang_tvt = 3 |
Strang splitting T first (order 2)
Definition at line 48 of file sll_m_operator_splitting.F90.
integer(kind=i32), parameter, public sll_p_strang_vtv = 4 |
Strang splitting V first (order 2)
Definition at line 49 of file sll_m_operator_splitting.F90.
integer(kind=i32), parameter, public sll_p_triple_jump_tvt = 5 |
Triple jump splitting T first (order 4)
Definition at line 50 of file sll_m_operator_splitting.F90.
integer(kind=i32), parameter, public sll_p_triple_jump_vtv = 6 |
Triple jump splitting V first (order 4)
Definition at line 51 of file sll_m_operator_splitting.F90.
|
private |
user defined splitting
Definition at line 45 of file sll_m_operator_splitting.F90.