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", &
200 use_sp=matrix_in%use_sp)
202 &
"SOLVE", transa=
"T")
204 &
"SOLVE", transa=
"N")
207 CALL timestop(handle)
209 END SUBROUTINE apply_full_direct
217 SUBROUTINE apply_full_all(preconditioner_env, matrix_in, matrix_out)
220 TYPE(
cp_fm_type),
INTENT(IN) :: matrix_in, matrix_out
222 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_full_all'
224 INTEGER :: handle, i, j, k, n, ncol_local, &
226 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
228 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :), &
229 POINTER :: local_data
232 CALL timeset(routinen, handle)
236 CALL cp_fm_create(matrix_tmp, matrix_in%matrix_struct, name=
"apply_full_all")
237 CALL cp_fm_get_info(matrix_tmp, nrow_local=nrow_local, ncol_local=ncol_local, &
238 row_indices=row_indices, col_indices=col_indices, local_data=local_data)
241 CALL parallel_gemm(
'T',
'N', n, k, n, 1.0_dp, preconditioner_env%fm, &
242 matrix_in, 0.0_dp, matrix_tmp)
247 dum = 1.0_dp/max(preconditioner_env%energy_gap, &
248 preconditioner_env%full_evals(row_indices(i)) - preconditioner_env%occ_evals(col_indices(j)))
249 local_data(i, j) = local_data(i, j)*dum
254 CALL parallel_gemm(
'N',
'N', n, k, n, 1.0_dp, preconditioner_env%fm, &
255 matrix_tmp, 0.0_dp, matrix_out)
259 CALL timestop(handle)
261 END SUBROUTINE apply_full_all
269 SUBROUTINE apply_all(preconditioner_env, matrix_in, matrix_out)
274 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_all'
276 INTEGER :: col, col_offset, col_size, handle, i, j, &
277 row, row_offset, row_size
279 REAL(kind=
dp),
DIMENSION(:, :),
POINTER ::
DATA
283 CALL timeset(routinen, handle)
285 CALL dbcsr_copy(matrix_tmp, matrix_in, name=
"apply_full_all")
286 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, preconditioner_env%dbcsr_matrix, &
287 matrix_in, 0.0_dp, matrix_tmp)
292 row_size=row_size, col_size=col_size, &
293 row_offset=row_offset, col_offset=col_offset)
296 dum = 1.0_dp/max(preconditioner_env%energy_gap, &
297 preconditioner_env%full_evals(row_offset + i - 1) &
298 - preconditioner_env%occ_evals(col_offset + j - 1))
299 DATA(i, j) =
DATA(i, j)*dum
306 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, preconditioner_env%dbcsr_matrix, &
307 matrix_tmp, 0.0_dp, matrix_out)
309 CALL timestop(handle)
311 END SUBROUTINE apply_all
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
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_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_release(matrix)
...
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_restore(matrix, neig, matrixb, matrixout, op, pos, transa)
...
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, use_sp)
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)
...