82subroutine elpa_generalized_eigenvectors_a_h_a_&
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)
99 logical :: is_already_decomposed
100 integer,
optional :: error
104 integer(kind=c_int) :: solver
109#if defined(INCLUDE_ROUTINES)
110 call self%elpa_transform_generalized_a_h_a_&
112 & (a, b, q, is_already_decomposed, error_l)
115 if (
present(error))
then
117 else if (error_l .ne. elpa_ok)
then
118 write(error_unit,
'(a)')
"ELPA: Error in elpa_transform_generalized_a_h_a() and you did not check for errors!"
121 call self%get(
"solver", solver,error_l)
122 if (solver .eq. elpa_solver_1stage)
then
123#if defined(INCLUDE_ROUTINES)
124 success_l = elpa_solve_evp_&
128 &_impl(self, a, ev, q)
130 else if (solver .eq. elpa_solver_2stage)
then
131#if defined(INCLUDE_ROUTINES)
132 success_l = elpa_solve_evp_&
136 &_impl(self, a, ev, q)
139 write(error_unit,
'(a)')
"Unknown solver: Aborting!"
140#ifdef USE_FORTRAN2008
141 if (
present(error))
then
153 if (
present(error))
then
159 else if (.not. success_l)
then
160 write(error_unit,
'(a)')
"ELPA: Error in solve() and you did not check for errors!"
163#if defined(INCLUDE_ROUTINES)
164 call self%elpa_transform_back_generalized_a_h_a_&
169 if (
present(error))
then
171 else if (error_l .ne. elpa_ok)
then
172 write(error_unit,
'(a)')
"ELPA: Error in transform_back_generalized_a_h_a() and you did not check for errors!"
198 subroutine elpa_generalized_eigenvectors_a_h_a_&
200 &_c(handle, a_p, b_p, ev_p, q_p, is_already_decomposed, error) &
202#ifdef DOUBLE_PRECISION_REAL
203 bind(C, name="elpa_generalized_eigenvectors_a_h_a_d")
205#ifdef SINGLE_PRECISION_REAL
206 bind(C, name="elpa_generalized_eigenvectors_a_h_a_f")
210#ifdef DOUBLE_PRECISION_COMPLEX
211 bind(C, name="elpa_generalized_eigenvectors_a_h_a_dc")
213#ifdef SINGLE_PRECISION_COMPLEX
214 bind(C, name="elpa_generalized_eigenvectors_a_h_a_fc")
217 type(c_ptr),
intent(in),
value :: handle, a_p, b_p, ev_p, q_p
218 integer(kind=c_int),
intent(in),
value :: is_already_decomposed
219#ifdef USE_FORTRAN2008
220 integer(kind=c_int),
optional,
intent(in) :: error
222 integer(kind=c_int),
intent(in) :: error
224 math_datatype(kind=c_datatype_kind),
pointer :: a(:, :), b(:, :), q(:, :)
225 real(kind=c_real_datatype),
pointer :: ev(:)
226 logical :: is_already_decomposed_fortran
227 type(elpa_impl_t),
pointer :: self
229 call c_f_pointer(handle, self)
230 call c_f_pointer(a_p, a, [self%local_nrows, self%local_ncols])
231 call c_f_pointer(b_p, b, [self%local_nrows, self%local_ncols])
232 call c_f_pointer(ev_p, ev, [self%na])
233 call c_f_pointer(q_p, q, [self%local_nrows, self%local_ncols])
234 if(is_already_decomposed .eq. 0)
then
235 is_already_decomposed_fortran = .false.
237 is_already_decomposed_fortran = .true.
240 call elpa_generalized_eigenvectors_a_h_a_&
242 & (self, a, b, ev, q, is_already_decomposed_fortran, error)
281subroutine elpa_generalized_eigenvectors_d_ptr_&
283 & (self, adev, bdev, evdev, qdev, is_already_decomposed, error)
286 use elpa_utilities,
only : error_unit
289 use mod_query_gpu_usage
290 use mod_check_for_gpu
291 use,
intrinsic :: iso_c_binding
292 class(elpa_impl_t) :: self
294 type(c_ptr) :: aDev, bDev, evDev, qDev
296 logical :: is_already_decomposed
297 integer,
optional :: error
300 logical :: success_l, wantDebug
301 integer(kind=c_int) :: solver, debug
303 logical :: useGPU, successGPU
304 integer(kind=c_int) :: myid, numberOfGPUDevices
308 if (
present(error))
then
312 call self%get(
"debug", debug, error_l)
313 if (error_l .ne. elpa_ok)
then
314 write(error_unit,*)
"elpa_generalized_eigenvectors_d_ptr: Problem getting option for debug settings. Aborting..."
316 wantdebug = (debug == 1)
320#if defined(WITH_NVIDIA_GPU_VERSION) || defined(WITH_AMD_GPU_VERSION) || defined(WITH_OPENMP_OFFLOAD_GPU_VERSION) || defined(WITH_SYCL_GPU_VERSION)
321 if (.not.(query_gpu_usage(self,
"elpa_generalized_eigenvectors_d_ptr", usegpu)))
then
322 write(error_unit,*)
"elpa_generalized_eigenvectors_d_ptr: Problem getting options for GPU. Aborting..."
327 myid = self%mpi_setup%myRank_comm_parent
328 call self%timer%start(
"check_for_gpu")
330 if (check_for_gpu(self, myid, numberofgpudevices, wantdebug=wantdebug))
then
333 write(error_unit, *)
"GPUs are requested but not detected! Aborting..."
334 call self%timer%stop(
"check_for_gpu")
337 call self%timer%stop(
"check_for_gpu")
341#if defined(INCLUDE_ROUTINES)
342 call self%elpa_transform_generalized_d_ptr_&
344 & (adev, bdev, qdev, is_already_decomposed, error_l)
347 if (
present(error))
then
349 else if (error_l .ne. elpa_ok)
then
350 write(error_unit,
'(a)')
"ELPA: Error in transform_generalized() and you did not check for errors!"
353 call self%get(
"solver", solver,error_l)
354 if (solver .eq. elpa_solver_1stage)
then
355#if defined(INCLUDE_ROUTINES)
356 success_l = elpa_solve_evp_&
360 &_impl(self, adev, evdev, qdev)
362 else if (solver .eq. elpa_solver_2stage)
then
363#if defined(INCLUDE_ROUTINES)
364 success_l = elpa_solve_evp_&
368 &_impl(self, adev, evdev, qdev)
371 write(error_unit,
'(a)')
"Unknown solver: Aborting!"
372#ifdef USE_FORTRAN2008
373 if (
present(error))
then
385 if (
present(error))
then
391 else if (.not. success_l)
then
392 write(error_unit,
'(a)')
"ELPA: Error in solve() and you did not check for errors!"
395#if defined(INCLUDE_ROUTINES)
396 call self%elpa_transform_back_generalized_d_ptr_&
398 & (bdev, qdev, adev, error_l)
401 if (
present(error))
then
403 else if (error_l .ne. elpa_ok)
then
404 write(error_unit,
'(a)')
"ELPA: Error in transform_back_generalized_d_ptr() and you did not check for errors!"
428 subroutine elpa_generalized_eigenvectors_d_ptr_&
430 &_c(handle, a_p, b_p, ev_p, q_p, is_already_decomposed, error) &
432#ifdef DOUBLE_PRECISION_REAL
433 bind(C, name="elpa_generalized_eigenvectors_d_ptr_d")
435#ifdef SINGLE_PRECISION_REAL
436 bind(C, name="elpa_generalized_eigenvectors_d_ptr_f")
440#ifdef DOUBLE_PRECISION_COMPLEX
441 bind(C, name="elpa_generalized_eigenvectors_d_ptr_dc")
443#ifdef SINGLE_PRECISION_COMPLEX
444 bind(C, name="elpa_generalized_eigenvectors_d_ptr_fc")
447 type(c_ptr),
intent(in),
value :: handle, a_p, b_p, ev_p, q_p
448 integer(kind=c_int),
intent(in),
value :: is_already_decomposed
449#ifdef USE_FORTRAN2008
450 integer(kind=c_int),
optional,
intent(in) :: error
452 integer(kind=c_int),
intent(in) :: error
456 logical :: is_already_decomposed_fortran
457 type(elpa_impl_t),
pointer :: self
459 call c_f_pointer(handle, self)
464 if(is_already_decomposed .eq. 0)
then
465 is_already_decomposed_fortran = .false.
467 is_already_decomposed_fortran = .true.
470 call elpa_generalized_eigenvectors_d_ptr_&
472 & (self, a_p, b_p, ev_p, q_p, is_already_decomposed_fortran, error)
506 subroutine elpa_generalized_eigenvalues_a_h_a_&
508 & (self, a, b, ev, is_already_decomposed, error)
511 use elpa_utilities,
only : error_unit, check_alloc, check_allocate_f
513 use,
intrinsic :: iso_c_binding
514 class(elpa_impl_t) :: self
516#ifdef USE_ASSUMED_SIZE
517 math_datatype(kind=c_datatype_kind) :: a(self%local_nrows, *), b(self%local_nrows, *)
519 math_datatype(kind=c_datatype_kind) :: a(self%local_nrows, self%local_ncols), b(self%local_nrows, self%local_ncols)
521 real(kind=c_real_datatype) :: ev(self%na)
522 logical :: is_already_decomposed
524 integer,
optional :: error
526 integer(kind=c_int) :: solver
529 integer(kind=ik) :: istat
530 character(200) :: errorMessage
531 math_datatype(kind=c_datatype_kind),
allocatable :: tmp(:,:)
536 allocate(tmp(self%local_nrows, self%local_ncols), stat=istat, errmsg=errormessage)
537 check_allocate(
"elpa_generalized_eigenvalues_a_h_a: tmp", istat, errormessage)
539#if defined(INCLUDE_ROUTINES)
540 call self%elpa_transform_generalized_a_h_a_&
542 & (a, b, tmp, is_already_decomposed, error_l)
544 if (
present(error))
then
546 else if (error_l .ne. elpa_ok)
then
547 write(error_unit,
'(a)')
"ELPA: Error in transform_generalized() and you did not check for errors!"
550 deallocate(tmp, stat=istat, errmsg=errormessage)
551 check_deallocate(
"elpa_generalized_eigenvalues_a_h_a: tmp", istat, errormessage)
553 call self%get(
"solver", solver,error_l)
554 if (solver .eq. elpa_solver_1stage)
then
555#if defined(INCLUDE_ROUTINES)
556 success_l = elpa_solve_evp_&
562 else if (solver .eq. elpa_solver_2stage)
then
563#if defined(INCLUDE_ROUTINES)
564 success_l = elpa_solve_evp_&
571 write(error_unit,
'(a)')
"Unknown solver: Aborting!"
572#ifdef USE_FORTRAN2008
573 if (
present(error))
then
585 if (
present(error))
then
591 else if (.not. success_l)
then
592 write(error_unit,
'(a)')
"ELPA: Error in solve() and you did not check for errors!"
617 subroutine elpa_generalized_eigenvalues_a_h_a_&
619 &_c(handle, a_p, b_p, ev_p, is_already_decomposed, error) &
621#ifdef DOUBLE_PRECISION_REAL
622 bind(C, name="elpa_generalized_eigenvalues_a_h_a_d")
624#ifdef SINGLE_PRECISION_REAL
625 bind(C, name="elpa_generalized_eigenvalues_a_h_a_f")
629#ifdef DOUBLE_PRECISION_COMPLEX
630 bind(C, name="elpa_generalized_eigenvalues_a_h_a_dc")
632#ifdef SINGLE_PRECISION_COMPLEX
633 bind(C, name="elpa_generalized_eigenvalues_a_h_a_fc")
636 type(c_ptr),
intent(in),
value :: handle, a_p, b_p, ev_p
637 integer(kind=c_int),
intent(in),
value :: is_already_decomposed
638#ifdef USE_FORTRAN2008
639 integer(kind=c_int),
optional,
intent(in) :: error
641 integer(kind=c_int),
intent(in) :: error
644 math_datatype(kind=c_datatype_kind),
pointer :: a(:, :), b(:, :)
645 real(kind=c_real_datatype),
pointer :: ev(:)
646 logical :: is_already_decomposed_fortran
647 type(elpa_impl_t),
pointer :: self
649 call c_f_pointer(handle, self)
650 call c_f_pointer(a_p, a, [self%local_nrows, self%local_ncols])
651 call c_f_pointer(b_p, b, [self%local_nrows, self%local_ncols])
652 call c_f_pointer(ev_p, ev, [self%na])
653 if(is_already_decomposed .eq. 0)
then
654 is_already_decomposed_fortran = .false.
656 is_already_decomposed_fortran = .true.
659 call elpa_generalized_eigenvalues_a_h_a_&
661 & (self, a, b, ev, is_already_decomposed_fortran, error)
694subroutine elpa_generalized_eigenvalues_d_ptr_&
696 & (self, adev, bdev, evdev, is_already_decomposed, error)
699 use elpa_utilities,
only : error_unit
701 use mod_query_gpu_usage
702 use mod_check_for_gpu
704 use,
intrinsic :: iso_c_binding
705 class(elpa_impl_t) :: self
707 type(c_ptr) :: aDev, bDev, evDev
708 type(c_ptr) :: tmpDev
710 logical :: is_already_decomposed
711 integer,
optional :: error
714 logical :: success_l, wantDebug
715 integer(kind=c_int) :: solver, debug
717 logical :: useGPU, successGPU
718 integer(kind=c_int) :: myid, numberOfGPUDevices
719 integer(kind=c_intptr_t),
parameter :: size_of_datatype = size_of_&
726 if (
present(error))
then
730 call self%get(
"debug", debug, error_l)
731 if (error_l .ne. elpa_ok)
then
732 write(error_unit,*)
"elpa_generalized_eigenvalues_d_ptr: Problem getting option for debug settings. Aborting..."
734 wantdebug = (debug == 1)
738#if defined(WITH_NVIDIA_GPU_VERSION) || defined(WITH_AMD_GPU_VERSION) || defined(WITH_OPENMP_OFFLOAD_GPU_VERSION) || defined(WITH_SYCL_GPU_VERSION)
739 if (.not.(query_gpu_usage(self,
"elpa_generalized_eigenvalues_d_ptr", usegpu)))
then
740 write(error_unit,*)
"elpa_generalized_eigenvalues_d_ptr: Problem getting options for GPU. Aborting..."
746 myid = self%mpi_setup%myRank_comm_parent
747 call self%timer%start(
"check_for_gpu")
749 if (check_for_gpu(self, myid, numberofgpudevices, wantdebug=wantdebug))
then
752 write(error_unit, *)
"GPUs are requested but not detected! Aborting..."
753 call self%timer%stop(
"check_for_gpu")
757 call self%timer%stop(
"check_for_gpu")
761 successgpu = gpu_malloc(tmpdev, self%local_ncols*self%local_nrows * size_of_datatype)
762 check_alloc_gpu(
"elpa_generalized_eigenvalues_d_ptr tmpDev", successgpu)
764#if defined(INCLUDE_ROUTINES)
765 call self%elpa_transform_generalized_d_ptr_&
767 & (adev, bdev, tmpdev, is_already_decomposed, error_l)
770 if (
present(error))
then
772 else if (error_l .ne. elpa_ok)
then
773 write(error_unit,
'(a)')
"ELPA: Error in elpa_generalized_eigenvalues_d_ptr() and you did not check for errors!"
776 successgpu = gpu_free(tmpdev)
777 check_dealloc_gpu(
"elpa_generalized_eigenvalues_d_ptr tmpDev", successgpu)
779 call self%get(
"solver", solver,error_l)
780 if (solver .eq. elpa_solver_1stage)
then
781#if defined(INCLUDE_ROUTINES)
782 success_l = elpa_solve_evp_&
786 &_impl(self, adev, evdev)
788 else if (solver .eq. elpa_solver_2stage)
then
789#if defined(INCLUDE_ROUTINES)
790 success_l = elpa_solve_evp_&
794 &_impl(self, adev, evdev)
797 write(error_unit,
'(a)')
"Unknown solver: Aborting!"
798#ifdef USE_FORTRAN2008
799 if (
present(error))
then
811 if (
present(error))
then
817 else if (.not. success_l)
then
818 write(error_unit,
'(a)')
"ELPA: Error in solve() and you did not check for errors!"
843 subroutine elpa_generalized_eigenvalues_d_ptr_&
845 &_c(handle, a_p, b_p, ev_p, is_already_decomposed, error) &
847#ifdef DOUBLE_PRECISION_REAL
848 bind(C, name="elpa_generalized_eigenvalues_d_ptr_d")
850#ifdef SINGLE_PRECISION_REAL
851 bind(C, name="elpa_generalized_eigenvalues_d_ptr_f")
855#ifdef DOUBLE_PRECISION_COMPLEX
856 bind(C, name="elpa_generalized_eigenvalues_d_ptr_dc")
858#ifdef SINGLE_PRECISION_COMPLEX
859 bind(C, name="elpa_generalized_eigenvalues_d_ptr_fc")
862 type(c_ptr),
intent(in),
value :: handle, a_p, b_p, ev_p
863 integer(kind=c_int),
intent(in),
value :: is_already_decomposed
864#ifdef USE_FORTRAN2008
865 integer(kind=c_int),
optional,
intent(in) :: error
867 integer(kind=c_int),
intent(in) :: error
872 logical :: is_already_decomposed_fortran
873 type(elpa_impl_t),
pointer :: self
875 call c_f_pointer(handle, self)
879 if(is_already_decomposed .eq. 0)
then
880 is_already_decomposed_fortran = .false.
882 is_already_decomposed_fortran = .true.
885 call elpa_generalized_eigenvalues_d_ptr_&
887 & (self, a_p, b_p, ev_p, is_already_decomposed_fortran, error)