Semi-Lagrangian Library
Modular library for kinetic and gyrokinetic simulations of plasmas in fusion energy devices.
|
Particle pusher based on Hamiltonian splitting for 1d2v Vlasov-Maxwell in the momentum conserving, non-geometric form (see the reference)
MPI parallelization by domain cloning. Periodic boundaries. Spline DoFs numerated by the point the spline starts. Reference: Campos Pinto, Kormann, Sonnendrücker: Variational Framework for Structure-Preserving Electromagnetic Particle-In-Cell Methods, arXiv 2101.09247, 2021. Control variate: Note the we do not account for the analytic j at the moment (TODO: control_variate for current)
Derived types and interfaces | |
type | sll_t_time_propagator_pic_vm_1d2v_momentum |
Hamiltonian splitting type for Vlasov-Maxwell 1d2v. More... | |
Functions/Subroutines | |
subroutine | reinit_fields (self) |
Finalization. More... | |
subroutine | strang_splitting_pic_vm_1d2v (self, dt, number_steps) |
Strang splitting. More... | |
subroutine | lie_splitting_pic_vm_1d2v (self, dt, number_steps) |
Lie splitting. More... | |
subroutine | lie_splitting_back_pic_vm_1d2v (self, dt, number_steps) |
Lie splitting (oposite ordering) More... | |
subroutine | operatorhp1_pic_vm_1d2v (self, dt) |
Push Hp1: Equations to solve are \partial_t f + v_1 \partial_{x_1} f = 0 -> X_new = X_old + dt V_1 V_new,2 = V_old,2 + \int_0 h V_old,1 B_old \partial_t E_1 = - \int v_1 f(t,x_1, v) dv -> E_{1,new} = E_{1,old} - \int \int v_1 f(t,x_1+s v_1,v) dv ds \partial_t E_2 = 0 -> E_{2,new} = E_{2,old} \partial_t B = 0 => B_new = B_old. More... | |
subroutine | operatorhp2_pic_vm_1d2v (self, dt) |
Push Hp2: Equations to solve are X_new = X_old V_new,1 = V_old,1 + \int_0 h V_old,2 B_old \partial_t E_1 = 0 -> E_{1,new} = E_{1,old} \partial_t E_2 = - \int v_2 f(t,x_1, v) dv -> E_{2,new} = E_{2,old} - \int \int v_2 f(t,x_1+s v_1,v) dv ds \partial_t B = 0 => B_new = B_old. More... | |
subroutine | operatorhe_pic_vm_1d2v (self, dt) |
Push H_E: Equations to be solved \partial_t f + E_1 \partial_{v_1} f + E_2 \partial_{v_2} f = 0 -> V_new = V_old + dt * E \partial_t E_1 = 0 -> E_{1,new} = E_{1,old} \partial_t E_2 = 0 -> E_{2,new} = E_{2,old} \partial_t B + \partial_{x_1} E_2 = 0 => B_new = B_old - dt \partial_{x_1} E_2. More... | |
subroutine | operatorhb_pic_vm_1d2v (self, dt) |
Push H_B: Equations to be solved V_new = V_old \partial_t E_1 = 0 -> E_{1,new} = E_{1,old} \partial_t E_2 = - \partial_{x_1} B -> E_{2,new} = E_{2,old}-dt*\partial_{x_1} B \partial_t B = 0 -> B_new = B_old. More... | |
subroutine | initialize_pic_vm_1d2v (self, maxwell_solver, kernel_smoother_0, kernel_smoother_1, particle_group, efield_dofs, bfield_dofs, x_min, Lx, filter, jmean, control_variate, i_weight) |
Constructor. More... | |
subroutine | delete_pic_vm_1d2v (self) |
Destructor. More... | |
subroutine, public | sll_s_new_time_propagator_pic_vm_1d2v_momentum (splitting, maxwell_solver, kernel_smoother_0, kernel_smoother_1, particle_group, efield_dofs, bfield_dofs, x_min, Lx, filter, jmean, control_variate, i_weight) |
Constructor for allocatable abstract type. More... | |
subroutine, public | sll_s_new_time_propagator_pic_vm_1d2v_momentum_ptr (splitting, maxwell_solver, kernel_smoother_0, kernel_smoother_1, particle_group, efield_dofs, bfield_dofs, x_min, Lx, filter, jmean) |
Constructor for pointer abstract type. More... | |
|
private |
Destructor.
[in,out] | self | time splitting object |
Definition at line 502 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
|
private |
Constructor.
[out] | self | time splitting object |
[in] | maxwell_solver | Maxwell solver |
[in] | kernel_smoother_0 | Kernel smoother |
[in] | kernel_smoother_1 | Kernel smoother |
[in] | efield_dofs | array for the coefficients of the efields |
[in] | bfield_dofs | array for the coefficients of the bfield |
[in] | x_min | Lower bound of x domain |
[in] | lx | Length of the domain in x direction. |
[in] | control_variate | Control variate (if delta f) |
[in] | i_weight | Index of weight to be used by propagator |
Definition at line 412 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
|
private |
Lie splitting (oposite ordering)
[in,out] | self | time splitting object |
[in] | dt | time step |
[in] | number_steps | number of time steps |
Definition at line 155 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
|
private |
Lie splitting.
[in,out] | self | time splitting object |
[in] | dt | time step |
[in] | number_steps | number of time steps |
Definition at line 137 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
|
private |
Push H_B: Equations to be solved V_new = V_old \partial_t E_1 = 0 -> E_{1,new} = E_{1,old} \partial_t E_2 = - \partial_{x_1} B -> E_{2,new} = E_{2,old}-dt*\partial_{x_1} B \partial_t B = 0 -> B_new = B_old.
[in,out] | self | time splitting object |
[in] | dt | time step |
Definition at line 397 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
|
private |
Push H_E: Equations to be solved \partial_t f + E_1 \partial_{v_1} f + E_2 \partial_{v_2} f = 0 -> V_new = V_old + dt * E \partial_t E_1 = 0 -> E_{1,new} = E_{1,old} \partial_t E_2 = 0 -> E_{2,new} = E_{2,old} \partial_t B + \partial_{x_1} E_2 = 0 => B_new = B_old - dt \partial_{x_1} E_2.
[in,out] | self | time splitting object |
[in] | dt | time step |
Definition at line 344 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
|
private |
Push Hp1: Equations to solve are \partial_t f + v_1 \partial_{x_1} f = 0 -> X_new = X_old + dt V_1 V_new,2 = V_old,2 + \int_0 h V_old,1 B_old \partial_t E_1 = - \int v_1 f(t,x_1, v) dv -> E_{1,new} = E_{1,old} - \int \int v_1 f(t,x_1+s v_1,v) dv ds \partial_t E_2 = 0 -> E_{2,new} = E_{2,old} \partial_t B = 0 => B_new = B_old.
[in,out] | self | time splitting object |
[in] | dt | time step |
Definition at line 179 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
|
private |
Push Hp2: Equations to solve are X_new = X_old V_new,1 = V_old,1 + \int_0 h V_old,2 B_old \partial_t E_1 = 0 -> E_{1,new} = E_{1,old} \partial_t E_2 = - \int v_2 f(t,x_1, v) dv -> E_{2,new} = E_{2,old} - \int \int v_2 f(t,x_1+s v_1,v) dv ds \partial_t B = 0 => B_new = B_old.
[in,out] | self | time splitting object |
[in] | dt | time step |
Definition at line 274 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
|
private |
Finalization.
[in,out] | self | time splitting object |
Definition at line 105 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
subroutine, public sll_m_time_propagator_pic_vm_1d2v_momentum::sll_s_new_time_propagator_pic_vm_1d2v_momentum | ( | class(sll_c_time_propagator_base), intent(out), allocatable | splitting, |
class(sll_c_maxwell_1d_base), intent(in), target | maxwell_solver, | ||
class(sll_c_particle_mesh_coupling_1d), intent(in), target | kernel_smoother_0, | ||
class(sll_c_particle_mesh_coupling_1d), intent(in), target | kernel_smoother_1, | ||
class(sll_t_particle_array), intent(in), target | particle_group, | ||
real(kind=f64), dimension(:,:), intent(in), target | efield_dofs, | ||
real(kind=f64), dimension(:), intent(in), target | bfield_dofs, | ||
real(kind=f64), intent(in) | x_min, | ||
real(kind=f64), intent(in) | Lx, | ||
type( sll_t_binomial_filter ), intent(in), target | filter, | ||
logical, intent(in), optional | jmean, | ||
class(sll_t_control_variates), intent(in), optional, target | control_variate, | ||
intent(in) | i_weight | ||
) |
Constructor for allocatable abstract type.
[out] | splitting | time splitting object |
[in] | maxwell_solver | Maxwell solver |
[in] | kernel_smoother_0 | Kernel smoother |
[in] | kernel_smoother_1 | Kernel smoother |
[in] | efield_dofs | array for the coefficients of the efields |
[in] | bfield_dofs | array for the coefficients of the bfield |
[in] | x_min | Lower bound of x domain |
[in] | lx | Length of the domain in x direction. |
[in] | jmean | Should jmean be substracted in Ampere's law? |
[in] | control_variate | Control variate (if delta f) |
Definition at line 519 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
subroutine, public sll_m_time_propagator_pic_vm_1d2v_momentum::sll_s_new_time_propagator_pic_vm_1d2v_momentum_ptr | ( | class(sll_c_time_propagator_base), intent(out), pointer | splitting, |
class(sll_c_maxwell_1d_base), intent(in), target | maxwell_solver, | ||
class(sll_c_particle_mesh_coupling_1d), intent(in), target | kernel_smoother_0, | ||
class(sll_c_particle_mesh_coupling_1d), intent(in), target | kernel_smoother_1, | ||
class(sll_t_particle_array), intent(in), target | particle_group, | ||
dimension(:,:), intent(in) | efield_dofs, | ||
dimension(:), intent(in) | bfield_dofs, | ||
intent(in) | x_min, | ||
intent(in) | Lx, | ||
type( sll_t_binomial_filter ), intent(in), target | filter, | ||
logical, intent(in), optional | jmean | ||
) |
Constructor for pointer abstract type.
[out] | splitting | time splitting object |
[in] | maxwell_solver | Maxwell solver |
[in] | kernel_smoother_0 | Kernel smoother |
[in] | kernel_smoother_1 | Kernel smoother |
[in] | jmean | Should jmean be substracted in Ampere's law? |
Definition at line 595 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.
|
private |
Strang splitting.
[in,out] | self | time splitting object |
[in] | dt | time step |
[in] | number_steps | number of time steps |
Definition at line 115 of file sll_m_time_propagator_pic_vm_1d2v_momentum.F90.