35#include "./base/base_uses.f90"
40 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'preconditioner_apply'
55 TYPE(
cp_fm_type),
INTENT(IN) :: matrix_in, matrix_out
57 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_preconditioner_fm'
61 CALL timeset(routinen, handle)
63 SELECT CASE (preconditioner_env%in_use)
65 cpabort(
"No preconditioner in use")
67 CALL apply_full_single(preconditioner_env, matrix_in, matrix_out)
69 CALL apply_full_all(preconditioner_env, matrix_in, matrix_out)
71 SELECT CASE (preconditioner_env%solver)
73 CALL apply_full_single(preconditioner_env, matrix_in, matrix_out)
75 CALL apply_full_direct(preconditioner_env, matrix_in, matrix_out)
77 cpabort(
"Solver not implemented")
80 cpabort(
"Unknown preconditioner")
98 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_preconditioner_dbcsr'
102 CALL timeset(routinen, handle)
104 SELECT CASE (preconditioner_env%in_use)
106 cpabort(
"No preconditioner in use")
108 CALL apply_single(preconditioner_env, matrix_in, matrix_out)
110 CALL apply_all(preconditioner_env, matrix_in, matrix_out)
112 SELECT CASE (preconditioner_env%solver)
114 CALL apply_single(preconditioner_env, matrix_in, matrix_out)
116 cpabort(
"Apply_full_direct not supported with ot")
119 cpabort(
"Wrong solver")
122 cpabort(
"Wrong preconditioner")
125 CALL timestop(handle)
135 SUBROUTINE apply_full_single(preconditioner_env, matrix_in, matrix_out)
138 TYPE(
cp_fm_type),
INTENT(IN) :: matrix_in, matrix_out
140 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_full_single'
142 INTEGER :: handle, k, n
144 CALL timeset(routinen, handle)
147 CALL parallel_gemm(
'N',
'N', n, k, n, 1.0_dp, preconditioner_env%fm, &
148 matrix_in, 0.0_dp, matrix_out)
149 CALL timestop(handle)
151 END SUBROUTINE apply_full_single
159 SUBROUTINE apply_single(preconditioner_env, matrix_in, matrix_out)
164 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_single'
168 CALL timeset(routinen, handle)
170 IF (.NOT.
ASSOCIATED(preconditioner_env%dbcsr_matrix)) &
171 cpabort(
"NOT ASSOCIATED preconditioner_env%dbcsr_matrix")
172 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, preconditioner_env%dbcsr_matrix, matrix_in, &
175 CALL timestop(handle)
177 END SUBROUTINE apply_single
186 SUBROUTINE apply_full_direct(preconditioner_env, matrix_in, matrix_out)
189 TYPE(
cp_fm_type),
INTENT(IN) :: matrix_in, matrix_out
191 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_full_direct'
193 INTEGER :: handle, k, n
196 CALL timeset(routinen, handle)
199 CALL cp_fm_create(work, matrix_in%matrix_struct, name=
"apply_full_single")
201 &
"SOLVE", transa=
"T")
203 &
"SOLVE", transa=
"N")
206 CALL timestop(handle)
208 END SUBROUTINE apply_full_direct
216 SUBROUTINE apply_full_all(preconditioner_env, matrix_in, matrix_out)
219 TYPE(
cp_fm_type),
INTENT(IN) :: matrix_in, matrix_out
221 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_full_all'
223 INTEGER :: handle, i, j, k, n, ncol_local, &
225 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
227 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :), &
228 POINTER :: local_data
231 CALL timeset(routinen, handle)
235 CALL cp_fm_create(matrix_tmp, matrix_in%matrix_struct, name=
"apply_full_all")
236 CALL cp_fm_get_info(matrix_tmp, nrow_local=nrow_local, ncol_local=ncol_local, &
237 row_indices=row_indices, col_indices=col_indices, local_data=local_data)
240 CALL parallel_gemm(
'T',
'N', n, k, n, 1.0_dp, preconditioner_env%fm, &
241 matrix_in, 0.0_dp, matrix_tmp)
246 dum = 1.0_dp/max(preconditioner_env%energy_gap, &
247 preconditioner_env%full_evals(row_indices(i)) - preconditioner_env%occ_evals(col_indices(j)))
248 local_data(i, j) = local_data(i, j)*dum
253 CALL parallel_gemm(
'N',
'N', n, k, n, 1.0_dp, preconditioner_env%fm, &
254 matrix_tmp, 0.0_dp, matrix_out)
258 CALL timestop(handle)
260 END SUBROUTINE apply_full_all
268 SUBROUTINE apply_all(preconditioner_env, matrix_in, matrix_out)
273 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_all'
275 INTEGER :: col, col_offset, col_size, handle, i, j, &
276 row, row_offset, row_size
278 REAL(kind=
dp),
DIMENSION(:, :),
POINTER ::
DATA
282 CALL timeset(routinen, handle)
284 CALL dbcsr_copy(matrix_tmp, matrix_in, name=
"apply_full_all")
285 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, preconditioner_env%dbcsr_matrix, &
286 matrix_in, 0.0_dp, matrix_tmp)
291 row_size=row_size, col_size=col_size, &
292 row_offset=row_offset, col_offset=col_offset)
295 dum = 1.0_dp/max(preconditioner_env%energy_gap, &
296 preconditioner_env%full_evals(row_offset + i - 1) &
297 - preconditioner_env%occ_evals(col_offset + j - 1))
298 DATA(i, j) =
DATA(i, j)*dum
305 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, preconditioner_env%dbcsr_matrix, &
306 matrix_tmp, 0.0_dp, matrix_out)
308 CALL timestop(handle)
310 END SUBROUTINE apply_all
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_release(matrix)
...
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_restore(fm_matrix, neig, fm_matrixb, fm_matrixout, op, pos, transa)
apply Cholesky decomposition op can be "SOLVE" (out = U^-1 * in) or "MULTIPLY" (out = U * in) pos can...
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
Defines the basic variable types.
integer, parameter, public dp
basic linear algebra operations for full matrixes
computes preconditioners, and implements methods to apply them currently used in qs_ot
subroutine, public apply_preconditioner_fm(preconditioner_env, matrix_in, matrix_out)
applies a previously created preconditioner to a full matrix
subroutine, public apply_preconditioner_dbcsr(preconditioner_env, matrix_in, matrix_out)
...