(git:374b731)
Loading...
Searching...
No Matches
lri_compression.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 integral compression (fix point accuracy)
10!> \par History
11!> created JGH [11.2017]
12!> \authors JGH
13! **************************************************************************************************
15 USE kinds, ONLY: dp,&
16 sp
17 USE lri_environment_types, ONLY: carray,&
19#include "./base/base_uses.f90"
20
21 IMPLICIT NONE
22
23 PRIVATE
24
25! **************************************************************************************************
26
27 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'lri_compression'
28
30
31! **************************************************************************************************
32
33CONTAINS
34
35! **************************************************************************************************
36!> \brief ...
37!> \param aval ...
38!> \param amax ...
39!> \param cont ...
40! **************************************************************************************************
41 SUBROUTINE lri_comp(aval, amax, cont)
42 REAL(kind=dp), DIMENSION(:, :, :), INTENT(IN) :: aval
43 REAL(kind=dp), DIMENSION(:), INTENT(OUT) :: amax
44 TYPE(int_container), INTENT(INOUT) :: cont
45
46 INTEGER :: i, ia, ib, ii, na, nb, nc, nn
47 REAL(kind=dp) :: xm
48 TYPE(carray), POINTER :: ca
49
50 IF (ASSOCIATED(cont%ca)) THEN
51 DO i = 1, SIZE(cont%ca)
52 IF (ASSOCIATED(cont%ca(i)%cdp)) DEALLOCATE (cont%ca(i)%cdp)
53 IF (ASSOCIATED(cont%ca(i)%csp)) DEALLOCATE (cont%ca(i)%csp)
54 IF (ASSOCIATED(cont%ca(i)%cip)) DEALLOCATE (cont%ca(i)%cip)
55 END DO
56 END IF
57
58 na = SIZE(aval, 1)
59 nb = SIZE(aval, 2)
60 nc = SIZE(aval, 3)
61 nn = na*nb
62 cont%na = na
63 cont%nb = nb
64 cont%nc = nc
65
66 IF (nc > 0) THEN
67 ALLOCATE (cont%ca(nc))
68 DO i = 1, nc
69 ca => cont%ca(i)
70 NULLIFY (ca%cdp, ca%csp, ca%cip)
71 xm = maxval(abs(aval(:, :, i)))
72 IF (xm >= 1.0e-05_dp) THEN
73 ca%compression = 1
74 ALLOCATE (ca%cdp(nn))
75 ii = 0
76 DO ib = 1, nb
77 DO ia = 1, na
78 ii = ii + 1
79 ca%cdp(ii) = aval(ia, ib, i)
80 END DO
81 END DO
82 ELSE IF (xm >= 1.0e-10_dp) THEN
83 ca%compression = 2
84 ALLOCATE (ca%csp(nn))
85 ii = 0
86 DO ib = 1, nb
87 DO ia = 1, na
88 ii = ii + 1
89 ca%csp(ii) = real(aval(ia, ib, i), kind=sp)
90 END DO
91 END DO
92 ELSE
93 ca%compression = 0
94 END IF
95 amax(i) = xm
96 END DO
97 END IF
98
99 END SUBROUTINE lri_comp
100
101! **************************************************************************************************
102!> \brief ...
103!> \param cont ...
104!> \return ...
105! **************************************************************************************************
106 FUNCTION lri_cont_mem(cont) RESULT(cmem)
107 TYPE(int_container), INTENT(IN) :: cont
108 REAL(kind=dp) :: cmem
109
110 INTEGER :: i
111
112 cmem = 0.0_dp
113 IF (ASSOCIATED(cont%ca)) THEN
114 DO i = 1, SIZE(cont%ca)
115 IF (ASSOCIATED(cont%ca(i)%cdp)) THEN
116 cmem = cmem + SIZE(cont%ca(i)%cdp)
117 END IF
118 IF (ASSOCIATED(cont%ca(i)%csp)) THEN
119 cmem = cmem + 0.5_dp*SIZE(cont%ca(i)%csp)
120 END IF
121 IF (ASSOCIATED(cont%ca(i)%cip)) THEN
122 cmem = cmem + SIZE(cont%ca(i)%cip)
123 END IF
124 END DO
125 END IF
126
127 END FUNCTION lri_cont_mem
128! **************************************************************************************************
129!> \brief ...
130!> \param aval ...
131!> \param cont ...
132!> \param ival ...
133! **************************************************************************************************
134 SUBROUTINE lri_decomp_i(aval, cont, ival)
135 REAL(kind=dp), DIMENSION(:, :), INTENT(INOUT) :: aval
136 TYPE(int_container), INTENT(INOUT) :: cont
137 INTEGER :: ival
138
139 INTEGER :: ia, ib, ii, na, nb, nn
140 TYPE(carray), POINTER :: ca
141
142 na = SIZE(aval, 1)
143 nb = SIZE(aval, 2)
144 nn = na*nb
145 cpassert(na == cont%na)
146 cpassert(nb == cont%nb)
147 cpassert(ival <= cont%nc)
148
149 ca => cont%ca(ival)
150 !
151 SELECT CASE (ca%compression)
152 CASE (0)
153 aval(1:na, 1:nb) = 0.0_dp
154 CASE (1)
155 ii = 0
156 DO ib = 1, nb
157 DO ia = 1, na
158 ii = ii + 1
159 aval(ia, ib) = ca%cdp(ii)
160 END DO
161 END DO
162 CASE (2)
163 ii = 0
164 DO ib = 1, nb
165 DO ia = 1, na
166 ii = ii + 1
167 aval(ia, ib) = real(ca%csp(ii), kind=dp)
168 END DO
169 END DO
170 CASE DEFAULT
171 cpabort("lri_decomp_i: compression label invalid")
172 END SELECT
173
174 END SUBROUTINE lri_decomp_i
175
176END MODULE lri_compression
177
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public sp
Definition kinds.F:33
integral compression (fix point accuracy)
subroutine, public lri_decomp_i(aval, cont, ival)
...
real(kind=dp) function, public lri_cont_mem(cont)
...
subroutine, public lri_comp(aval, amax, cont)
...
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...