87 subroutine elpa_hermitian_multiply_a_h_a_&
89 & (self, uplo_a, uplo_c, ncb, a, b, nrows_b, ncols_b, &
90 c, nrows_c, ncols_c, error)
91 class(elpa_impl_t) :: self
92 character*1 :: uplo_a, uplo_c
93 integer(kind=c_int),
intent(in) :: nrows_b, ncols_b, nrows_c, ncols_c, ncb
94#ifdef USE_ASSUMED_SIZE
95 math_datatype(kind=c_datatype_kind) :: a(self%local_nrows,*), b(nrows_b,*), c(nrows_c,*)
97 math_datatype(kind=c_datatype_kind) :: a(self%local_nrows,self%local_ncols), b(nrows_b,ncols_b), c(nrows_c,ncols_c)
100 integer,
optional :: error
107#if defined(INCLUDE_ROUTINES)
109 success_l = elpa_mult_at_b_a_h_a_&
112 success_l = elpa_mult_ah_b_a_h_a_&
117 &_impl(self, uplo_a, uplo_c, ncb, a, b, nrows_b, ncols_b, &
120#ifdef USE_FORTRAN2008
121 if (
present(error))
then
127 else if (.not. success_l)
then
128 write(error_unit,
'(a)')
"ELPA: Error in hermitian_multiply() and you did not check for errors!"
175 subroutine elpa_hermitian_multiply_d_ptr_&
177 & (self, uplo_a, uplo_c, ncb, a, b, nrows_b, ncols_b, &
178 c, nrows_c, ncols_c, error)
179 class(elpa_impl_t) :: self
180 character*1 :: uplo_a, uplo_c
181 integer(kind=c_int),
intent(in) :: nrows_b, ncols_b, nrows_c, ncols_c, ncb
182 type(c_ptr) :: a, b, c
183#ifdef USE_FORTRAN2008
184 integer,
optional :: error
191#if defined(INCLUDE_ROUTINES)
193 success_l = elpa_mult_at_b_d_ptr_&
196 success_l = elpa_mult_ah_b_d_ptr_&
201 &_impl(self, uplo_a, uplo_c, ncb, a, b, nrows_b, ncols_b, &
204#ifdef USE_FORTRAN2008
205 if (
present(error))
then
211 else if (.not. success_l)
then
212 write(error_unit,
'(a)')
"ELPA: Error in hermitian_multiply() and you did not check for errors!"
241 subroutine elpa_hermitian_multiply_a_h_a_&
243 &_c(handle, uplo_a, uplo_c, ncb, a_p, b_p, nrows_b, &
244 ncols_b, c_p, nrows_c, ncols_c, error) &
246#ifdef DOUBLE_PRECISION_REAL
247 bind(C, name="elpa_hermitian_multiply_a_h_a_d")
249#ifdef SINGLE_PRECISION_REAL
250 bind(C, name="elpa_hermitian_multiply_a_h_a_f")
254#ifdef DOUBLE_PRECISION_COMPLEX
255 bind(C, name="elpa_hermitian_multiply_a_h_a_dc")
257#ifdef SINGLE_PRECISION_COMPLEX
258 bind(C, name="elpa_hermitian_multiply_a_h_a_fc")
262 type(c_ptr),
intent(in),
value :: handle, a_p, b_p, c_p
263 character(1,C_CHAR),
value :: uplo_a, uplo_c
264 integer(kind=c_int),
value :: ncb, nrows_b, ncols_b, nrows_c, ncols_c
265#ifdef USE_FORTRAN2008
266 integer(kind=c_int),
optional,
intent(in) :: error
268 integer(kind=c_int),
intent(in) :: error
270 math_datatype(kind=c_datatype_kind),
pointer :: a(:, :), b(:,:), c(:,:)
276 type(elpa_impl_t),
pointer :: self
278 call c_f_pointer(handle, self)
279 call c_f_pointer(a_p, a, [self%local_nrows, self%local_ncols])
280 call c_f_pointer(b_p, b, [nrows_b, ncols_b])
281 call c_f_pointer(c_p, c, [nrows_c, ncols_c])
283 call elpa_hermitian_multiply_a_h_a_&
285 & (self, uplo_a, uplo_c, ncb, a, b, nrows_b, &
286 ncols_b, c, nrows_c, ncols_c, error)
305 subroutine elpa_hermitian_multiply_d_ptr_&
307 &_c(handle, uplo_a, uplo_c, ncb, a_p, b_p, nrows_b, &
308 ncols_b, c_p, nrows_c, ncols_c, error) &
310#ifdef DOUBLE_PRECISION_REAL
311 bind(C, name="elpa_hermitian_multiply_d_ptr_d")
313#ifdef SINGLE_PRECISION_REAL
314 bind(C, name="elpa_hermitian_multiply_d_ptr_f")
318#ifdef DOUBLE_PRECISION_COMPLEX
319 bind(C, name="elpa_hermitian_multiply_d_ptr_dc")
321#ifdef SINGLE_PRECISION_COMPLEX
322 bind(C, name="elpa_hermitian_multiply_d_ptr_fc")
326 type(c_ptr),
intent(in),
value :: handle, a_p, b_p, c_p
327 character(1,C_CHAR),
value :: uplo_a, uplo_c
328 integer(kind=c_int),
value :: ncb, nrows_b, ncols_b, nrows_c, ncols_c
329#ifdef USE_FORTRAN2008
330 integer(kind=c_int),
optional,
intent(in) :: error
332 integer(kind=c_int),
intent(in) :: error
334 type(elpa_impl_t),
pointer :: self
336 call c_f_pointer(handle, self)
339 call elpa_hermitian_multiply_d_ptr_&
341 & (self, uplo_a, uplo_c, ncb, a_p, b_p, nrows_b, &
342 ncols_b, c_p, nrows_c, ncols_c, error)
723 subroutine elpa_choleksy_a_h_a_&
725 &_c(handle, a_p, error) &
727#ifdef DOUBLE_PRECISION_REAL
728 bind(C, name="elpa_cholesky_a_h_a_d")
730#ifdef SINGLE_PRECISION_REAL
731 bind(C, name="elpa_cholesky_a_h_a_f")
735#ifdef DOUBLE_PRECISION_COMPLEX
736 bind(C, name="elpa_cholesky_a_h_a_dc")
738#ifdef SINGLE_PRECISION_COMPLEX
739 bind(C, name="elpa_cholesky_a_h_a_fc")
743 type(c_ptr),
intent(in),
value :: handle, a_p
744#ifdef USE_FORTRAN2008
745 integer(kind=c_int),
optional,
intent(in) :: error
747 integer(kind=c_int),
intent(in) :: error
749 math_datatype(kind=c_datatype_kind),
pointer :: a(:, :)
750 type(elpa_impl_t),
pointer :: self
752 call c_f_pointer(handle, self)
753 call c_f_pointer(a_p, a, [self%local_nrows, self%local_ncols])
755 call elpa_cholesky_a_h_a_&
953 subroutine elpa_invert_trm_a_h_a_&
955 &_c(handle, a_p, error) &
957#ifdef DOUBLE_PRECISION_REAL
958 bind(C, name="elpa_invert_trm_a_h_a_d")
960#ifdef SINGLE_PRECISION_REAL
961 bind(C, name="elpa_invert_trm_a_h_a_f")
965#ifdef DOUBLE_PRECISION_COMPLEX
966 bind(C, name="elpa_invert_trm_a_h_a_dc")
968#ifdef SINGLE_PRECISION_COMPLEX
969 bind(C, name="elpa_invert_trm_a_h_a_fc")
973 type(c_ptr),
intent(in),
value :: handle, a_p
974#ifdef USE_FORTRAN2008
975 integer(kind=c_int),
optional,
intent(in) :: error
977 integer(kind=c_int),
intent(in) :: error
979 math_datatype(kind=c_datatype_kind),
pointer :: a(:, :)
980 type(elpa_impl_t),
pointer :: self
982 call c_f_pointer(handle, self)
983 call c_f_pointer(a_p, a, [self%local_nrows, self%local_ncols])
985 call elpa_invert_trm_a_h_a_&
1121 subroutine elpa_solve_tridiagonal_&
1123 & (self, d, e, q, error)
1126 class(elpa_impl_t) :: self
1127 real(kind=c_real_datatype) :: d(self%na), e(self%na)
1128#ifdef USE_ASSUMED_SIZE
1129 real(kind=c_real_datatype) :: q(self%local_nrows,*)
1131 real(kind=c_real_datatype) :: q(self%local_nrows,self%local_ncols)
1133#ifdef USE_FORTRAN2008
1134 integer,
optional :: error
1138 logical :: success_l
1140#if defined(INCLUDE_ROUTINES)
1141 success_l = elpa_solve_tridi_&
1143 &_impl(self, d, e, q)
1145 write(error_unit,*)
"ELPA is not compiled with single-precision support"
1146#ifdef USE_FORTRAN2008
1147 if (
present(error))
then
1158#ifdef USE_FORTRAN2008
1159 if (
present(error))
then
1165 else if (.not. success_l)
then
1166 write(error_unit,
'(a)')
"ELPA: Error in solve_tridiagonal() and you did not check for errors!"
1185 subroutine elpa_solve_tridiagonal_&
1187 &_c(handle, d_p, e_p, q_p, error) &
1189#ifdef DOUBLE_PRECISION_REAL
1190 bind(C, name="elpa_solve_tridiagonal_d")
1192#ifdef SINGLE_PRECISION_REAL
1193 bind(C, name="elpa_solve_tridiagonal_f")
1197#ifdef DOUBLE_PRECISION_COMPLEX
1200#ifdef SINGLE_PRECISION_COMPLEX
1205 type(c_ptr),
intent(in),
value :: handle, d_p, e_p, q_p
1206#ifdef USE_FORTRAN2008
1207 integer(kind=c_int),
optional,
intent(in) :: error
1209 integer(kind=c_int),
intent(in) :: error
1211 real(kind=c_real_datatype),
pointer :: d(:), e(:), q(:, :)
1212 type(elpa_impl_t),
pointer :: self
1214 call c_f_pointer(handle, self)
1215 call c_f_pointer(d_p, d, [self%na])
1216 call c_f_pointer(e_p, e, [self%na])
1217 call c_f_pointer(q_p, q, [self%local_nrows, self%local_ncols])
1219 call elpa_solve_tridiagonal_&
1221 & (self, d, e, q, error)