Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2025 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 : ! **************************************************************************************************
14 : MODULE preconditioner_types
15 : USE cp_blacs_env, ONLY: cp_blacs_env_release,&
16 : cp_blacs_env_type
17 : USE cp_dbcsr_api, ONLY: dbcsr_deallocate_matrix,&
18 : dbcsr_p_type,&
19 : dbcsr_release_p,&
20 : dbcsr_type
21 : USE cp_fm_types, ONLY: cp_fm_release,&
22 : cp_fm_type
23 : USE input_constants, ONLY: cholesky_reduce,&
24 : ot_precond_solver_default
25 : USE kinds, ONLY: dp
26 : USE message_passing, ONLY: mp_para_env_release,&
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 => NULL()
45 : TYPE(cp_fm_type), POINTER :: fm => NULL()
46 : TYPE(dbcsr_type), POINTER :: dbcsr_matrix => NULL()
47 : TYPE(dbcsr_type), POINTER :: max_ev_vector => NULL()
48 : TYPE(dbcsr_type), POINTER :: min_ev_vector => NULL()
49 : TYPE(dbcsr_p_type), POINTER, DIMENSION(:) :: inverse_history => NULL()
50 : TYPE(mp_para_env_type), POINTER :: para_env => NULL()
51 : TYPE(cp_blacs_env_type), POINTER :: ctxt => NULL()
52 : INTEGER :: in_use = -1, solver = -1, ihistory = -1, cholesky_use = -1
53 : REAL(KIND=dp), DIMENSION(:), POINTER :: occ_evals => NULL(), full_evals => NULL()
54 : REAL(KIND=dp) :: energy_gap = -1.0_dp
55 : REAL(KIND=dp) :: condition_num = -1.0_dp
56 : END TYPE preconditioner_type
57 :
58 : ! **************************************************************************************************
59 : TYPE preconditioner_p_type
60 : TYPE(preconditioner_type), POINTER :: preconditioner => NULL()
61 : END TYPE preconditioner_p_type
62 :
63 : CONTAINS
64 :
65 : ! **************************************************************************************************
66 :
67 : ! **************************************************************************************************
68 : !> \brief ...
69 : !> \param preconditioner ...
70 : !> \return ...
71 : ! **************************************************************************************************
72 296 : FUNCTION preconditioner_in_use(preconditioner)
73 : TYPE(preconditioner_type) :: preconditioner
74 : LOGICAL :: preconditioner_in_use
75 :
76 296 : preconditioner_in_use = .NOT. (preconditioner%in_use .EQ. 0)
77 296 : END FUNCTION
78 :
79 : ! **************************************************************************************************
80 : !> \brief ...
81 : !> \param preconditioner_env ...
82 : !> \param para_env ...
83 : !> \param blacs_env ...
84 : ! **************************************************************************************************
85 6010 : 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 6010 : NULLIFY (preconditioner_env%sparse_matrix)
92 6010 : NULLIFY (preconditioner_env%fm)
93 6010 : NULLIFY (preconditioner_env%dbcsr_matrix)
94 6010 : NULLIFY (preconditioner_env%occ_evals)
95 6010 : NULLIFY (preconditioner_env%full_evals)
96 6010 : NULLIFY (preconditioner_env%inverse_history)
97 6010 : NULLIFY (preconditioner_env%max_ev_vector)
98 6010 : NULLIFY (preconditioner_env%min_ev_vector)
99 6010 : preconditioner_env%solver = ot_precond_solver_default
100 6010 : preconditioner_env%para_env => para_env
101 6010 : 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 6010 : preconditioner_env%condition_num = -1.0_dp
105 6010 : preconditioner_env%ihistory = 0
106 :
107 6010 : CALL preconditioner_env%para_env%retain()
108 6010 : CALL preconditioner_env%ctxt%retain()
109 :
110 6010 : END SUBROUTINE init_preconditioner
111 :
112 : ! **************************************************************************************************
113 : !> \brief ...
114 : !> \param preconditioner_env ...
115 : ! **************************************************************************************************
116 6010 : 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 6010 : CALL timeset(routineN, handle)
125 :
126 6010 : IF (ASSOCIATED(preconditioner_env%sparse_matrix)) THEN
127 2 : CALL dbcsr_deallocate_matrix(preconditioner_env%sparse_matrix)
128 2 : NULLIFY (preconditioner_env%sparse_matrix)
129 : END IF
130 :
131 6010 : IF (ASSOCIATED(preconditioner_env%fm)) THEN
132 1440 : CALL cp_fm_release(preconditioner_env%fm)
133 1440 : DEALLOCATE (preconditioner_env%fm)
134 : NULLIFY (preconditioner_env%fm)
135 : END IF
136 6010 : IF (ASSOCIATED(preconditioner_env%dbcsr_matrix)) THEN
137 4004 : CALL dbcsr_release_p(preconditioner_env%dbcsr_matrix)
138 : END IF
139 6010 : IF (ASSOCIATED(preconditioner_env%max_ev_vector)) THEN
140 1735 : CALL dbcsr_release_p(preconditioner_env%max_ev_vector)
141 : END IF
142 6010 : IF (ASSOCIATED(preconditioner_env%min_ev_vector)) THEN
143 1735 : CALL dbcsr_release_p(preconditioner_env%min_ev_vector)
144 : END IF
145 6010 : IF (ASSOCIATED(preconditioner_env%occ_evals)) THEN
146 3040 : DEALLOCATE (preconditioner_env%occ_evals)
147 : END IF
148 6010 : IF (ASSOCIATED(preconditioner_env%full_evals)) THEN
149 3040 : DEALLOCATE (preconditioner_env%full_evals)
150 : END IF
151 6010 : IF (ASSOCIATED(preconditioner_env%inverse_history)) THEN
152 0 : DO i = 1, SIZE(preconditioner_env%inverse_history)
153 0 : CALL dbcsr_release_p(preconditioner_env%inverse_history(i)%matrix)
154 : END DO
155 0 : DEALLOCATE (preconditioner_env%inverse_history)
156 : END IF
157 6010 : CALL mp_para_env_release(preconditioner_env%para_env)
158 6010 : CALL cp_blacs_env_release(preconditioner_env%ctxt)
159 :
160 6010 : preconditioner_env%in_use = 0
161 6010 : preconditioner_env%cholesky_use = cholesky_reduce
162 :
163 6010 : CALL timestop(handle)
164 :
165 6010 : END SUBROUTINE destroy_preconditioner
166 :
167 0 : END MODULE preconditioner_types
168 :
|