8 #include "sll_assert.h"
9 #include "sll_memory.h"
10 #include "sll_working_precision.h"
11 #include "sll_errors.h"
14 sll_s_uniform_bsplines_eval_basis
41 logical :: eval_same = .true.
42 sll_int32 :: index_shift
49 sll_real64,
allocatable :: spline_val(:)
50 sll_real64,
allocatable :: spline_val_more(:)
52 sll_real64,
allocatable :: spline_val_prim(:)
53 sll_real64,
allocatable :: spline_val_prim_old(:)
54 sll_real64,
allocatable :: spline_val_prim_new(:)
56 sll_int32 :: n_quad_points
57 sll_real64,
allocatable :: quad_xw(:,:)
84 sll_real64,
intent( in ) :: position(self%dim)
85 sll_int32,
intent(out) :: index
86 sll_real64,
intent(out) :: axi(self%dim)
90 xi(1) = (position(1) - self%domain(1))/self%delta_x
91 index = floor(xi(1))+1
92 xi(1) = xi(1) - real(index-1, f64)
107 if ( self%eval_same .eqv. .true. )
then
108 axi(1) = 1.0_f64 - xi(1)
109 index = index - self%index_shift
111 if (xi(1) < 0.5_f64 )
then
112 axi(1) = 0.5_f64 - xi(1)
113 index = index - self%index_shift
115 axi(1) = 1.5_f64 - xi(1)
116 index = index - self%index_shift + 1
130 sll_real64,
intent( in ) :: position(self%dim)
131 sll_real64,
intent( in ) :: marker_charge
132 sll_real64,
intent( inout ) :: rho_dofs(self%n_dofs)
137 sll_int32 :: index1d, index
142 if ( self%integ .eqv. .false. )
then
144 call sll_s_uniform_bsplines_eval_basis( self%spline_degree, axi(1), &
147 do i1 = 1, self%n_span
148 index1d = modulo(index+i1-2, self%n_cells)+1
149 rho_dofs(index1d) = rho_dofs(index1d) + &
150 marker_charge * self%spline_val(self%n_span-i1+1)/ self%delta_x
157 self%spline_val_prim(self%n_span-i+2) =
sll_f_spline_pp_horner_1d(self%spline_degree+1, self%spline_pp%poly_coeffs_fpa, axi(1), i)
161 do i=1, self%n_span+1
162 index1d = modulo(index+i-2,self%n_cells)+1
163 rho_dofs(index1d) = rho_dofs(index1d) + &
164 marker_charge * ( self%spline_val_prim(i+1) - self%spline_val_prim(i) )/ self%delta_x
173 sll_real64,
intent(in) :: position_old(self%dim)
174 sll_real64,
intent(in) :: position_new(self%dim)
175 sll_real64,
intent(in) :: marker_charge
176 sll_real64,
intent(in) :: qoverm
177 sll_real64,
intent(in) :: bfield_dofs(:)
178 sll_real64,
intent(inout) :: vi(:)
179 sll_real64,
intent(inout) :: j_dofs(:)
183 sll_int32 :: index_new, index_old
184 sll_real64 :: axi_new(1), axi_old(1)
189 if (index_old == index_new)
then
190 call current_v_local( self, axi_old(1), axi_new(1), index_old, marker_charge, qoverm, vi(2), j_dofs, bfield_dofs )
191 elseif(index_old < index_new )
then
192 call current_v_local( self, axi_old(1), 0.0_f64, index_old, marker_charge, qoverm, vi(2), j_dofs, bfield_dofs )
193 do ind = index_old+1, index_new-1
194 call current_v_local( self, 1.0_f64, 0.0_f64, ind , marker_charge, qoverm, vi(2), j_dofs, bfield_dofs)
196 call current_v_local( self, 1.0_f64, axi_new(1), index_new, marker_charge, qoverm, vi(2), j_dofs, bfield_dofs )
198 call current_v_local( self, axi_old(1), 1.0_f64, index_old, marker_charge, qoverm, vi(2), j_dofs, bfield_dofs )
199 do ind = index_new+1, index_old-1
200 call current_v_local( self, 0.0_f64, 1.0_f64, ind , marker_charge, qoverm, vi(2), j_dofs, bfield_dofs)
202 call current_v_local( self, 0.0_f64, axi_new(1), index_new, marker_charge, qoverm, vi(2), j_dofs, bfield_dofs )
209 subroutine current_v_local( self, upper, lower, box, marker_charge, qoverm, vi, j_dofs, bfield_dofs)
211 sll_real64,
intent(in) :: lower
212 sll_real64,
intent(in) :: upper
213 sll_int32,
intent(in) :: box
214 sll_real64,
intent(in) :: marker_charge
215 sll_real64,
intent(in) :: qoverm
216 sll_real64,
intent(inout) :: vi
217 sll_real64,
intent(in) :: bfield_dofs(self%n_dofs)
218 sll_real64,
intent(inout) :: j_dofs(self%n_dofs)
221 sll_int32 :: ind, i_grid, i_mod, n_cells, j
223 n_cells = self%n_cells
225 c1 = 0.5_f64*(upper-lower)
226 c2 = 0.5_f64*(upper+lower)
228 call sll_s_uniform_bsplines_eval_basis(self%spline_degree, c1*self%quad_xw(1,1)+c2, &
230 self%spline_val = self%spline_val * (self%quad_xw(2,1)*c1)
231 do j=2,self%n_quad_points
232 call sll_s_uniform_bsplines_eval_basis(self%spline_degree, c1*self%quad_xw(1,j)+c2, &
233 self%spline_val_more)
234 self%spline_val = self%spline_val + self%spline_val_more * (self%quad_xw(2,j)*c1)
242 ind = self%spline_degree+1
243 do i_grid = box, box+self%spline_degree
244 i_mod = modulo(i_grid-1, n_cells ) +1
245 j_dofs(i_mod) = j_dofs(i_mod) + marker_charge*self%spline_val(ind)
246 vi = vi - qoverm * self%spline_val(ind)*bfield_dofs(i_mod)
257 sll_real64,
intent(in) :: position_old(self%dim)
258 sll_real64,
intent(in) :: position_new(self%dim)
259 sll_real64,
intent(in) :: marker_charge
260 sll_real64,
intent(in) :: qoverm
261 sll_real64,
intent(in) :: bfield_dofs(:)
262 sll_real64,
intent(inout) :: vi(:)
263 sll_real64,
intent(inout) :: j_dofs(:)
265 sll_int32 :: i, i1, diff
266 sll_int32 :: index_new, index_old
267 sll_real64 :: axi_new(1), axi_old(1)
274 self%spline_val_prim_old(self%n_span-i+1) =
sll_f_spline_pp_horner_1d(self%spline_degree+1, self%spline_pp%poly_coeffs_fpa, axi_old(1), i)
275 self%spline_val_prim_new(self%n_span-i+1) =
sll_f_spline_pp_horner_1d(self%spline_degree+1, self%spline_pp%poly_coeffs_fpa, axi_new(1), i)
289 if (index_old<index_new)
then
290 diff = index_new-index_old
292 do i=0,min(diff-1, self%spline_degree)
293 i1 = modulo(index_old+i-1, self%n_cells) + 1
294 j_dofs(i1) = j_dofs(i1) + self%spline_val_prim_old(i+1)* marker_charge
295 vi(2) = vi(2) - qoverm * bfield_dofs(i1) * ( self%spline_val_prim_old(i+1))
297 do i = self%spline_degree+1, diff-1
298 i1 = modulo(index_old+i-1, self%n_cells) + 1
299 j_dofs(i1) = j_dofs(i1) + marker_charge
300 vi(2) = vi(2) - qoverm * bfield_dofs(i1)
302 do i = diff, self%spline_degree
303 i1 = modulo(index_old+i-1, self%n_cells) + 1
304 j_dofs(i1) = j_dofs(i1) + ( self%spline_val_prim_old(i+1) - self%spline_val_prim_new(i+1-diff)) &
306 vi(2) = vi(2) - qoverm * bfield_dofs(i1) * ( self%spline_val_prim_old(i+1) - self%spline_val_prim_new(i+1-diff))
308 do i=max(self%spline_degree+1, diff), self%spline_degree+diff
309 i1 = modulo(index_old+i-1, self%n_cells) + 1
310 j_dofs(i1) = j_dofs(i1) + ( 1.0_f64 - self%spline_val_prim_new(i+1-diff))*marker_charge
311 vi(2) = vi(2) - qoverm * bfield_dofs(i1) * ( 1.0_f64 - self%spline_val_prim_new(i+1-diff))
314 diff = index_old-index_new
315 do i=0,min(diff-1, self%spline_degree)
316 i1 = modulo(index_new+i-1, self%n_cells) + 1
317 j_dofs(i1) = j_dofs(i1) - self%spline_val_prim_new(i+1)*marker_charge
318 vi(2) = vi(2) - qoverm * bfield_dofs(i1) * ( - self%spline_val_prim_new(i+1))
320 do i=self%spline_degree+1, diff-1
321 i1 = modulo(index_new+i-1, self%n_cells) + 1
322 j_dofs(i1) = j_dofs(i1) - marker_charge
323 vi(2) = vi(2) + qoverm * bfield_dofs(i1)
326 do i = diff, self%spline_degree
327 i1 = modulo(index_new+i-1, self%n_cells) + 1
328 j_dofs(i1) = j_dofs(i1) +( self%spline_val_prim_old(i+1-diff) - self%spline_val_prim_new(i+1)) &
330 vi(2) = vi(2) - qoverm * bfield_dofs(i1) * ( self%spline_val_prim_old(i+1-diff) - self%spline_val_prim_new(i+1))
332 do i=max(self%spline_degree+1, diff), self%spline_degree+diff
333 i1 = modulo(index_new+i-1, self%n_cells) + 1
334 j_dofs(i1) = j_dofs(i1) + (-1.0_f64 + self%spline_val_prim_old(i+1-diff)) &
336 vi(2) = vi(2) - qoverm * bfield_dofs(i1) * ( self%spline_val_prim_old(i+1-diff) - 1.0_f64 )
345 sll_real64,
intent( in ) :: position(self%dim)
346 sll_real64,
intent( in ) :: field_dofs(self%n_dofs)
347 sll_real64,
intent( out ) :: field_value
351 sll_int32 :: index1d, index
357 if ( self%integ .eqv. .true. )
then
360 self%spline_val_prim(self%n_span-i+2) =
sll_f_spline_pp_horner_1d(self%spline_degree+1, self%spline_pp%poly_coeffs_fpa, axi(1), i)
363 field_value = 0.0_f64
364 do i1 = 1, self%n_span+1
365 index1d = modulo(index+i1-2, self%n_cells)+1
366 field_value = field_value + &
367 field_dofs(index1d) * &
368 (self%spline_val_prim(i1+1)-self%spline_val_prim(i1)) / &
373 call sll_s_uniform_bsplines_eval_basis( self%spline_degree, axi(1), &
376 field_value = 0.0_f64
377 do i1 = 1, self%n_span
378 index1d = modulo(index+i1-2, self%n_cells)+1
379 field_value = field_value + &
380 field_dofs(index1d) * &
381 self%spline_val(self%n_span-i1+1) / &
394 sll_real64,
intent(in) :: position_old(self%dim)
395 sll_real64,
intent(in) :: position_new(self%dim)
396 sll_real64,
intent(in) :: marker_charge
397 sll_real64,
intent( in ) :: vbar
398 sll_real64,
intent(in) :: field_dofs(self%n_dofs)
399 sll_real64,
intent(inout) :: j_dofs(self%n_dofs)
400 sll_real64,
intent( out ) :: field
404 sll_int32 :: index_new, index_old
405 sll_real64 :: axi_new(1), axi_old(1)
412 if (index_old == index_new)
then
413 call current_eval_local( self, axi_old(1), axi_new(1), index_old, marker_charge, field, j_dofs, field_dofs )
414 elseif(index_old < index_new )
then
415 call current_eval_local( self, axi_old(1), 0.0_f64, index_old, marker_charge, field, j_dofs, field_dofs )
416 do ind = index_old+1, index_new-1
417 call current_eval_local( self, 1.0_f64, 0.0_f64, ind , marker_charge, field, j_dofs, field_dofs)
419 call current_eval_local( self, 1.0_f64, axi_new(1), index_new, marker_charge, field, j_dofs, field_dofs )
421 call current_eval_local( self, axi_old(1), 1.0_f64, index_old, marker_charge, field, j_dofs, field_dofs )
422 do ind = index_new+1, index_old-1
423 call current_eval_local( self, 0.0_f64, 1.0_f64, ind , marker_charge, field, j_dofs, field_dofs)
425 call current_eval_local( self, 0.0_f64, axi_new(1), index_new, marker_charge, field, j_dofs, field_dofs )
436 sll_real64,
intent(in) :: lower
437 sll_real64,
intent(in) :: upper
438 sll_int32,
intent(in) :: box
439 sll_real64,
intent(in) :: marker_charge
440 sll_real64,
intent(inout) :: field
441 sll_real64,
intent(in) :: field_dofs(self%n_dofs)
442 sll_real64,
intent(inout) :: j_dofs(self%n_dofs)
445 sll_int32 :: ind, i_grid, i_mod, n_cells, j
447 n_cells = self%n_cells
449 c1 = 0.5_f64*(upper-lower)
450 c2 = 0.5_f64*(upper+lower)
452 call sll_s_uniform_bsplines_eval_basis(self%spline_degree, c1*self%quad_xw(1,1)+c2, &
454 self%spline_val = self%spline_val * (self%quad_xw(2,1)*c1)
455 do j=2,self%n_quad_points
456 call sll_s_uniform_bsplines_eval_basis(self%spline_degree, c1*self%quad_xw(1,j)+c2, &
457 self%spline_val_more)
458 self%spline_val = self%spline_val + self%spline_val_more * (self%quad_xw(2,j)*c1)
466 ind = self%spline_degree+1
467 do i_grid = box, box+self%spline_degree
468 i_mod = modulo(i_grid-1, n_cells ) +1
469 j_dofs(i_mod) = j_dofs(i_mod) + marker_charge*self%spline_val(ind)
470 field = field + field_dofs(i_mod)* self%spline_val(ind)
482 sll_real64,
intent( in ) :: position_old(self%dim)
483 sll_real64,
intent( in ) :: position_new(self%dim)
484 sll_real64,
intent( in ) :: marker_charge
485 sll_real64,
intent( in ) :: vbar
486 sll_real64,
intent( in ) :: field_dofs(self%n_dofs)
487 sll_real64,
intent( inout ) :: j_dofs(self%n_dofs)
488 sll_real64,
intent( out ) :: field
490 sll_int32 :: i, i1, diff
491 sll_int32 :: index_new, index_old
492 sll_real64 :: axi_new(1), axi_old(1)
499 self%spline_val_prim_old(self%n_span-i+1) =
sll_f_spline_pp_horner_1d(self%spline_degree+1, self%spline_pp%poly_coeffs_fpa, axi_old(1), i)
500 self%spline_val_prim_new(self%n_span-i+1) =
sll_f_spline_pp_horner_1d(self%spline_degree+1, self%spline_pp%poly_coeffs_fpa, axi_new(1), i)
505 if (index_old<index_new)
then
506 diff = index_new-index_old
508 do i=0,min(diff-1, self%spline_degree)
509 i1 = modulo(index_old+i-1, self%n_cells) + 1
510 j_dofs(i1) = j_dofs(i1) + self%spline_val_prim_old(i+1)* marker_charge
511 field = field + field_dofs(i1) * ( self%spline_val_prim_old(i+1))
513 do i = self%spline_degree+1, diff-1
514 i1 = modulo(index_old+i-1, self%n_cells) + 1
515 j_dofs(i1) = j_dofs(i1) + marker_charge
516 field = field + field_dofs(i1)
518 do i = diff, self%spline_degree
519 i1 = modulo(index_old+i-1, self%n_cells) + 1
520 j_dofs(i1) = j_dofs(i1) + ( self%spline_val_prim_old(i+1) - self%spline_val_prim_new(i+1-diff)) &
522 field = field + field_dofs(i1) * ( self%spline_val_prim_old(i+1) - self%spline_val_prim_new(i+1-diff))
524 do i=max(self%spline_degree+1, diff), self%spline_degree+diff
525 i1 = modulo(index_old+i-1, self%n_cells) + 1
526 j_dofs(i1) = j_dofs(i1) + ( 1.0_f64 - self%spline_val_prim_new(i+1-diff))*marker_charge
527 field = field + field_dofs(i1) * ( 1.0_f64 - self%spline_val_prim_new(i+1-diff))
530 diff = index_old-index_new
531 do i=0,min(diff-1, self%spline_degree)
532 i1 = modulo(index_new+i-1, self%n_cells) + 1
533 j_dofs(i1) = j_dofs(i1) - self%spline_val_prim_new(i+1)*marker_charge
534 field = field + field_dofs(i1) * ( - self%spline_val_prim_new(i+1))
536 do i=self%spline_degree+1, diff-1
537 i1 = modulo(index_new+i-1, self%n_cells) + 1
538 j_dofs(i1) = j_dofs(i1) - marker_charge
539 field = field - field_dofs(i1)
542 do i = diff, self%spline_degree
543 i1 = modulo(index_new+i-1, self%n_cells) + 1
544 j_dofs(i1) = j_dofs(i1) +( self%spline_val_prim_old(i+1-diff) - self%spline_val_prim_new(i+1)) &
546 field = field + field_dofs(i1) * ( self%spline_val_prim_old(i+1-diff) - self%spline_val_prim_new(i+1))
548 do i=max(self%spline_degree+1, diff), self%spline_degree+diff
549 i1 = modulo(index_new+i-1, self%n_cells) + 1
550 j_dofs(i1) = j_dofs(i1) + (-1.0_f64 + self%spline_val_prim_old(i+1-diff)) &
552 field = field + field_dofs(i1) * ( self%spline_val_prim_old(i+1-diff) - 1.0_f64 )
564 sll_int32,
intent(in) :: n_cells
565 sll_real64,
intent(in) :: domain(2)
566 sll_int32,
intent(in) :: spline_degree
567 logical,
intent( in ) :: integ
568 logical,
intent( in ) :: eval_grid_points
578 self%n_cells = n_cells
579 self%n_dofs = n_cells
580 self%delta_x = (self%domain(2)-self%domain(1))/real(n_cells, f64)
584 self%spline_degree = spline_degree
585 self%n_span = spline_degree + 1
589 ALLOCATE( self%spline_val(self%n_span), stat = ierr)
590 sll_assert( ierr == 0 )
591 ALLOCATE( self%spline_val_more(self%n_span), stat = ierr)
592 sll_assert( ierr == 0 )
593 ALLOCATE( self%spline_val_prim(self%n_span+2), stat = ierr )
594 sll_assert( ierr == 0 )
595 self%spline_val_prim(1) = 0.0_f64
596 self%spline_val_prim(self%n_span+2) = 1.0_f64
597 ALLOCATE( self%spline_val_prim_old(self%n_span), stat = ierr )
598 sll_assert( ierr == 0 )
599 ALLOCATE( self%spline_val_prim_new(self%n_span), stat = ierr )
600 sll_assert( ierr == 0 )
602 if ( self%spline_degree < 6 )
then
618 if ( integ .eqv. .false. )
then
619 if ( eval_grid_points .eqv. .true. )
then
620 if ( modulo( self%spline_degree, 2 ) == 0 )
then
621 self%eval_same = .false.
622 self%index_shift = (self%spline_degree)/2
624 self%eval_same = .true.
625 self%index_shift = (self%spline_degree-1)/2
628 if ( modulo( self%spline_degree, 2 ) == 0 )
then
629 self%eval_same = .true.
630 self%index_shift = (self%spline_degree)/2
632 self%eval_same = .false.
633 self%index_shift = (self%spline_degree+1)/2
637 if ( eval_grid_points .eqv. .true. )
then
638 if ( modulo( self%spline_degree, 2 ) == 0 )
then
639 self%eval_same = .true.
640 self%index_shift = (self%spline_degree-2)/2
642 self%eval_same = .false.
643 self%index_shift = (self%spline_degree-1)/2
646 if ( modulo( self%spline_degree, 2 ) == 0 )
then
647 self%eval_same = .false.
648 self%index_shift = (self%spline_degree)/2
650 self%eval_same = .true.
651 self%index_shift = (self%spline_degree-1)/2
657 self%n_quad_points = (self%spline_degree+2)/2
691 deallocate(self%spline_val)
692 deallocate(self%spline_val_more)
693 deallocate(self%quad_xw)
694 deallocate(self%spline_val_prim)
695 deallocate(self%spline_val_prim_old)
696 deallocate(self%spline_val_prim_new)
697 if (self%spline_degree < 6 )
then
710 sll_real64,
intent( in ) :: position(self%dim)
711 sll_real64,
intent( in ) :: marker_charge
712 sll_real64,
intent( inout ) :: particle_mass(:,:)
715 sll_error(
"add_particle_mass",
"Not implemented.")
723 sll_real64,
intent( in ) :: position(self%dim)
724 sll_int32,
intent(in) :: components(:)
725 sll_real64,
intent( in ) :: field_dofs(:,:)
726 sll_real64,
intent(out) :: field_value(:)
728 sll_error(
"evaluate_multiple",
"Not implemented.")
735 sll_real64,
intent( in ) :: position(self%dim)
736 sll_real64,
intent(in) :: field_dofs_pp(:,:)
737 sll_real64,
intent( out ) :: field_value
739 sll_error(
"evaluate_pp",
"Not implemented.")
747 sll_real64,
intent( in ) :: position_old(self%dim)
748 sll_real64,
intent( in ) :: position_new(self%dim)
749 sll_real64,
intent( in ) :: marker_charge
750 sll_real64,
intent( inout ) :: j_dofs(self%n_dofs)
753 sll_error(
"add_current",
"Not implemented.")
760 sll_real64,
intent(in) :: position_old(self%dim)
761 sll_real64,
intent(in) :: position_new(self%dim)
762 sll_real64,
intent(in) :: marker_charge
763 sll_real64,
intent(in) :: qoverm
764 sll_real64,
intent(in) :: bfield_dofs(self%n_dofs)
765 sll_real64,
intent(inout) :: vi(:)
766 sll_real64,
intent(inout) :: j_dofs(self%n_dofs)
769 sll_error(
"add_current_update_v_pp",
"Not implemented.")
777 sll_int32,
intent(in) :: n_cells
778 sll_real64,
intent(in) :: domain(2)
779 sll_int32,
intent(in) :: spline_degree
780 logical,
intent( in ) :: integ
781 logical,
intent( in ) :: eval_grid_points
788 sll_assert( ierr == 0)
790 select type( smoother )
792 call smoother%init( domain, n_cells, spline_degree, integ, eval_grid_points )
Gauss-Legendre integration.
real(kind=f64) function, dimension(2, 1:npoints), public sll_f_gauss_legendre_points_and_weights(npoints, a, b)
Returns a 2d array of size (2,npoints) containing gauss-legendre points and weights in the interval [...
Low level arbitrary degree splines.
Base class for kernel smoothers for accumulation and field evaluation in PIC.
integer(kind=i32), parameter, public sll_p_collocation
integer(kind=i32), parameter, public sll_p_galerkin
Kernel smoother for 1d with splines of arbitrary degree placed on a uniform mesh. This version is for...
subroutine add_particle_mass_spline_strong_1d(self, position, marker_charge, particle_mass)
Add charge of one particle.
subroutine evaluate_multiple_spline_strong_1d(self, position, components, field_dofs, field_value)
Evaluate several fields at position position.
subroutine add_current_evaluate_spline_strong_1d(self, position_old, position_new, marker_charge, vbar, field_dofs, j_dofs, field)
subroutine add_charge_single_spline_strong_1d(self, position, marker_charge, rho_dofs)
Add charge of one particle.
subroutine evaluate_field_single_spline_strong_pp_1d(self, position, field_dofs_pp, field_value)
subroutine add_current_update_v_spline_strong_1d(self, position_old, position_new, marker_charge, qoverm, bfield_dofs, vi, j_dofs)
Add current for one particle and update v (according to H_p1 part in Hamiltonian splitting)
subroutine add_current_update_v_pp_spline_strong_1d(self, position_old, position_new, marker_charge, qoverm, bfield_dofs, vi, j_dofs)
Add current for one particle and update v (according to H_p1 part in Hamiltonian splitting)
subroutine add_current_update_v_spline_strong_1d_quadrature(self, position_old, position_new, marker_charge, qoverm, bfield_dofs, vi, j_dofs)
Add current for one particle and update v (according to H_p1 part in Hamiltonian splitting)....
subroutine add_current_evaluate_spline_strong_1d_quadrature(self, position_old, position_new, marker_charge, vbar, field_dofs, j_dofs, field)
Add current for one particle and update v (according to H_p1 part in Hamiltonian splitting)....
subroutine helper_normalized_position(self, position, index, axi)
subroutine add_current_spline_strong_1d(self, position_old, position_new, marker_charge, j_dofs)
Add current with integration over x.
subroutine free_spline_strong_1d(self)
Destructor.
subroutine current_eval_local(self, upper, lower, box, marker_charge, field, j_dofs, field_dofs)
subroutine current_v_local(self, upper, lower, box, marker_charge, qoverm, vi, j_dofs, bfield_dofs)
subroutine, public sll_s_new_particle_mesh_coupling_spline_strong_1d(smoother, domain, n_cells, spline_degree, integ, eval_grid_points)
subroutine init_spline_strong_1d(self, domain, n_cells, spline_degree, integ, eval_grid_points)
Constructor.
subroutine evaluate_field_single_spline_strong_1d(self, position, field_dofs, field_value)
subroutine, public sll_s_spline_pp_init_1d(self, degree, n_cells, boundary)
Initialize sll_t_spline_pp_1d object (Set poly_coeffs depending on degree)
subroutine, public sll_s_spline_pp_free_1d(self)
Destructor 1d.
real(kind=f64) function, public sll_f_spline_pp_horner_1d(degree, pp_coeffs, x, index)
Perform a 1d hornerschema on the pp_coeffs at index.
Basic type of a kernel smoother used for PIC simulations.
Basic type of a kernel smoother used for PIC simulations.
arbitrary degree 1d spline