submodule(splitting_m) splitting_gauss_seidel_cpu_s !! Splitting solver with Gauss-Seidel splitting method on CPU implicit none contains module subroutine create_gauss_seidel_cpu(self, mesh) class(splitting_gauss_seidel_cpu_t), intent(inout) :: self type(mesh_cart_t), intent(in), target :: mesh ! Store dimension self%ndim = mesh%get_n_points() end subroutine module subroutine apply_gauss_seidel_cpu(self, a, dinv, x, b) class(splitting_gauss_seidel_cpu_t), intent(inout) :: self type(csrmat_t), intent(in) :: a real(FP), intent(in), dimension(self%ndim) :: dinv real(FP), intent(inout), dimension(self%ndim) :: x real(FP), intent(in), dimension(self%ndim) :: b integer :: m, n real(FP) :: sg !$OMP MASTER do m = 1, a%ndim sg = 0.0_FP do n = a%i(m), a%i(m+1)-1 if (a%j(n) /= m) then sg = sg + a%val(n)*x(a%j(n)) endif enddo x(m) = (b(m) - sg) * dinv(m) enddo !$OMP END MASTER !$OMP BARRIER end subroutine module subroutine destructor_gauss_seidel_cpu(self) type(splitting_gauss_seidel_cpu_t), intent(inout) :: self end subroutine end submodule