(git:0de0cc2)
preconditioner_types.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief types of preconditioners
10 !> \par History
11 !> Separate types from construction and application
12 !> \author Joost VandeVondele (09.2002)
13 ! **************************************************************************************************
16  cp_blacs_env_type
17  USE cp_fm_types, ONLY: cp_fm_release,&
18  cp_fm_type
19  USE dbcsr_api, ONLY: dbcsr_deallocate_matrix,&
20  dbcsr_p_type,&
21  dbcsr_release_p,&
22  dbcsr_type
23  USE input_constants, ONLY: cholesky_reduce,&
25  USE kinds, ONLY: dp
27  mp_para_env_type
28 #include "./base/base_uses.f90"
29 
30  IMPLICIT NONE
31 
32  PRIVATE
33 
34  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'preconditioner_types'
35 
36  PUBLIC :: preconditioner_type, preconditioner_p_type
37  PUBLIC :: init_preconditioner
38  PUBLIC :: preconditioner_in_use
39  PUBLIC :: destroy_preconditioner
40 
41 ! **************************************************************************************************
42  TYPE preconditioner_type
43 ! PRIVATE
44  TYPE(dbcsr_type), POINTER :: sparse_matrix
45  TYPE(cp_fm_type), POINTER :: fm
46  TYPE(dbcsr_type), POINTER :: dbcsr_matrix
47  TYPE(dbcsr_type), POINTER :: max_ev_vector
48  TYPE(dbcsr_type), POINTER :: min_ev_vector
49  TYPE(dbcsr_p_type), POINTER, DIMENSION(:) :: inverse_history
50  TYPE(mp_para_env_type), POINTER :: para_env
51  TYPE(cp_blacs_env_type), POINTER :: ctxt
52  INTEGER :: in_use, solver, ihistory, cholesky_use
53  REAL(KIND=dp), DIMENSION(:), POINTER :: occ_evals, full_evals
54  REAL(KIND=dp) :: energy_gap
55  REAL(KIND=dp) :: condition_num
56  END TYPE preconditioner_type
57 
58 ! **************************************************************************************************
59  TYPE preconditioner_p_type
60  TYPE(preconditioner_type), POINTER :: preconditioner
61  END TYPE preconditioner_p_type
62 
63 CONTAINS
64 
65 ! **************************************************************************************************
66 
67 ! **************************************************************************************************
68 !> \brief ...
69 !> \param preconditioner ...
70 !> \return ...
71 ! **************************************************************************************************
72  FUNCTION preconditioner_in_use(preconditioner)
73  TYPE(preconditioner_type) :: preconditioner
74  LOGICAL :: preconditioner_in_use
75 
76  preconditioner_in_use = .NOT. (preconditioner%in_use .EQ. 0)
77  END FUNCTION
78 
79 ! **************************************************************************************************
80 !> \brief ...
81 !> \param preconditioner_env ...
82 !> \param para_env ...
83 !> \param blacs_env ...
84 ! **************************************************************************************************
85  SUBROUTINE init_preconditioner(preconditioner_env, para_env, blacs_env)
86 
87  TYPE(preconditioner_type) :: preconditioner_env
88  TYPE(mp_para_env_type), POINTER :: para_env
89  TYPE(cp_blacs_env_type), POINTER :: blacs_env
90 
91  NULLIFY (preconditioner_env%sparse_matrix)
92  NULLIFY (preconditioner_env%fm)
93  NULLIFY (preconditioner_env%dbcsr_matrix)
94  NULLIFY (preconditioner_env%occ_evals)
95  NULLIFY (preconditioner_env%full_evals)
96  NULLIFY (preconditioner_env%inverse_history)
97  NULLIFY (preconditioner_env%max_ev_vector)
98  NULLIFY (preconditioner_env%min_ev_vector)
99  preconditioner_env%solver = ot_precond_solver_default
100  preconditioner_env%para_env => para_env
101  preconditioner_env%ctxt => blacs_env
102  !inverse is used for filtering in update set it to something huge to
103  ! avoid filtering if the information is not available
104  preconditioner_env%condition_num = -1.0_dp
105  preconditioner_env%ihistory = 0
106 
107  CALL preconditioner_env%para_env%retain()
108  CALL preconditioner_env%ctxt%retain()
109 
110  END SUBROUTINE init_preconditioner
111 
112 ! **************************************************************************************************
113 !> \brief ...
114 !> \param preconditioner_env ...
115 ! **************************************************************************************************
116  SUBROUTINE destroy_preconditioner(preconditioner_env)
117 
118  TYPE(preconditioner_type) :: preconditioner_env
119 
120  CHARACTER(len=*), PARAMETER :: routinen = 'destroy_preconditioner'
121 
122  INTEGER :: handle, i
123 
124  CALL timeset(routinen, handle)
125 
126  IF (ASSOCIATED(preconditioner_env%sparse_matrix)) THEN
127  CALL dbcsr_deallocate_matrix(preconditioner_env%sparse_matrix)
128  NULLIFY (preconditioner_env%sparse_matrix)
129  END IF
130 
131  IF (ASSOCIATED(preconditioner_env%fm)) THEN
132  CALL cp_fm_release(preconditioner_env%fm)
133  DEALLOCATE (preconditioner_env%fm)
134  NULLIFY (preconditioner_env%fm)
135  END IF
136  IF (ASSOCIATED(preconditioner_env%dbcsr_matrix)) THEN
137  CALL dbcsr_release_p(preconditioner_env%dbcsr_matrix)
138  END IF
139  IF (ASSOCIATED(preconditioner_env%max_ev_vector)) THEN
140  CALL dbcsr_release_p(preconditioner_env%max_ev_vector)
141  END IF
142  IF (ASSOCIATED(preconditioner_env%min_ev_vector)) THEN
143  CALL dbcsr_release_p(preconditioner_env%min_ev_vector)
144  END IF
145  IF (ASSOCIATED(preconditioner_env%occ_evals)) THEN
146  DEALLOCATE (preconditioner_env%occ_evals)
147  END IF
148  IF (ASSOCIATED(preconditioner_env%full_evals)) THEN
149  DEALLOCATE (preconditioner_env%full_evals)
150  END IF
151  IF (ASSOCIATED(preconditioner_env%inverse_history)) THEN
152  DO i = 1, SIZE(preconditioner_env%inverse_history)
153  CALL dbcsr_release_p(preconditioner_env%inverse_history(i)%matrix)
154  END DO
155  DEALLOCATE (preconditioner_env%inverse_history)
156  END IF
157  CALL mp_para_env_release(preconditioner_env%para_env)
158  CALL cp_blacs_env_release(preconditioner_env%ctxt)
159 
160  preconditioner_env%in_use = 0
161  preconditioner_env%cholesky_use = cholesky_reduce
162 
163  CALL timestop(handle)
164 
165  END SUBROUTINE destroy_preconditioner
166 
167 END MODULE preconditioner_types
168 
methods related to the blacs parallel environment
Definition: cp_blacs_env.F:15
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
Definition: cp_blacs_env.F:282
represent a full matrix distributed on many processors
Definition: cp_fm_types.F:15
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public cholesky_reduce
integer, parameter, public ot_precond_solver_default
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
types of preconditioners
subroutine, public init_preconditioner(preconditioner_env, para_env, blacs_env)
...
subroutine, public destroy_preconditioner(preconditioner_env)
...
logical function, public preconditioner_in_use(preconditioner)
...
computes preconditioners, and implements methods to apply them currently used in qs_ot