(git:e5fdd81)
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,&
18  int_container
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 
33 CONTAINS
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 
176 END 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...