84 subroutine elpa_hermitian_multiply_a_h_a_&
86 & (self, uplo_a, uplo_c, ncb, a, b, nrows_b, ncols_b, &
87 c, nrows_c, ncols_c, error)
88 class(elpa_impl_t) :: self
89 character*1 :: uplo_a, uplo_c
90 integer(kind=c_int),
intent(in) :: nrows_b, ncols_b, nrows_c, ncols_c, ncb
91#ifdef USE_ASSUMED_SIZE
92 math_datatype(kind=c_datatype_kind) :: a(self%local_nrows,*), b(nrows_b,*), c(nrows_c,*)
94 math_datatype(kind=c_datatype_kind) :: a(self%local_nrows,self%local_ncols), b(nrows_b,ncols_b), c(nrows_c,ncols_c)
97 integer,
optional :: error
104#if defined(INCLUDE_ROUTINES)
106 success_l = elpa_mult_at_b_a_h_a_&
109 success_l = elpa_mult_ah_b_a_h_a_&
114 &_impl(self, uplo_a, uplo_c, ncb, a, b, nrows_b, ncols_b, &
117#ifdef USE_FORTRAN2008
118 if (
present(error))
then
124 else if (.not. success_l)
then
125 write(error_unit,
'(a)')
"ELPA: Error in hermitian_multiply() and you did not check for errors!"
172 subroutine elpa_hermitian_multiply_d_ptr_&
174 & (self, uplo_a, uplo_c, ncb, a, b, nrows_b, ncols_b, &
175 c, nrows_c, ncols_c, error)
176 class(elpa_impl_t) :: self
177 character*1 :: uplo_a, uplo_c
178 integer(kind=c_int),
intent(in) :: nrows_b, ncols_b, nrows_c, ncols_c, ncb
179 type(c_ptr) :: a, b, c
180#ifdef USE_FORTRAN2008
181 integer,
optional :: error
188#if defined(INCLUDE_ROUTINES)
190 success_l = elpa_mult_at_b_d_ptr_&
193 success_l = elpa_mult_ah_b_d_ptr_&
198 &_impl(self, uplo_a, uplo_c, ncb, a, b, nrows_b, ncols_b, &
201#ifdef USE_FORTRAN2008
202 if (
present(error))
then
208 else if (.not. success_l)
then
209 write(error_unit,
'(a)')
"ELPA: Error in hermitian_multiply() and you did not check for errors!"
238 subroutine elpa_hermitian_multiply_a_h_a_&
240 &_c(handle, uplo_a, uplo_c, ncb, a_p, b_p, nrows_b, &
241 ncols_b, c_p, nrows_c, ncols_c, error) &
243#ifdef DOUBLE_PRECISION_REAL
244 bind(C, name="elpa_hermitian_multiply_a_h_a_d")
246#ifdef SINGLE_PRECISION_REAL
247 bind(C, name="elpa_hermitian_multiply_a_h_a_f")
251#ifdef DOUBLE_PRECISION_COMPLEX
252 bind(C, name="elpa_hermitian_multiply_a_h_a_dc")
254#ifdef SINGLE_PRECISION_COMPLEX
255 bind(C, name="elpa_hermitian_multiply_a_h_a_fc")
259 type(c_ptr),
intent(in),
value :: handle, a_p, b_p, c_p
260 character(1,C_CHAR),
value :: uplo_a, uplo_c
261 integer(kind=c_int),
value :: ncb, nrows_b, ncols_b, nrows_c, ncols_c
262#ifdef USE_FORTRAN2008
263 integer(kind=c_int),
optional,
intent(in) :: error
265 integer(kind=c_int),
intent(in) :: error
267 math_datatype(kind=c_datatype_kind),
pointer :: a(:, :), b(:,:), c(:,:)
273 type(elpa_impl_t),
pointer :: self
275 call c_f_pointer(handle, self)
276 call c_f_pointer(a_p, a, [self%local_nrows, self%local_ncols])
277 call c_f_pointer(b_p, b, [nrows_b, ncols_b])
278 call c_f_pointer(c_p, c, [nrows_c, ncols_c])
280 call elpa_hermitian_multiply_a_h_a_&
282 & (self, uplo_a, uplo_c, ncb, a, b, nrows_b, &
283 ncols_b, c, nrows_c, ncols_c, error)
302 subroutine elpa_hermitian_multiply_d_ptr_&
304 &_c(handle, uplo_a, uplo_c, ncb, a_p, b_p, nrows_b, &
305 ncols_b, c_p, nrows_c, ncols_c, error) &
307#ifdef DOUBLE_PRECISION_REAL
308 bind(C, name="elpa_hermitian_multiply_d_ptr_d")
310#ifdef SINGLE_PRECISION_REAL
311 bind(C, name="elpa_hermitian_multiply_d_ptr_f")
315#ifdef DOUBLE_PRECISION_COMPLEX
316 bind(C, name="elpa_hermitian_multiply_d_ptr_dc")
318#ifdef SINGLE_PRECISION_COMPLEX
319 bind(C, name="elpa_hermitian_multiply_d_ptr_fc")
323 type(c_ptr),
intent(in),
value :: handle, a_p, b_p, c_p
324 character(1,C_CHAR),
value :: uplo_a, uplo_c
325 integer(kind=c_int),
value :: ncb, nrows_b, ncols_b, nrows_c, ncols_c
326#ifdef USE_FORTRAN2008
327 integer(kind=c_int),
optional,
intent(in) :: error
329 integer(kind=c_int),
intent(in) :: error
331 type(elpa_impl_t),
pointer :: self
333 call c_f_pointer(handle, self)
336 call elpa_hermitian_multiply_d_ptr_&
338 & (self, uplo_a, uplo_c, ncb, a_p, b_p, nrows_b, &
339 ncols_b, c_p, nrows_c, ncols_c, error)
420 subroutine elpa_choleksy_a_h_a_&
422 &_c(handle, a_p, error) &
424#ifdef DOUBLE_PRECISION_REAL
425 bind(C, name="elpa_cholesky_a_h_a_d")
427#ifdef SINGLE_PRECISION_REAL
428 bind(C, name="elpa_cholesky_a_h_a_f")
432#ifdef DOUBLE_PRECISION_COMPLEX
433 bind(C, name="elpa_cholesky_a_h_a_dc")
435#ifdef SINGLE_PRECISION_COMPLEX
436 bind(C, name="elpa_cholesky_a_h_a_fc")
440 type(c_ptr),
intent(in),
value :: handle, a_p
441#ifdef USE_FORTRAN2008
442 integer(kind=c_int),
optional,
intent(in) :: error
444 integer(kind=c_int),
intent(in) :: error
446 math_datatype(kind=c_datatype_kind),
pointer :: a(:, :)
447 type(elpa_impl_t),
pointer :: self
449 call c_f_pointer(handle, self)
450 call c_f_pointer(a_p, a, [self%local_nrows, self%local_ncols])
452 call elpa_cholesky_a_h_a_&
648 subroutine elpa_invert_trm_a_h_a_&
650 &_c(handle, a_p, error) &
652#ifdef DOUBLE_PRECISION_REAL
653 bind(C, name="elpa_invert_trm_a_h_a_d")
655#ifdef SINGLE_PRECISION_REAL
656 bind(C, name="elpa_invert_trm_a_h_a_f")
660#ifdef DOUBLE_PRECISION_COMPLEX
661 bind(C, name="elpa_invert_trm_a_h_a_dc")
663#ifdef SINGLE_PRECISION_COMPLEX
664 bind(C, name="elpa_invert_trm_a_h_a_fc")
668 type(c_ptr),
intent(in),
value :: handle, a_p
669#ifdef USE_FORTRAN2008
670 integer(kind=c_int),
optional,
intent(in) :: error
672 integer(kind=c_int),
intent(in) :: error
674 math_datatype(kind=c_datatype_kind),
pointer :: a(:, :)
675 type(elpa_impl_t),
pointer :: self
677 call c_f_pointer(handle, self)
678 call c_f_pointer(a_p, a, [self%local_nrows, self%local_ncols])
680 call elpa_invert_trm_a_h_a_&
814 subroutine elpa_solve_tridiagonal_&
816 & (self, d, e, q, error)
819 class(elpa_impl_t) :: self
820 real(kind=c_real_datatype) :: d(self%na), e(self%na)
821#ifdef USE_ASSUMED_SIZE
822 real(kind=c_real_datatype) :: q(self%local_nrows,*)
824 real(kind=c_real_datatype) :: q(self%local_nrows,self%local_ncols)
826#ifdef USE_FORTRAN2008
827 integer,
optional :: error
833#if defined(INCLUDE_ROUTINES)
834 success_l = elpa_solve_tridi_&
836 &_impl(self, d, e, q)
838 write(error_unit,*)
"ELPA is not compiled with single-precision support"
839#ifdef USE_FORTRAN2008
840 if (
present(error))
then
851#ifdef USE_FORTRAN2008
852 if (
present(error))
then
858 else if (.not. success_l)
then
859 write(error_unit,
'(a)')
"ELPA: Error in solve_tridiagonal() and you did not check for errors!"
878 subroutine elpa_solve_tridiagonal_&
880 &_c(handle, d_p, e_p, q_p, error) &
882#ifdef DOUBLE_PRECISION_REAL
883 bind(C, name="elpa_solve_tridiagonal_d")
885#ifdef SINGLE_PRECISION_REAL
886 bind(C, name="elpa_solve_tridiagonal_f")
890#ifdef DOUBLE_PRECISION_COMPLEX
893#ifdef SINGLE_PRECISION_COMPLEX
898 type(c_ptr),
intent(in),
value :: handle, d_p, e_p, q_p
899#ifdef USE_FORTRAN2008
900 integer(kind=c_int),
optional,
intent(in) :: error
902 integer(kind=c_int),
intent(in) :: error
904 real(kind=c_real_datatype),
pointer :: d(:), e(:), q(:, :)
905 type(elpa_impl_t),
pointer :: self
907 call c_f_pointer(handle, self)
908 call c_f_pointer(d_p, d, [self%na])
909 call c_f_pointer(e_p, e, [self%na])
910 call c_f_pointer(q_p, q, [self%local_nrows, self%local_ncols])
912 call elpa_solve_tridiagonal_&
914 & (self, d, e, q, error)