splitting_gauss_seidel_cpu_s.f90 Source File


Source Code

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