82 subroutine elpa_generalized_eigenvectors_&
84 & (self, a, b, ev, q, is_already_decomposed, error)
87 use elpa_utilities,
only : error_unit
88 use,
intrinsic :: iso_c_binding
89 class(elpa_impl_t) :: self
91#ifdef USE_ASSUMED_SIZE
92 math_datatype(kind=c_datatype_kind) :: a(self%local_nrows, *), b(self%local_nrows, *), q(self%local_nrows, *)
94 math_datatype(kind=c_datatype_kind) :: a(self%local_nrows, self%local_ncols), b(self%local_nrows, self%local_ncols), &
95 q(self%local_nrows, self%local_ncols)
97 real(kind=c_real_datatype) :: ev(self%na)
98 logical :: is_already_decomposed
100 integer,
optional :: error
102 integer(kind=c_int) :: solver
107#if defined(INCLUDE_ROUTINES)
108 call self%elpa_transform_generalized_&
110 & (a, b, is_already_decomposed, error_l)
112 if (
present(error))
then
114 else if (error_l .ne. elpa_ok)
then
115 write(error_unit,
'(a)')
"ELPA: Error in transform_generalized() and you did not check for errors!"
118 call self%get(
"solver", solver,error_l)
119 if (solver .eq. elpa_solver_1stage)
then
120#if defined(INCLUDE_ROUTINES)
121 success_l = elpa_solve_evp_&
125 &_impl(self, a, ev, q)
127 else if (solver .eq. elpa_solver_2stage)
then
128#if defined(INCLUDE_ROUTINES)
129 success_l = elpa_solve_evp_&
133 &_impl(self, a, ev, q)
136 write(error_unit,
'(a)')
"Unknown solver: Aborting!"
137#ifdef USE_FORTRAN2008
138 if (
present(error))
then
150 if (
present(error))
then
156 else if (.not. success_l)
then
157 write(error_unit,
'(a)')
"ELPA: Error in solve() and you did not check for errors!"
160#if defined(INCLUDE_ROUTINES)
161 call self%elpa_transform_back_generalized_&
165 if (
present(error))
then
167 else if (error_l .ne. elpa_ok)
then
168 write(error_unit,
'(a)')
"ELPA: Error in transform_back_generalized() and you did not check for errors!"
194 subroutine elpa_generalized_eigenvectors_&
196 &_c(handle, a_p, b_p, ev_p, q_p, is_already_decomposed, error) &
198#ifdef DOUBLE_PRECISION_REAL
199 bind(C, name="elpa_generalized_eigenvectors_d")
201#ifdef SINGLE_PRECISION_REAL
202 bind(C, name="elpa_generalized_eigenvectors_f")
206#ifdef DOUBLE_PRECISION_COMPLEX
207 bind(C, name="elpa_generalized_eigenvectors_dc")
209#ifdef SINGLE_PRECISION_COMPLEX
210 bind(C, name="elpa_generalized_eigenvectors_fc")
213 type(c_ptr),
intent(in),
value :: handle, a_p, b_p, ev_p, q_p
214 integer(kind=c_int),
intent(in),
value :: is_already_decomposed
215#ifdef USE_FORTRAN2008
216 integer(kind=c_int),
optional,
intent(in) :: error
218 integer(kind=c_int),
intent(in) :: error
220 math_datatype(kind=c_datatype_kind),
pointer :: a(:, :), b(:, :), q(:, :)
221 real(kind=c_real_datatype),
pointer :: ev(:)
222 logical :: is_already_decomposed_fortran
223 type(elpa_impl_t),
pointer :: self
225 call c_f_pointer(handle, self)
226 call c_f_pointer(a_p, a, [self%local_nrows, self%local_ncols])
227 call c_f_pointer(b_p, b, [self%local_nrows, self%local_ncols])
228 call c_f_pointer(ev_p, ev, [self%na])
229 call c_f_pointer(q_p, q, [self%local_nrows, self%local_ncols])
230 if(is_already_decomposed .eq. 0)
then
231 is_already_decomposed_fortran = .false.
233 is_already_decomposed_fortran = .true.
236 call elpa_generalized_eigenvectors_&
238 & (self, a, b, ev, q, is_already_decomposed_fortran, error)
272 subroutine elpa_generalized_eigenvalues_&
274 & (self, a, b, ev, is_already_decomposed, error)
277 use elpa_utilities,
only : error_unit
278 use,
intrinsic :: iso_c_binding
279 class(elpa_impl_t) :: self
281#ifdef USE_ASSUMED_SIZE
282 math_datatype(kind=c_datatype_kind) :: a(self%local_nrows, *), b(self%local_nrows, *)
284 math_datatype(kind=c_datatype_kind) :: a(self%local_nrows, self%local_ncols), b(self%local_nrows, self%local_ncols)
286 real(kind=c_real_datatype) :: ev(self%na)
287 logical :: is_already_decomposed
289 integer,
optional :: error
291 integer(kind=c_int) :: solver
296#if defined(INCLUDE_ROUTINES)
297 call self%elpa_transform_generalized_&
299 & (a, b, is_already_decomposed, error_l)
301 if (
present(error))
then
303 else if (error_l .ne. elpa_ok)
then
304 write(error_unit,
'(a)')
"ELPA: Error in transform_generalized() and you did not check for errors!"
307 call self%get(
"solver", solver,error_l)
308 if (solver .eq. elpa_solver_1stage)
then
309#if defined(INCLUDE_ROUTINES)
310 success_l = elpa_solve_evp_&
316 else if (solver .eq. elpa_solver_2stage)
then
317#if defined(INCLUDE_ROUTINES)
318 success_l = elpa_solve_evp_&
325 write(error_unit,
'(a)')
"Unknown solver: Aborting!"
326#ifdef USE_FORTRAN2008
327 if (
present(error))
then
339 if (
present(error))
then
345 else if (.not. success_l)
then
346 write(error_unit,
'(a)')
"ELPA: Error in solve() and you did not check for errors!"
371 subroutine elpa_generalized_eigenvalues_&
373 &_c(handle, a_p, b_p, ev_p, is_already_decomposed, error) &
375#ifdef DOUBLE_PRECISION_REAL
376 bind(C, name="elpa_generalized_eigenvalues_d")
378#ifdef SINGLE_PRECISION_REAL
379 bind(C, name="elpa_generalized_eigenvalues_f")
383#ifdef DOUBLE_PRECISION_COMPLEX
384 bind(C, name="elpa_generalized_eigenvalues_dc")
386#ifdef SINGLE_PRECISION_COMPLEX
387 bind(C, name="elpa_generalized_eigenvalues_fc")
390 type(c_ptr),
intent(in),
value :: handle, a_p, b_p, ev_p
391 integer(kind=c_int),
intent(in),
value :: is_already_decomposed
392#ifdef USE_FORTRAN2008
393 integer(kind=c_int),
optional,
intent(in) :: error
395 integer(kind=c_int),
intent(in) :: error
398 math_datatype(kind=c_datatype_kind),
pointer :: a(:, :), b(:, :)
399 real(kind=c_real_datatype),
pointer :: ev(:)
400 logical :: is_already_decomposed_fortran
401 type(elpa_impl_t),
pointer :: self
403 call c_f_pointer(handle, self)
404 call c_f_pointer(a_p, a, [self%local_nrows, self%local_ncols])
405 call c_f_pointer(b_p, b, [self%local_nrows, self%local_ncols])
406 call c_f_pointer(ev_p, ev, [self%na])
407 if(is_already_decomposed .eq. 0)
then
408 is_already_decomposed_fortran = .false.
410 is_already_decomposed_fortran = .true.
413 call elpa_generalized_eigenvalues_&
415 & (self, a, b, ev, is_already_decomposed_fortran, error)