3 #include "sll_assert.h"
4 #include "sll_errors.h"
62 integer,
intent(in) :: n1
63 integer,
intent(in) :: n2
64 integer,
intent(in) :: p1
65 integer,
intent(in) :: p2
72 call self%block1%init(3, 3)
73 call self%block2%init(3, p1, n2)
74 call self%block3%init(p1, n2, 3)
75 call self%block4%init(n1 - 2, n2, p1, p2)
84 s = self%block1%get_shape() + self%block2%get_shape() + &
85 self%block3%get_shape() + self%block4%get_shape()
95 character(len=*),
parameter :: this_sub_name =
"sll_t_linear_operator_matrix_c1_block % dot"
96 character(len=64) :: err_msg
106 call self%block1%dot(x%vd, y%vd)
107 call self%block2%dot_incr(x%vs, y%vd)
108 call self%block3%dot(x%vd, y%vs)
109 call self%block4%dot_incr(x%vs, y%vs)
112 err_msg =
"y must be of type sll_t_vector_space_c1_block"
113 sll_error(this_sub_name, err_msg)
118 err_msg =
"x must be of type sll_t_vector_space_c1_block"
119 sll_error(this_sub_name, err_msg)
131 character(len=*),
parameter :: this_sub_name =
"sll_t_linear_operator_matrix_c1_block_new_new % dot_incr"
132 character(len=64) :: err_msg
142 call self%block1%dot_incr(x%vd, y%vd)
143 call self%block2%dot_incr(x%vs, y%vd)
144 call self%block3%dot_incr(x%vd, y%vs)
145 call self%block4%dot_incr(x%vs, y%vs)
148 err_msg =
"y must be of type sll_t_vector_space_c1_block"
149 sll_error(this_sub_name, err_msg)
154 err_msg =
"x must be of type sll_t_vector_space_c1_block"
155 sll_error(this_sub_name, err_msg)
164 real(wp),
intent(inout) :: A(:, :)
166 integer :: i, j, i1, i2, j1, j2, k1, k2
169 sll_assert(
size(a, 1) == 3 + (self%n1 - 2)*self%n2)
170 sll_assert(
size(a, 2) == 3 + (self%n1 - 2)*self%n2)
172 associate(n1 => self%n1, &
178 a(1:3, 1:3) = self%block1%A(:, :)
184 a(1:3, i + 3) = self%block2%A(:, i1, i2)
187 a(1:3, 4 + p1:3 + (n1 - 2)*n2) = 0.0_wp
193 a(i + 3, 1:3) = self%block3%A(i1, i2, :)
196 a(4 + p1:3 + (n1 - 2)*n2, 1:3) = 0.0_wp
203 j1 = modulo(i1 - 1 + k1, n1 - 2) + 1
204 j2 = modulo(i2 - 1 + k2, n2) + 1
207 a(i + 3, j + 3) = self%block4%A(k1, k2, i1, i2)
221 call self%block1%free()
222 call self%block2%free()
223 call self%block3%free()
224 call self%block4%free()
subroutine s_linear_operator_matrix_c1_block_new__dot_incr(self, x, y)
subroutine s_linear_operator_matrix_c1_block_new__to_array(self, A)
subroutine s_linear_operator_matrix_c1_block_new__dot(self, x, y)
integer function, dimension(2) f_linear_operator_matrix_c1_block_new__get_shape(self)
subroutine s_linear_operator_matrix_c1_block_new__free(self)
subroutine s_linear_operator_matrix_c1_block_new__init(self, n1, n2, p1, p2)
Abstract type implementing a generic vector space.
Vector space for wrapping 2D Fortran real arrays.
Module to select the kind parameter.
integer, parameter, public f64
f64 is the kind type for 64-bit reals (double precision)
Abstract base class for all vector spaces.