10 #include "sll_assert.h"
11 #include "sll_memory.h"
12 #include "sll_working_precision.h"
59 sll_int32 :: spline_degree
64 sll_real64 :: cell_integrals_0(4)
65 sll_real64 :: cell_integrals_1(3)
68 sll_real64,
pointer :: efield_dofs(:,:)
69 sll_real64,
pointer :: bfield_dofs(:)
70 sll_real64,
allocatable :: j_dofs(:,:)
71 sll_real64,
allocatable :: j_dofs_local(:,:)
72 sll_real64,
allocatable :: rho_dofs_local(:)
73 sll_int32 :: n_species
75 logical :: jmean = .false.
76 sll_real64,
allocatable :: efield_filter(:,:)
77 sll_real64,
allocatable :: bfield_filter(:)
78 sll_real64,
allocatable :: bfield_dofs_old(:)
86 sll_int32 :: n_sub_iter = 4
87 sll_int32 :: n_max_iter = 50
88 sll_real64 :: tolerance = 1d-10
90 sll_int32 :: file_id_rho
110 call self%filter%apply( self%efield_dofs(:,1), self%efield_filter(:,1) )
111 call self%filter%apply( self%efield_dofs(:,2), self%efield_filter(:,2) )
112 call self%filter%apply( self%bfield_dofs, self%bfield_filter )
119 sll_real64,
intent(in) :: dt
120 sll_int32,
intent(in) :: number_steps
125 do i_step = 1, number_steps
126 call self%operatorall( dt )
134 sll_real64,
intent(in) :: dt
135 sll_int32,
intent(in) :: number_steps
139 do i_step = 1,number_steps
140 call self%operatorall( dt )
149 sll_real64,
intent(in) :: dt
150 sll_int32,
intent(in) :: number_steps
154 do i_step = 1,number_steps
155 call self%operatorall( dt )
166 sll_real64,
intent(in) :: dt
170 sll_real64 :: x_new(3), vi(3), wi(1), x_old(3), wp(3), x_future(3), v_new(3), v_nnew(3)
171 sll_int32 :: n_cells, i_sp
173 sll_real64 :: efield(2), bfield_old, bfield_new
174 sll_real64 :: residual
175 sll_int32 :: n_iter, n_iter_mean
179 dtau = dt/real(self%n_sub_iter,f64)
183 n_cells = self%kernel_smoother_0%n_dofs
185 self%j_dofs_local = 0.0_f64
188 self%bfield_dofs_old = self%bfield_dofs
189 call self%maxwell_solver%compute_B_from_E( &
190 dt, self%efield_dofs(:,2), self%bfield_dofs)
191 call self%filter%apply( self%bfield_dofs, self%bfield_filter )
193 call self%filter%apply( self%efield_dofs(:,1), self%efield_filter(:,1) )
194 call self%filter%apply( self%efield_dofs(:,2), self%efield_filter(:,2) )
198 do i_sp = 1,self%n_species
199 qoverm = self%particle_group%group(i_sp)%species%q_over_m();
200 do i_part=1,self%particle_group%group(i_sp)%n_particles
202 x_new = self%particle_group%group(i_sp)%get_x(i_part)
203 vi = self%particle_group%group(i_sp)%get_v(i_part)
206 wi = self%particle_group%group(i_sp)%get_charge(i_part, self%i_weight)
209 x_old = x_new - dtau * vi
214 call self%kernel_smoother_1%evaluate &
215 (x_new(1), self%efield_filter(:,1), efield(1))
216 call self%kernel_smoother_0%evaluate &
217 (x_new(1), self%efield_filter(:,2), efield(2))
218 select type ( q=> self%kernel_smoother_1 )
220 call q%evaluate_int_quad( x_old(1), x_new(1), self%bfield_dofs_old, bfield_old )
223 efield(1) = qoverm * ( dt * efield(1) + dtau * vi(2) * bfield_old )
224 efield(2) = qoverm * ( dt * efield(2) - dtau * vi(1) * bfield_old )
227 v_new(1) = vi(1) + efield(1) + qoverm * dtau * vi(2) * bfield_old
228 v_new(2) = vi(2) + efield(2) - qoverm * dtau * vi(1) * bfield_old
230 x_future = x_new + dtau * v_new
235 do while( residual > self%tolerance .and. n_iter < self%n_max_iter )
237 select type ( q=> self%kernel_smoother_1 )
239 call q%evaluate_int_quad( x_future(1), x_new(1), self%bfield_filter, bfield_new )
242 v_nnew(1) = vi(1) + efield(1) + qoverm * dtau * v_new(2) * bfield_new
243 v_nnew(2) = vi(2) + efield(2) - qoverm * dtau * v_new(1) * bfield_new
244 x_future = x_new + dtau * v_nnew
245 residual = max( abs( v_new(1)-v_nnew(1) ), abs( v_new(2) - v_nnew(2) ) )
249 if ( n_iter .eq. self%n_max_iter )
then
250 print*,
'First iteration did not converge. Residual:', residual
252 n_iter_mean = n_iter_mean + n_iter
255 if (abs(v_new(1))> 1e-16_f64)
then
257 call self%kernel_smoother_1%add_current( x_new, x_future, wi(1), self%j_dofs_local(:,1 ) )
260 select type ( q=> self%kernel_smoother_0 )
262 call q%add_charge_int( x_new, x_future, wi(1)*v_new(2)*dtau, self%j_dofs_local(:,2 ) )
265 do iter=2,self%n_sub_iter
273 select type ( q=> self%kernel_smoother_1 )
275 call q%evaluate_int_quad( x_old(1), x_new(1), self%bfield_filter, bfield_old )
278 efield(1) = qoverm * dtau * ( vi(2) * bfield_old )
279 efield(2) = qoverm * dtau * (- vi(1) * bfield_old )
282 v_new(1) = vi(1) + efield(1) + qoverm * dtau * vi(2) * bfield_old
283 v_new(2) = vi(2) + efield(2) - qoverm * dtau * vi(1) * bfield_old
284 x_future = x_new + dtau * v_new
289 do while( residual > self%tolerance .and. n_iter < self%n_max_iter )
291 select type ( q=> self%kernel_smoother_1 )
293 call q%evaluate_int_quad( x_future(1), x_new(1), self%bfield_filter, bfield_new )
295 v_nnew(1) = vi(1) + efield(1) + qoverm * dtau * v_new(2) * bfield_new
296 v_nnew(2) = vi(2) + efield(2) - qoverm * dtau * v_new(1) * bfield_new
297 x_future = x_new + dtau * v_nnew
298 residual = max( abs(v_new(1)-v_nnew(1)), abs(v_new(2)-v_nnew(2)))
301 if ( n_iter .eq. self%n_max_iter )
then
302 print*,
'Second iteration did not converge. Residual:', residual, self%tolerance
304 n_iter_mean = n_iter_mean + n_iter
307 if (abs(v_new(1))> 1e-16_f64)
then
309 call self%kernel_smoother_1%add_current( x_new, x_future, wi(1), self%j_dofs_local(:,1 ) )
311 select type ( q=> self%kernel_smoother_0 )
313 call q%add_charge_int( x_new, x_future, wi(1)*v_new(2)*dtau, self%j_dofs_local(:,2 ) )
317 x_new(1) = modulo(x_future(1), self%Lx)
318 call self%particle_group%group(i_sp)%set_x(i_part, x_new)
319 call self%particle_group%group(i_sp)%set_v(i_part, v_new)
321 if (self%particle_group%group(i_sp)%n_weights == 3)
then
323 wp = self%particle_group%group(i_sp)%get_weights(i_part)
324 wp(3) = self%control_variate%cv(i_sp)%update_df_weight( x_new(1:1), vi(1:2), 0.0_f64, wp(1), wp(2))
325 call self%particle_group%group(i_sp)%set_weights(i_part, wp)
331 write(self%file_id,*) real(n_iter_mean, f64)/real(self%particle_group%group(1)%n_particles,f64)/real(self%n_sub_iter,f64)
333 self%j_dofs = 0.0_f64
336 n_cells, mpi_sum, self%j_dofs(:,1))
338 n_cells, mpi_sum, self%j_dofs(:,2))
340 call self%filter%apply_inplace( self%j_dofs(:,1) )
341 call self%filter%apply_inplace( self%j_dofs(:,2) )
343 if ( self%jmean .eqv. .true. )
then
344 self%j_dofs(:,1) = self%j_dofs(:,1) - sum(self%j_dofs(:,1))/real(self%kernel_smoother_0%n_dofs, f64)
345 self%j_dofs(:,2) = self%j_dofs(:,2) - sum(self%j_dofs(:,2))/real(self%kernel_smoother_1%n_dofs, f64)
349 call self%maxwell_solver%compute_E_from_j(self%j_dofs(:,1), 1, self%efield_dofs(:,1))
350 call self%maxwell_solver%compute_E_from_j(self%j_dofs(:,2), 2, self%efield_dofs(:,2))
352 call self%maxwell_solver%compute_E_from_B(&
353 dt, self%bfield_dofs, self%efield_dofs(:,2))
362 sll_real64,
intent(in) :: dt
366 sll_real64 :: x_new(3), vi(3), wi(1), x_old(3), wp(3), x_future(3), v_new(3), v_nnew(3)
367 sll_int32 :: n_cells, i_sp
369 sll_real64 :: efield(2), bfield_old, bfield_new
370 sll_real64 :: residual
371 sll_int32 :: n_iter, n_iter_mean
374 sll_real64 :: gamma, residuum(2)
375 sll_real64 :: df11, df12, df21, df22, det
377 dtau = dt/real(self%n_sub_iter,f64)
381 n_cells = self%kernel_smoother_0%n_dofs
383 self%j_dofs_local = 0.0_f64
384 self%rho_dofs_local = 0.0_f64
387 self%bfield_dofs_old = self%bfield_dofs
388 call self%maxwell_solver%compute_B_from_E( &
389 dt, self%efield_dofs(:,2), self%bfield_dofs)
390 call self%filter%apply( self%bfield_dofs, self%bfield_filter )
392 call self%filter%apply( self%efield_dofs(:,1), self%efield_filter(:,1) )
393 call self%filter%apply( self%efield_dofs(:,2), self%efield_filter(:,2) )
397 do i_sp = 1,self%n_species
398 qoverm = self%particle_group%group(i_sp)%species%q_over_m();
399 do i_part=1,self%particle_group%group(i_sp)%n_particles
401 x_new = self%particle_group%group(i_sp)%get_x(i_part)
402 vi = self%particle_group%group(i_sp)%get_v(i_part)
405 wi = self%particle_group%group(i_sp)%get_charge(i_part, self%i_weight)
408 x_old = x_new - dtau * vi
413 call self%kernel_smoother_1%evaluate &
414 (x_new(1), self%efield_filter(:,1), efield(1))
415 call self%kernel_smoother_0%evaluate &
416 (x_new(1), self%efield_filter(:,2), efield(2))
417 select type ( q=> self%kernel_smoother_1 )
419 call q%evaluate_int_quad( x_old(1), x_new(1), self%bfield_dofs_old, bfield_old )
423 efield(1) = qoverm * ( dt * efield(1) + dtau * vi(2) * bfield_old )
424 efield(2) = qoverm * ( dt * efield(2) - dtau * vi(1) * bfield_old )
427 v_new(1) = vi(1) + efield(1) + qoverm * dtau * vi(2) * bfield_old
428 v_new(2) = vi(2) + efield(2) - qoverm * dtau * vi(1) * bfield_old
429 x_future = x_new + dtau * v_new
431 select type ( q=> self%kernel_smoother_1 )
433 call q%evaluate_int_quad( x_future(1), x_new(1), self%bfield_filter, bfield_new )
436 residuum(1) = v_new(1) - ( vi(1) + efield(1) + qoverm * dtau * v_new(2) * bfield_new )
437 residuum(2) = v_new(2) - ( vi(2) + efield(2) - qoverm * dtau * v_new(1) * bfield_new )
441 do while( residual > self%tolerance .and. n_iter < self%n_max_iter )
443 select type ( q=> self%kernel_smoother_1 )
445 call q%evaluate_int_subnewton( x_new(1), x_future(1), self%bfield_filter, gamma )
446 gamma = gamma * qoverm
449 df11 = 1.0_f64 - gamma * v_new(2)
450 df12 = - qoverm * dtau * bfield_new
451 df21 = ( qoverm * dtau * bfield_new + gamma * v_new(1) )
453 det = df11*df22- df12*df21
455 v_nnew(1) = v_new(1) - ( df22 * residuum(1) - df12 * residuum(2) )/det
456 v_nnew(2) = v_new(2) - ( - df21 * residuum(1) + df11 * residuum(2) )/det
458 x_future = x_new + dtau * v_nnew
460 select type ( q=> self%kernel_smoother_1 )
462 call q%evaluate_int_quad( x_future(1), x_new(1), self%bfield_filter, bfield_new )
465 residuum(1) = v_new(1) - ( vi(1) + efield(1) + qoverm * dtau * v_new(2) * bfield_new )
466 residuum(2) = v_new(2) - ( vi(2) + efield(2) - qoverm * dtau * v_new(1) * bfield_new )
467 residual = maxval( abs(residuum) )
469 v_nnew(1) = vi(1) + efield(1) + qoverm * dtau * v_new(2) * bfield_new
470 v_nnew(2) = vi(2) + efield(2) - qoverm * dtau * v_new(1) * bfield_new
472 x_future = x_new + dtau * v_nnew
474 if ( n_iter .eq. self%n_max_iter )
then
475 print*,
'First iteration did not converge. Residual:', residual
477 n_iter_mean = n_iter_mean + n_iter
480 if (abs(v_new(1))> 1e-16_f64)
then
482 call self%kernel_smoother_1%add_current( x_new, x_future, wi(1), self%j_dofs_local(:,1 ) )
483 call self%kernel_smoother_0%add_current( x_new, x_future, wi(1)*v_new(2)/v_new(1), self%j_dofs_local(:,2 ) )
488 do iter=2,self%n_sub_iter
496 select type ( q=> self%kernel_smoother_1 )
498 call q%evaluate_int_quad( x_old(1), x_new(1), self%bfield_filter, bfield_old )
510 efield(1) = qoverm * dtau * ( vi(2) * bfield_old )
511 efield(2) = qoverm * dtau * (- vi(1) * bfield_old )
514 v_new(1) = vi(1) + efield(1) + qoverm * dtau * vi(2) * bfield_old
515 v_new(2) = vi(2) + efield(2) - qoverm * dtau * vi(1) * bfield_old
516 x_future = x_new + dtau * v_new
519 select type ( q=> self%kernel_smoother_1 )
521 call q%evaluate_int_quad( x_future(1), x_new(1), self%bfield_filter, bfield_new )
524 residuum(1) = v_new(1) - ( vi(1) + efield(1) + qoverm * dtau * v_new(2) * bfield_new)
525 residuum(2) = v_new(2) - ( vi(2) + efield(2) - qoverm * dtau * v_new(1) * bfield_new )
528 do while( residual > self%tolerance .and. n_iter < self%n_max_iter )
530 select type ( q=> self%kernel_smoother_1 )
532 call q%evaluate_int_subnewton( x_new(1), x_future(1), self%bfield_filter, gamma )
533 gamma = gamma * qoverm
536 df11 = 1.0_f64 - gamma * v_new(2)
537 df12 = - qoverm * dtau * bfield_new
538 df21 = ( qoverm * dtau * bfield_new + gamma * v_new(1) )
540 det = df11*df22- df12*df21
542 v_nnew(1) = v_new(1) - ( df22 * residuum(1) - df12 * residuum(2) )/det
543 v_nnew(2) = v_new(2) - ( - df21 * residuum(1) + df11 * residuum(2) )/det
545 x_future = x_new + dtau * v_nnew
547 select type ( q=> self%kernel_smoother_1 )
549 call q%evaluate_int_quad( x_future(1), x_new(1), self%bfield_filter, bfield_new )
552 residuum(1) = v_new(1) - ( vi(1) + efield(1) + qoverm * dtau * v_new(2) * bfield_new )
553 residuum(2) = v_new(2) - ( vi(2) + efield(2) - qoverm * dtau * v_new(1) * bfield_new )
554 residual = maxval( abs(residuum) )
556 v_nnew(1) = vi(1) + efield(1) + qoverm * dtau * v_new(2) * bfield_new
557 v_nnew(2) = vi(2) + efield(2) - qoverm * dtau * v_new(1) * bfield_new
559 x_future = x_new + dtau * v_nnew
560 if ( n_iter .eq. self%n_max_iter )
then
561 print*,
'Second iteration did not converge. Residual:', residual, self%tolerance
563 n_iter_mean = n_iter_mean + n_iter
566 if (abs(v_new(1))> 1e-16_f64)
then
568 call self%kernel_smoother_1%add_current( x_new, x_future, wi(1), self%j_dofs_local(:,1 ) )
569 call self%kernel_smoother_0%add_current( x_new, x_future, wi(1)*v_new(2)/v_new(1), self%j_dofs_local(:,2 ) )
575 x_new(1) = modulo(x_future(1), self%Lx)
576 call self%particle_group%group(i_sp)%set_x(i_part, x_new)
577 call self%particle_group%group(i_sp)%set_v(i_part, v_new)
579 if (self%particle_group%group(i_sp)%n_weights == 3)
then
581 wp = self%particle_group%group(i_sp)%get_weights(i_part)
582 wp(3) = self%control_variate%cv(i_sp)%update_df_weight( x_new(1:1), vi(1:2), 0.0_f64, wp(1), wp(2))
583 call self%particle_group%group(i_sp)%set_weights(i_part, wp)
589 write(self%file_id,*) real(n_iter_mean, f64)/real(self%particle_group%group(1)%n_particles,f64)/real(self%n_sub_iter,f64)
602 self%j_dofs = 0.0_f64
605 n_cells, mpi_sum, self%j_dofs(:,1))
607 n_cells, mpi_sum, self%j_dofs(:,2))
609 call self%filter%apply_inplace( self%j_dofs(:,1) )
610 call self%filter%apply_inplace( self%j_dofs(:,2) )
613 if ( self%jmean .eqv. .true. )
then
614 self%j_dofs(:,1) = self%j_dofs(:,1) - sum(self%j_dofs(:,1))/real(self%kernel_smoother_0%n_dofs, f64)
615 self%j_dofs(:,2) = self%j_dofs(:,2) - sum(self%j_dofs(:,2))/real(self%kernel_smoother_1%n_dofs, f64)
618 call self%maxwell_solver%compute_E_from_j(self%j_dofs(:,1), 1, self%efield_dofs(:,1))
619 call self%maxwell_solver%compute_E_from_j(self%j_dofs(:,2), 2, self%efield_dofs(:,2))
621 call self%maxwell_solver%compute_E_from_B(&
622 dt, self%bfield_dofs, self%efield_dofs(:,2))
653 sll_real64,
target,
intent(in) :: efield_dofs(:,:)
654 sll_real64,
target,
intent(in) :: bfield_dofs(:)
655 sll_real64,
intent(in) :: x_min
656 sll_real64,
intent(in) :: lx
657 sll_int32,
intent(in) :: n_sub_iter
658 character(*),
intent(in) :: file_prefix
660 logical,
optional,
intent(in) :: jmean
662 sll_int32,
optional,
intent(in) :: i_weight
667 print*,
'Subcycling propagator with efield'
669 self%maxwell_solver => maxwell_solver
670 self%kernel_smoother_0 => kernel_smoother_0
671 self%kernel_smoother_1 => kernel_smoother_1
673 self%n_species = particle_group%n_species
675 self%particle_group => particle_group
676 self%efield_dofs => efield_dofs
677 self%bfield_dofs => bfield_dofs
679 self%n_sub_iter = n_sub_iter
682 sll_assert( self%kernel_smoother_0%n_dofs == self%kernel_smoother_1%n_dofs )
684 sll_allocate(self%j_dofs(self%kernel_smoother_0%n_dofs,2), ierr)
685 sll_allocate(self%j_dofs_local(self%kernel_smoother_0%n_dofs,2), ierr)
686 sll_allocate(self%rho_dofs_local(self%kernel_smoother_0%n_dofs), ierr)
687 sll_allocate(self%efield_filter(self%kernel_smoother_1%n_dofs,2), ierr)
688 sll_allocate(self%bfield_filter(self%kernel_smoother_0%n_dofs), ierr)
689 sll_allocate(self%bfield_dofs_old(self%kernel_smoother_0%n_dofs), ierr)
691 self%spline_degree = self%kernel_smoother_0%spline_degree
694 self%delta_x = self%Lx/real(self%kernel_smoother_1%n_dofs, f64)
696 self%cell_integrals_1 = [0.5_f64, 2.0_f64, 0.5_f64]
697 self%cell_integrals_1 = self%cell_integrals_1 / 3.0_f64
699 self%cell_integrals_0 = [1.0_f64,11.0_f64,11.0_f64,1.0_f64]
700 self%cell_integrals_0 = self%cell_integrals_0 / 24.0_f64
702 self%filter => filter
704 call self%filter%apply( self%efield_dofs(:,1), self%efield_filter(:,1) )
705 call self%filter%apply( self%efield_dofs(:,2), self%efield_filter(:,2) )
706 call self%filter%apply( self%bfield_dofs, self%bfield_filter )
708 if (
present(jmean))
then
713 if (
present(i_weight)) self%i_weight = i_weight
714 if(
present(control_variate))
then
715 allocate(self%control_variate )
716 allocate(self%control_variate%cv(self%n_species) )
717 self%control_variate => control_variate
721 open(newunit=self%file_id, file=trim(file_prefix)//
"_subcycling_iterations.dat",action=
'write')
723 open(newunit=self%file_id_rho, file=trim(file_prefix)//
"_rho.dat",action=
'write')
733 deallocate(self%j_dofs)
734 deallocate(self%j_dofs_local)
735 self%maxwell_solver => null()
736 self%kernel_smoother_0 => null()
737 self%kernel_smoother_1 => null()
738 self%particle_group => null()
739 self%efield_dofs => null()
740 self%bfield_dofs => null()
769 sll_real64,
target,
intent(in) :: efield_dofs(:,:)
770 sll_real64,
target,
intent(in) :: bfield_dofs(:)
771 sll_real64,
intent(in) :: x_min
772 sll_real64,
intent(in) :: lx
773 sll_int32,
intent(in) :: n_sub_iter
774 character(*),
intent(in) :: file_prefix
776 logical,
optional,
intent(in) :: jmean
778 sll_int32,
optional,
intent(in) :: i_weight
786 if (
present(jmean) )
then
792 select type (splitting)
795 call splitting%init(&
811 call splitting%init(&
851 sll_real64,
target,
intent(in) :: efield_dofs(:,:)
852 sll_real64,
target,
intent(in) :: bfield_dofs(:)
853 sll_real64,
intent(in) :: x_min
854 sll_real64,
intent(in) :: lx
855 sll_int32,
intent(in) :: n_sub_iter
856 character(*),
intent(in) :: file_prefix
858 logical,
optional,
intent(in) :: jmean
869 if (
present(jmean) )
then
875 select type (splitting)
877 call splitting%init(&
Combines values from all processes and distributes the result back to all processes.
Binomial filter for smooting of fields.
type(sll_t_collective_t), pointer, public sll_v_world_collective
Control of subset assignment. Processes with the same color are in the same new communicator.
Module interface to solve Maxwell's equations in 1D.
Base class for kernel smoothers for accumulation and field evaluation in PIC.
Kernel smoother for 1d with splines of arbitrary degree placed on a uniform mesh.
Base class for Hamiltonian splittings.
Particle pusher based on the subcycling algorithm for the 1d2v Vlasov-Maxwell equation.
subroutine lie_splitting_pic_vm_1d2v(self, dt, number_steps)
Lie splitting.
subroutine, public sll_s_new_time_propagator_pic_vm_1d2v_subcyc_ptr(splitting, maxwell_solver, kernel_smoother_0, kernel_smoother_1, particle_group, efield_dofs, bfield_dofs, x_min, Lx, n_sub_iter, file_prefix, filter, jmean)
Constructor for pointer abstract type.
subroutine lie_splitting_back_pic_vm_1d2v(self, dt, number_steps)
Lie splitting (oposite ordering)
subroutine strang_splitting_pic_vm_1d2v(self, dt, number_steps)
Strang splitting.
subroutine operatorhp_pic_vm_1d2v_newton(self, dt)
Implementation of the full time step with Newton iteration for the nonlinear part.
subroutine operatorhp_pic_vm_1d2v(self, dt)
subroutine, public sll_s_new_time_propagator_pic_vm_1d2v_subcyc(splitting, maxwell_solver, kernel_smoother_0, kernel_smoother_1, particle_group, efield_dofs, bfield_dofs, x_min, Lx, n_sub_iter, file_prefix, filter, jmean, control_variate, i_weight)
Constructor for allocatable abstract type.
subroutine delete_pic_vm_1d2v(self)
Destructor.
subroutine reinit_fields(self)
Finalization.
subroutine initialize_pic_vm_1d2v(self, maxwell_solver, kernel_smoother_0, kernel_smoother_1, particle_group, efield_dofs, bfield_dofs, x_min, Lx, n_sub_iter, file_prefix, filter, jmean, control_variate, i_weight)
Constructor.
real(kind=f64) function, dimension(size(particle, 2)) control_variate(particle)
Basic type of a kernel smoother used for PIC simulations.
Spline kernel smoother in1d.
Type for Hamiltonian splittings.
Hamiltonian splitting type for Vlasov-Maxwell 1d2v.