64 INTEGER,
INTENT(in),
OPTIONAL :: n
65 INTEGER,
INTENT(out),
OPTIONAL :: info_out
67 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_fm_cholesky_decompose'
69 INTEGER :: handle, info, my_n
70 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: a
71 REAL(kind=
sp),
DIMENSION(:, :),
POINTER :: a_sp
72#if defined(__parallel)
73 INTEGER,
DIMENSION(9) :: desca
76 CALL timeset(routinen, handle)
78 my_n = min(matrix%matrix_struct%nrow_global, &
79 matrix%matrix_struct%ncol_global)
85 a => matrix%local_data
86 a_sp => matrix%local_data_sp
88#if defined(__parallel)
89 desca(:) = matrix%matrix_struct%descriptor(:)
98 IF (matrix%use_sp)
THEN
105 IF (matrix%use_sp)
THEN
106 CALL pspotrf(
'U', my_n, a_sp(1, 1), 1, 1, desca, info)
108 CALL pdpotrf(
'U', my_n, a(1, 1), 1, 1, desca, info)
114 IF (matrix%use_sp)
THEN
115 CALL spotrf(
'U', my_n, a_sp(1, 1),
SIZE(a_sp, 1), info)
117 CALL dpotrf(
'U', my_n, a(1, 1),
SIZE(a, 1), info)
121 IF (
PRESENT(info_out))
THEN
123 ELSE IF (info /= 0)
THEN
124 CALL cp_abort(__location__, &
125 "Cholesky decompose failed: the matrix is not positive definite or ill-conditioned.")
128 CALL timestop(handle)
143 INTEGER,
INTENT(in),
OPTIONAL :: n
144 INTEGER,
INTENT(OUT),
OPTIONAL :: info_out
146 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_fm_cholesky_invert'
147 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: a
148 REAL(kind=
sp),
DIMENSION(:, :),
POINTER :: a_sp
149 INTEGER :: info, handle, my_n
150#if defined(__parallel)
151 INTEGER,
DIMENSION(9) :: desca
154 CALL timeset(routinen, handle)
156 my_n = min(matrix%matrix_struct%nrow_global, &
157 matrix%matrix_struct%ncol_global)
163 a => matrix%local_data
164 a_sp => matrix%local_data_sp
166#if defined(__parallel)
168 desca(:) = matrix%matrix_struct%descriptor(:)
178 IF (matrix%use_sp)
THEN
185 IF (matrix%use_sp)
THEN
186 CALL pspotri(
'U', my_n, a_sp(1, 1), 1, 1, desca, info)
188 CALL pdpotri(
'U', my_n, a(1, 1), 1, 1, desca, info)
196 IF (matrix%use_sp)
THEN
197 CALL spotri(
'U', my_n, a_sp(1, 1),
SIZE(a_sp, 1), info)
199 CALL dpotri(
'U', my_n, a(1, 1),
SIZE(a, 1), info)
204 IF (
PRESENT(info_out))
THEN
208 cpabort(
"Cholesky invert failed: the matrix is not positive definite or ill-conditioned.")
211 CALL timestop(handle)
287 TYPE(
cp_fm_type),
INTENT(IN) :: fm_matrix, fm_matrixb, fm_matrixout
288 INTEGER,
INTENT(IN) :: neig
289 CHARACTER(LEN=*),
INTENT(IN) :: op
290 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: pos
291 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: transa
293 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_fm_cholesky_restore'
294 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: a, b, outm
295 REAL(kind=
sp),
DIMENSION(:, :),
POINTER :: a_sp, b_sp, outm_sp
296 REAL(kind=
dp) :: alpha
297 INTEGER :: handle, mdim, n
298 CHARACTER :: chol_pos, chol_transa
299#if defined(__parallel)
301 INTEGER,
DIMENSION(9) :: desca, descb, descout
302#elif defined(__MKL) && (2025 <= __INTEL_MKL__)
303 REAL(kind=
dp) :: beta
306 CALL timeset(routinen, handle)
309 cpassert((op ==
"SOLVE") .OR. (op ==
"MULTIPLY"))
311 cpassert(fm_matrix%use_sp .EQV. fm_matrixb%use_sp)
312 cpassert(fm_matrix%use_sp .EQV. fm_matrixout%use_sp)
315 IF (
PRESENT(pos)) chol_pos = pos(1:1)
316 cpassert((chol_pos ==
'L') .OR. (chol_pos ==
'R'))
319 IF (
PRESENT(transa)) chol_transa = transa
322 a => fm_matrix%local_data
323 b => fm_matrixb%local_data
324 outm => fm_matrixout%local_data
325 a_sp => fm_matrix%local_data_sp
326 b_sp => fm_matrixb%local_data_sp
327 outm_sp => fm_matrixout%local_data_sp
328 n = fm_matrix%matrix_struct%nrow_global
329 mdim = merge(1, 2,
'L' .EQ. chol_pos)
332#if defined(__parallel)
333 desca(:) = fm_matrix%matrix_struct%descriptor(:)
334 descb(:) = fm_matrixb%matrix_struct%descriptor(:)
335 descout(:) = fm_matrixout%matrix_struct%descriptor(:)
337 IF (fm_matrix%use_sp)
THEN
338 CALL pscopy(n, a_sp(1, 1), 1, i, desca, 1, outm_sp(1, 1), 1, i, descout, 1)
340 CALL pdcopy(n, a(1, 1), 1, i, desca, 1, outm(1, 1), 1, i, descout, 1)
343 IF (op .EQ.
"SOLVE")
THEN
344 IF (fm_matrix%use_sp)
THEN
345 CALL pstrsm(chol_pos,
'U', chol_transa,
'N', n, neig, real(alpha,
sp), b_sp(1, 1), 1, 1, descb, &
346 outm_sp(1, 1), 1, 1, descout)
348 CALL pdtrsm(chol_pos,
'U', chol_transa,
'N', n, neig, alpha, b(1, 1), 1, 1, descb, outm(1, 1), 1, 1, descout)
351 IF (fm_matrix%use_sp)
THEN
352 CALL pstrmm(chol_pos,
'U', chol_transa,
'N', n, neig, real(alpha,
sp), b_sp(1, 1), 1, 1, descb, &
353 outm_sp(1, 1), 1, 1, descout)
355 CALL pdtrmm(chol_pos,
'U', chol_transa,
'N', n, neig, alpha, b(1, 1), 1, 1, descb, outm(1, 1), 1, 1, descout)
358#elif defined(__MKL) && (2025 <= __INTEL_MKL__)
360 IF (op .EQ.
"SOLVE")
THEN
361 IF (fm_matrix%use_sp)
THEN
362 CALL strsm_oop(chol_pos,
'U', chol_transa,
'N', n, neig, real(alpha,
sp), b_sp(1, 1),
SIZE(b_sp, mdim), a_sp(1, 1), n, real(beta,
sp), outm_sp(1, 1), n)
364 CALL dtrsm_oop(chol_pos,
'U', chol_transa,
'N', n, neig, alpha, b(1, 1),
SIZE(b, mdim), a(1, 1), n, beta, outm(1, 1), n)
367 IF (fm_matrix%use_sp)
THEN
368 CALL strmm_oop(chol_pos,
'U', chol_transa,
'N', n, neig, real(alpha,
sp), b_sp(1, 1),
SIZE(b_sp, mdim), a_sp(1, 1), n, real(beta,
sp), outm_sp(1, 1), n)
370 CALL dtrmm_oop(chol_pos,
'U', chol_transa,
'N', n, neig, alpha, b(1, 1),
SIZE(b, mdim), a(1, 1), n, beta, outm(1, 1), n)
374 IF (fm_matrix%use_sp)
THEN
375 CALL scopy(neig*n, a_sp(1, 1), 1, outm_sp(1, 1), 1)
377 CALL dcopy(neig*n, a(1, 1), 1, outm(1, 1), 1)
379 IF (op .EQ.
"SOLVE")
THEN
380 IF (fm_matrix%use_sp)
THEN
381 CALL strsm(chol_pos,
'U', chol_transa,
'N', n, neig, real(alpha,
sp), b_sp(1, 1),
SIZE(b_sp, mdim), outm_sp(1, 1), n)
383 CALL dtrsm(chol_pos,
'U', chol_transa,
'N', n, neig, alpha, b(1, 1),
SIZE(b, mdim), outm(1, 1), n)
386 IF (fm_matrix%use_sp)
THEN
387 CALL strmm(chol_pos,
'U', chol_transa,
'N', n, neig, real(alpha,
sp), b_sp(1, 1),
SIZE(b_sp, mdim), outm_sp(1, 1), n)
389 CALL dtrmm(chol_pos,
'U', chol_transa,
'N', n, neig, alpha, b(1, 1),
SIZE(b, mdim), outm(1, 1), n)
394 CALL timestop(handle)