2 #include "sll_working_precision.h"
15 sll_int32 :: degree2(3)
30 sll_int32,
intent( in ) :: n_cells(3)
31 sll_int32,
intent( in ) :: degree(3)
32 sll_int32,
optional,
intent( in ) :: degree2(3)
35 self%degree2 = degree2
37 self%n_total = product(n_cells)
39 allocate( self%particle_mass( product(self%degree+self%degree2+1), self%n_total))
40 self%particle_mass = 0._f64
42 self%n_rows = self%n_total
43 self%n_cols = self%n_total
45 self%n_global_rows = self%n_rows
46 self%n_global_cols = self%n_cols
53 deallocate( self%particle_mass )
60 sll_real64,
intent( in ) :: x(:)
61 sll_real64,
intent( out ) :: y(:)
63 sll_int32 :: ind_i, ind_j, ind
64 sll_int32 :: i1, i2, i3, j1, j2, j3
67 do i3 = 1, self%n_dofs(3)
68 do i2 = 1, self%n_dofs(2)
69 do i1 = 1, self%n_dofs(1)
72 do j3 = i3-self%degree2(3), i3+self%degree(3)
73 do j2 = i2-self%degree2(2), i2+self%degree(2)
74 do j1 = i1-self%degree2(1), i1+self%degree(1)
76 y(ind_i) = y(ind_i) + &
77 self%sign * self%particle_mass( ind, ind_i) * x(ind_j)
92 sll_int32 :: num_pts(3)
98 ind1d = 1+ modulo(ind1-1,num_pts(1)) + &
99 modulo(ind2-1,num_pts(2)) * num_pts(1) + &
100 modulo(ind3-1,num_pts(3))* num_pts(1)*num_pts(2)
integer(kind=i32) function index_3dto1d(num_pts, ind1, ind2, ind3)
subroutine create_linear_operator_particle_mass_3d_od(self, n_cells, degree, degree2)
subroutine free_particle_mass_3d_od(self)
subroutine print_info_particle_mass_3d_od(self)
subroutine dot_particle_mass_3d_od(self, x, y)