Branch data Line data Source code
1 : :
2 : : #if defined HAVE_CONFIG_H
3 : : #include "config.h"
4 : : #endif
5 : : !!****m* ABINIT/m_MapHyb
6 : : !! NAME
7 : : !! m_MapHyb
8 : : !!
9 : : !! FUNCTION
10 : : !! map template integer/double
11 : : !!
12 : : !! COPYRIGHT
13 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
14 : : !! This file is distributed under the terms of the
15 : : !! GNU General Public License, see ~abinit/COPYING
16 : : !! or http://www.gnu.org/copyleft/gpl.txt .
17 : : !!
18 : : !! NOTES
19 : : !!
20 : : !! SOURCE
21 : :
22 : : #include "defs.h"
23 : : MODULE m_MapHyb
24 : : USE m_Global
25 : : IMPLICIT NONE
26 : :
27 : : !!***
28 : :
29 : : PRIVATE
30 : :
31 : : !!****t* m_MapHyb/MapHyb
32 : : !! NAME
33 : : !! MapHyb
34 : : !!
35 : : !! FUNCTION
36 : : !! This structured datatype contains the necessary data
37 : : !!
38 : : !! COPYRIGHT
39 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
40 : : !! This file is distributed under the terms of the
41 : : !! GNU General Public License, see ~abinit/COPYING
42 : : !! or http://www.gnu.org/copyleft/gpl.txt .
43 : : !!
44 : : !! SOURCE
45 : :
46 : : TYPE, PUBLIC :: MapHyb
47 : : INTEGER _PRIVATE :: size
48 : : INTEGER :: tail
49 : : INTEGER , ALLOCATABLE, DIMENSION(:) :: listINT
50 : : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: listDBLE
51 : : END TYPE MapHyb
52 : : !!***
53 : :
54 : : INTERFACE MapHyb_sort
55 : : MODULE PROCEDURE MapHyb_quickSort, MapHyb_sort
56 : : END INTERFACE
57 : :
58 : : !PUBLIC INTERFACE ASSIGNMENT(=)
59 : : ! MODULE PROCEDURE MapHyb_assign
60 : : !END INTERFACE
61 : :
62 : : PUBLIC :: MapHyb_init
63 : : PUBLIC :: MapHyb_setSize
64 : : PRIVATE :: MapHyb_enlarge
65 : : PUBLIC :: MapHyb_assign
66 : : PUBLIC :: MapHyb_sort
67 : : PUBLIC :: MapHyb_quickSort
68 : : PUBLIC :: MapHyb_print
69 : : PUBLIC :: MapHyb_clear
70 : : PUBLIC :: MapHyb_destroy
71 : :
72 : : CONTAINS
73 : : !!***
74 : :
75 : : !!****f* ABINIT/m_MapHyb/MapHyb_init
76 : : !! NAME
77 : : !! MapHyb_init
78 : : !!
79 : : !! FUNCTION
80 : : !! initialize
81 : : !!
82 : : !! COPYRIGHT
83 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
84 : : !! This file is distributed under the terms of the
85 : : !! GNU General Public License, see ~abinit/COPYING
86 : : !! or http://www.gnu.org/copyleft/gpl.txt .
87 : : !!
88 : : !! INPUTS
89 : : !! this=Map
90 : : !! size=memory size for initialization
91 : : !!
92 : : !! OUTPUT
93 : : !!
94 : : !! SIDE EFFECTS
95 : : !!
96 : : !! NOTES
97 : : !!
98 : : !! SOURCE
99 : :
100 : 1125 : SUBROUTINE MapHyb_init(this, size)
101 : :
102 : : !Arguments ------------------------------------
103 : : TYPE(MapHyb) , INTENT(INOUT) :: this
104 : : INTEGER, OPTIONAL, INTENT(IN ) :: size
105 : : !Local variables ------------------------------
106 : : INTEGER :: size_val
107 : :
108 : 1125 : size_val = Global_SIZE
109 [ + - ]: 1125 : IF ( PRESENT(size) ) size_val = size
110 : 1125 : this%size = size_val
111 [ - + ]: 1125 : FREEIF(this%listINT)
112 [ - + + - : 3375 : MALLOC(this%listINT,(1:size_val))
+ - + - -
+ - + -
+ ]
113 [ - + ]: 1125 : FREEIF(this%listDBLE)
114 [ - + + - : 3375 : MALLOC(this%listDBLE,(1:size_val))
+ - + - -
+ - + -
+ ]
115 : 1125 : this%tail = 0
116 : 1125 : END SUBROUTINE MapHyb_init
117 : : !!***
118 : :
119 : : !!****f* ABINIT/m_MapHyb/MapHyb_setSize
120 : : !! NAME
121 : : !! MapHyb_setSize
122 : : !!
123 : : !! FUNCTION
124 : : !! impose size of the this
125 : : !!
126 : : !! COPYRIGHT
127 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
128 : : !! This file is distributed under the terms of the
129 : : !! GNU General Public License, see ~abinit/COPYING
130 : : !! or http://www.gnu.org/copyleft/gpl.txt .
131 : : !!
132 : : !! INPUTS
133 : : !! this=Map
134 : : !! new_tail=new size
135 : : !!
136 : : !! OUTPUT
137 : : !!
138 : : !! SIDE EFFECTS
139 : : !!
140 : : !! NOTES
141 : : !!
142 : : !! SOURCE
143 : :
144 : 158970444 : SUBROUTINE MapHyb_setSize(this,new_tail)
145 : :
146 : : !Arguments ------------------------------------
147 : : TYPE(MapHyb), INTENT(INOUT) :: this
148 : : INTEGER , INTENT(IN ) :: new_tail
149 : : !Local variables ------------------------------
150 : : INTEGER :: size
151 : :
152 [ - + ]: 158970444 : IF ( .NOT. ALLOCATED(this%listINT) ) THEN
153 : 0 : CALL MapHyb_init(this)
154 : : END IF
155 : 158970444 : size = this%size
156 [ - + ]: 158970444 : IF( new_tail .GT. size ) THEN
157 : 0 : CALL MapHyb_enlarge(this, MAX(new_tail-size,Global_SIZE))
158 : : END IF
159 : 158970444 : this%tail = new_tail
160 : 158970444 : END SUBROUTINE MapHyb_setSize
161 : : !!***
162 : :
163 : : !!****f* ABINIT/m_MapHyb/MapHyb_enlarge
164 : : !! NAME
165 : : !! MapHyb_enlarge
166 : : !!
167 : : !! FUNCTION
168 : : !! enlarge memory space
169 : : !!
170 : : !! COPYRIGHT
171 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
172 : : !! This file is distributed under the terms of the
173 : : !! GNU General Public License, see ~abinit/COPYING
174 : : !! or http://www.gnu.org/copyleft/gpl.txt .
175 : : !!
176 : : !! INPUTS
177 : : !! this=Map
178 : : !! size=new memory size
179 : : !!
180 : : !! OUTPUT
181 : : !!
182 : : !! SIDE EFFECTS
183 : : !!
184 : : !! NOTES
185 : : !!
186 : : !! SOURCE
187 : :
188 : 0 : SUBROUTINE MapHyb_enlarge(this, size)
189 : :
190 : : !Arguments ------------------------------------
191 : : TYPE(MapHyb) , INTENT(INOUT) :: this
192 : : INTEGER, OPTIONAL, INTENT(IN ) :: size
193 : : !Local variables ------------------------------
194 : : INTEGER :: width
195 : : INTEGER :: tail
196 : : INTEGER :: size_val
197 : 0 : INTEGER , ALLOCATABLE, DIMENSION(:) :: listINT_temp
198 : 0 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: listDBLE_temp
199 : :
200 [ # # ]: 0 : IF ( ALLOCATED(this%listINT) ) THEN
201 : : FREEIF(listINT_temp)
202 : 0 : width = this%size
203 : 0 : tail = this%tail
204 : 0 : size_val = width
205 [ # # ]: 0 : IF ( PRESENT(size) ) size_val = size
206 : : ! listINT enlarge
207 [ # # # # : 0 : MALLOC(listINT_temp,(1:tail))
# # # # #
# # # ]
208 [ # # ]: 0 : listINT_temp(1:tail) = this%listINT(1:tail)
209 : 0 : FREE(this%listINT)
210 : 0 : this%size = width + size_val
211 [ # # # # : 0 : MALLOC(this%listINT,(1:this%size))
# # # # #
# # # ]
212 [ # # ]: 0 : this%listINT(1:tail) = listINT_temp(1:tail)
213 [ # # ]: 0 : FREE(listINT_temp)
214 : : ! listDBLE enlarge
215 [ # # # # : 0 : MALLOC(listDBLE_temp,(1:tail))
# # # # #
# # # ]
216 [ # # ]: 0 : listDBLE_temp(1:tail) = this%listDBLE(1:tail)
217 [ # # ]: 0 : FREE(this%listDBLE)
218 [ # # # # : 0 : MALLOC(this%listDBLE,(1:this%size))
# # # # #
# # # ]
219 [ # # ]: 0 : this%listDBLE(1:tail) = listDBLE_temp(1:tail)
220 [ # # ]: 0 : FREE(listDBLE_temp)
221 : : ELSE
222 : 0 : CALL MapHyb_init(this, Global_SIZE)
223 : : END IF
224 : 0 : END SUBROUTINE MapHyb_enlarge
225 : : !!***
226 : :
227 : : !!****f* ABINIT/m_MapHyb/MapHyb_assign
228 : : !! NAME
229 : : !! MapHyb_assign
230 : : !!
231 : : !! FUNCTION
232 : : !! assign this=map
233 : : !!
234 : : !! COPYRIGHT
235 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
236 : : !! This file is distributed under the terms of the
237 : : !! GNU General Public License, see ~abinit/COPYING
238 : : !! or http://www.gnu.org/copyleft/gpl.txt .
239 : : !!
240 : : !! INPUTS
241 : : !! this=this
242 : : !! this=Map
243 : : !!
244 : : !! OUTPUT
245 : : !!
246 : : !! SIDE EFFECTS
247 : : !!
248 : : !! NOTES
249 : : !!
250 : : !! SOURCE
251 : :
252 : 0 : SUBROUTINE MapHyb_assign(this, map)
253 : :
254 : : !Arguments ------------------------------------
255 : : TYPE(MapHyb), INTENT(INOUT) :: this
256 : : TYPE(MapHyb), INTENT(IN ) :: map
257 : : !Local variables ------------------------------
258 : : INTEGER :: tail
259 : :
260 : 0 : tail = map%tail
261 : 0 : CALL MapHyb_setSize(this, tail)
262 [ # # ]: 0 : this%listINT(1:tail) = map%listINT(1:tail)
263 [ # # ]: 0 : this%listDBLE(1:tail) = map%listDBLE(1:tail)
264 : :
265 : 0 : END SUBROUTINE MapHyb_assign
266 : : !!***
267 : :
268 : : !!****f* ABINIT/m_MapHyb/MapHyb_sort
269 : : !! NAME
270 : : !! MapHyb_sort
271 : : !!
272 : : !! FUNCTION
273 : : !! sort the this with respect to the integer array
274 : : !!
275 : : !! COPYRIGHT
276 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
277 : : !! This file is distributed under the terms of the
278 : : !! GNU General Public License, see ~abinit/COPYING
279 : : !! or http://www.gnu.org/copyleft/gpl.txt .
280 : : !!
281 : : !! INPUTS
282 : : !! this=Map
283 : : !!
284 : : !! OUTPUT
285 : : !!
286 : : !! SIDE EFFECTS
287 : : !!
288 : : !! NOTES
289 : : !!
290 : : !! SOURCE
291 : :
292 : 0 : SUBROUTINE MapHyb_sort(this)
293 : :
294 : : !Arguments ------------------------------------
295 : : TYPE(MapHyb), INTENT(INOUT) :: this
296 : :
297 [ # # ]: 0 : IF ( this%tail .EQ. 1 ) RETURN
298 : 0 : CALL MapHyb_quickSort(this, 1, this%tail)
299 : : END SUBROUTINE MapHyb_sort
300 : : !!***
301 : :
302 : : !!****f* ABINIT/m_MapHyb/MapHyb_quickSort
303 : : !! NAME
304 : : !! MapHyb_quickSort
305 : : !!
306 : : !! FUNCTION
307 : : !! sort the this with respect to the integer array
308 : : !! with the quickSort algo
309 : : !!
310 : : !! COPYRIGHT
311 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
312 : : !! This file is distributed under the terms of the
313 : : !! GNU General Public License, see ~abinit/COPYING
314 : : !! or http://www.gnu.org/copyleft/gpl.txt .
315 : : !!
316 : : !! INPUTS
317 : : !! this=Map
318 : : !! begin=first element to consider
319 : : !! end=last element to consider
320 : : !!
321 : : !! OUTPUT
322 : : !!
323 : : !! SIDE EFFECTS
324 : : !!
325 : : !! NOTES
326 : : !!
327 : : !! SOURCE
328 : :
329 : 0 : RECURSIVE SUBROUTINE MapHyb_quickSort(this, begin, end)
330 : :
331 : : !Arguments ------------------------------------
332 : : TYPE(MapHyb), INTENT(INOUT) :: this
333 : : INTEGER , INTENT(IN ) :: begin
334 : : INTEGER , INTENT(IN ) :: end
335 : : !Local variables ------------------------------
336 : : INTEGER :: it1
337 : : INTEGER :: it2
338 : : INTEGER :: pivot
339 : : INTEGER :: Iswap
340 : : DOUBLE PRECISION :: Dswap
341 : :
342 : 0 : pivot = this%listINT((end-begin)/2 + begin) ! not the betterchoice.... FIXME
343 : 0 : it1 = begin
344 : 0 : it2 = end
345 [ # # ]: 0 : DO WHILE (it1 .LE. it2)
346 [ # # ]: 0 : DO WHILE ( this%listINT(it1) .LT. pivot )
347 : 0 : it1 = it1 + 1
348 : : END DO
349 [ # # ]: 0 : DO WHILE ( this%listINT(it2) .GT. pivot )
350 : 0 : it2 = it2 - 1
351 : : END DO
352 [ # # ]: 0 : IF ( it1 .LE. it2) THEN
353 : 0 : Iswap = this%listINT(it1)
354 : 0 : Dswap = this%listDBLE(it1)
355 : 0 : this%listINT(it1) = this%listINT(it2)
356 : 0 : this%listDBLE(it1) = this%listDBLE(it2)
357 : 0 : this%listINT(it2) = Iswap
358 : 0 : this%listDBLE(it2) = Dswap
359 : 0 : it1 = it1 + 1
360 : 0 : it2 = it2 - 1
361 : : END IF
362 : : END DO
363 [ # # ]: 0 : IF ( begin < it2 ) THEN
364 : 0 : CALL MapHyb_quickSort(this,begin,it2)
365 : : END IF
366 : : !!it2= it1+1
367 [ # # ]: 0 : IF ( it1 < end ) THEN
368 : 0 : CALL MapHyb_quickSort(this,it1,end)
369 : : END IF
370 : :
371 : 0 : END SUBROUTINE MapHyb_quickSort
372 : : !!***
373 : :
374 : : !!****f* ABINIT/m_MapHyb/MapHyb_print
375 : : !! NAME
376 : : !! MapHyb_print
377 : : !!
378 : : !! FUNCTION
379 : : !! print the this
380 : : !!
381 : : !! COPYRIGHT
382 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
383 : : !! This file is distributed under the terms of the
384 : : !! GNU General Public License, see ~abinit/COPYING
385 : : !! or http://www.gnu.org/copyleft/gpl.txt .
386 : : !!
387 : : !! INPUTS
388 : : !! this=Map
389 : : !! ostream=file stream
390 : : !!
391 : : !! OUTPUT
392 : : !!
393 : : !! SIDE EFFECTS
394 : : !!
395 : : !! NOTES
396 : : !!
397 : : !! SOURCE
398 : :
399 : 0 : SUBROUTINE MapHyb_print(this,ostream)
400 : :
401 : : !Arguments ------------------------------------
402 : : TYPE(MapHyb) , INTENT(IN) :: this
403 : : INTEGER, OPTIONAL, INTENT(IN) :: ostream
404 : : !Local variables ------------------------------
405 : : INTEGER :: ostream_val
406 : : INTEGER :: it
407 : :
408 : 0 : ostream_val = 6
409 [ # # ]: 0 : IF ( PRESENT(ostream) ) ostream_val = ostream
410 : 0 : WRITE(ostream_val,'(A,2x,A5,2x,A5)') "#","Index", "Value"
411 [ # # ]: 0 : DO it = 1, this%tail
412 : 0 : WRITE(ostream_val,'(3x,I5,2x,ES22.14)') this%listINT(it), this%listDBLE(it)
413 : : END DO
414 : 0 : END SUBROUTINE MapHyb_print
415 : : !!***
416 : :
417 : : !!****f* ABINIT/m_MapHyb/MapHyb_clear
418 : : !! NAME
419 : : !! MapHyb_clear
420 : : !!
421 : : !! FUNCTION
422 : : !! Clear the this
423 : : !!
424 : : !! COPYRIGHT
425 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
426 : : !! This file is distributed under the terms of the
427 : : !! GNU General Public License, see ~abinit/COPYING
428 : : !! or http://www.gnu.org/copyleft/gpl.txt .
429 : : !!
430 : : !! INPUTS
431 : : !! this=Map
432 : : !!
433 : : !! OUTPUT
434 : : !!
435 : : !! SIDE EFFECTS
436 : : !!
437 : : !! NOTES
438 : : !!
439 : : !! SOURCE
440 : :
441 : 1554 : SUBROUTINE MapHyb_clear(this)
442 : :
443 : : !Arguments ------------------------------------
444 : : TYPE(MapHyb), INTENT(INOUT) :: this
445 : 1554 : this%tail = 0
446 : 1554 : END SUBROUTINE MapHyb_clear
447 : : !!***
448 : :
449 : : !!****f* ABINIT/m_MapHyb/MapHyb_destroy
450 : : !! NAME
451 : : !! MapHyb_destroy
452 : : !!
453 : : !! FUNCTION
454 : : !! destroy and deallocate the this
455 : : !!
456 : : !! COPYRIGHT
457 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
458 : : !! This file is distributed under the terms of the
459 : : !! GNU General Public License, see ~abinit/COPYING
460 : : !! or http://www.gnu.org/copyleft/gpl.txt .
461 : : !!
462 : : !! INPUTS
463 : : !! this=Map
464 : : !!
465 : : !! OUTPUT
466 : : !!
467 : : !! SIDE EFFECTS
468 : : !!
469 : : !! NOTES
470 : : !!
471 : : !! SOURCE
472 : :
473 : 1125 : SUBROUTINE MapHyb_destroy(this)
474 : :
475 : : !Arguments ------------------------------------
476 : : TYPE(MapHyb), INTENT(INOUT) :: this
477 : :
478 [ + - ]: 1125 : FREEIF(this%listINT)
479 [ + - ]: 1125 : FREEIF(this%listDBLE)
480 : :
481 : 1125 : this%tail = 0
482 : 1125 : this%size = 0
483 : 1125 : END SUBROUTINE MapHyb_destroy
484 : : !!***
485 : :
486 [ # # # # : 0 : END MODULE m_MapHyb
# # # # #
# # # #
# ]
487 : : !!***
488 : :
489 : :
|