(git:103fa69)
Loading...
Searching...
No Matches
library_tests.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Performance tests for basic tasks like matrix multiplies, copy, fft.
10!> \par History
11!> 30-Nov-2000 (JGH) added input
12!> 02-Jan-2001 (JGH) Parallel FFT
13!> 28-Feb-2002 (JGH) Clebsch-Gordon Coefficients
14!> 06-Jun-2003 (JGH) Real space grid test
15!> Eigensolver test (29.08.05,MK)
16!> \author JGH 6-NOV-2000
17! **************************************************************************************************
19
20 USE ai_coulomb_test, ONLY: eri_test
21 USE cell_methods, ONLY: cell_create,&
23 USE cell_types, ONLY: cell_release,&
29 USE cp_dbcsr_api, ONLY: dbcsr_reset_randmat_seed,&
30 dbcsr_run_tests
32 USE cp_files, ONLY: close_file,&
35 USE cp_fm_diag, ONLY: cp_fm_syevd,&
41 USE cp_fm_types, ONLY: cp_fm_create,&
53 USE dbm_tests, ONLY: dbm_run_tests
54 USE fft_tools, ONLY: bwfft,&
56 fwfft,&
57 fft3d,&
73 USE kinds, ONLY: dp
74 USE machine, ONLY: m_flush,&
76 USE mathconstants, ONLY: gaussi
81 USE parallel_rng_types, ONLY: uniform,&
83 USE pw_grid_types, ONLY: fullspace,&
84 halfspace,&
86 USE pw_grids, ONLY: pw_grid_create,&
88 USE pw_methods, ONLY: pw_transfer,&
90 USE pw_types, ONLY: pw_c1d_gs_type,&
93 USE realspace_grid_types, ONLY: &
99#include "./base/base_uses.f90"
100
101 IMPLICIT NONE
102
103 PRIVATE
104 PUBLIC :: lib_test
105
106 INTEGER :: runtest(100)
107 REAL(KIND=dp) :: max_memory
108 REAL(KIND=dp), PARAMETER :: threshold = 1.0e-8_dp
109 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'library_tests'
110
111CONTAINS
112
113! **************************************************************************************************
114!> \brief Master routine for tests
115!> \param root_section ...
116!> \param para_env ...
117!> \param globenv ...
118!> \par History
119!> none
120!> \author JGH 6-NOV-2000
121! **************************************************************************************************
122 SUBROUTINE lib_test(root_section, para_env, globenv)
123
124 TYPE(section_vals_type), POINTER :: root_section
125 TYPE(mp_para_env_type), POINTER :: para_env
126 TYPE(global_environment_type), POINTER :: globenv
127
128 CHARACTER(LEN=*), PARAMETER :: routinen = 'lib_test'
129
130 INTEGER :: handle, iw
131 LOGICAL :: explicit
132 TYPE(cp_logger_type), POINTER :: logger
133 TYPE(section_vals_type), POINTER :: cp_dbcsr_test_section, cp_fm_gemm_test_section, &
134 dbm_test_section, eigensolver_section, eri_mme_test_section, pw_transfer_section, &
135 rs_pw_transfer_section, shg_integrals_test_section
136
137 CALL timeset(routinen, handle)
138
139 logger => cp_get_default_logger()
140 iw = cp_print_key_unit_nr(logger, root_section, "TEST%PROGRAM_RUN_INFO", extension=".log")
141
142 IF (iw > 0) THEN
143 WRITE (iw, '(T2,79("*"))')
144 WRITE (iw, '(A,T31,A,T80,A)') ' *', ' PERFORMANCE TESTS ', '*'
145 WRITE (iw, '(T2,79("*"))')
146 END IF
147 !
148 CALL test_input(root_section, para_env)
149 !
150 IF (runtest(1) /= 0) CALL copy_test(para_env, iw)
151 !
152 IF (runtest(2) /= 0) CALL matmul_test(para_env, test_matmul=.true., test_dgemm=.false., iw=iw)
153 IF (runtest(5) /= 0) CALL matmul_test(para_env, test_matmul=.false., test_dgemm=.true., iw=iw)
154 !
155 IF (runtest(3) /= 0) CALL fft_test(para_env, iw, globenv%fftw_plan_type, &
156 globenv%fftw_wisdom_file_name, &
157 globenv%fftw_wisdom_file_explicit)
158 !
159 IF (runtest(4) /= 0) CALL eri_test(iw)
160 !
161 IF (runtest(6) /= 0) CALL gaunt_coefficient_test()
162 !
163 ! runtest 7 has been deleted and can be recycled
164 !
165 IF (runtest(8) /= 0) CALL mpi_perf_test(para_env, runtest(8), iw)
166 !
167 IF (runtest(10) /= 0) CALL validate_exp_minimax(runtest(10), iw)
168 !
169 IF (runtest(11) /= 0) CALL test_least_square_ft(runtest(11), iw)
170 !
171
172 rs_pw_transfer_section => section_vals_get_subs_vals(root_section, "TEST%RS_PW_TRANSFER")
173 CALL section_vals_get(rs_pw_transfer_section, explicit=explicit)
174 IF (explicit) THEN
175 CALL rs_pw_transfer_test(para_env, iw, globenv, rs_pw_transfer_section)
176 END IF
177
178 pw_transfer_section => section_vals_get_subs_vals(root_section, "TEST%PW_TRANSFER")
179 CALL section_vals_get(pw_transfer_section, explicit=explicit)
180 IF (explicit) THEN
181 CALL pw_fft_test(para_env, iw, globenv, pw_transfer_section)
182 END IF
183
184 cp_fm_gemm_test_section => section_vals_get_subs_vals(root_section, "TEST%CP_FM_GEMM")
185 CALL section_vals_get(cp_fm_gemm_test_section, explicit=explicit)
186 IF (explicit) THEN
187 CALL cp_fm_gemm_test(para_env, iw, cp_fm_gemm_test_section)
188 END IF
189
190 eigensolver_section => section_vals_get_subs_vals(root_section, "TEST%EIGENSOLVER")
191 CALL section_vals_get(eigensolver_section, explicit=explicit)
192 IF (explicit) THEN
193 CALL eigensolver_test(para_env, iw, eigensolver_section)
194 END IF
195
196 eri_mme_test_section => section_vals_get_subs_vals(root_section, "TEST%ERI_MME_TEST")
197 CALL section_vals_get(eri_mme_test_section, explicit=explicit)
198 IF (explicit) THEN
199 CALL cp_eri_mme_perf_acc_test(para_env, iw, eri_mme_test_section)
200 END IF
201
202 shg_integrals_test_section => section_vals_get_subs_vals(root_section, "TEST%SHG_INTEGRALS_TEST")
203 CALL section_vals_get(shg_integrals_test_section, explicit=explicit)
204 IF (explicit) THEN
205 CALL shg_integrals_perf_acc_test(iw, shg_integrals_test_section)
206 END IF
207
208 ! DBCSR tests
209 cp_dbcsr_test_section => section_vals_get_subs_vals(root_section, "TEST%CP_DBCSR")
210 CALL section_vals_get(cp_dbcsr_test_section, explicit=explicit)
211 IF (explicit) THEN
212 CALL cp_dbcsr_tests(para_env, iw, cp_dbcsr_test_section)
213 END IF
214
215 ! DBM tests
216 dbm_test_section => section_vals_get_subs_vals(root_section, "TEST%DBM")
217 CALL section_vals_get(dbm_test_section, explicit=explicit)
218 IF (explicit) THEN
219 CALL run_dbm_tests(para_env, iw, dbm_test_section)
220 END IF
221
222 CALL cp_print_key_finished_output(iw, logger, root_section, "TEST%PROGRAM_RUN_INFO")
223
224 CALL timestop(handle)
225
226 END SUBROUTINE lib_test
227
228! **************************************************************************************************
229!> \brief Reads input section &TEST ... &END
230!> \param root_section ...
231!> \param para_env ...
232!> \author JGH 30-NOV-2000
233!> \note
234!> I---------------------------------------------------------------------------I
235!> I SECTION: &TEST ... &END I
236!> I I
237!> I MEMORY max_memory I
238!> I COPY n I
239!> I MATMUL n I
240!> I FFT n I
241!> I ERI n I
242!> I PW_FFT n I
243!> I Clebsch-Gordon n -> Gaunt coefficients I
244!> I RS_GRIDS n I
245!> I MPI n I
246!> I RNG n -> Parallel random number generator I
247!> I---------------------------------------------------------------------------I
248! **************************************************************************************************
249 SUBROUTINE test_input(root_section, para_env)
250 TYPE(section_vals_type), POINTER :: root_section
251 TYPE(mp_para_env_type), POINTER :: para_env
252
253 TYPE(section_vals_type), POINTER :: test_section
254
255!
256!..defaults
257! using this style is not recommended, introduce sections instead (see e.g. cp_fm_gemm)
258
259 runtest = 0
260 test_section => section_vals_get_subs_vals(root_section, "TEST")
261 CALL section_vals_val_get(test_section, "MEMORY", r_val=max_memory)
262 CALL section_vals_val_get(test_section, 'COPY', i_val=runtest(1))
263 CALL section_vals_val_get(test_section, 'MATMUL', i_val=runtest(2))
264 CALL section_vals_val_get(test_section, 'DGEMM', i_val=runtest(5))
265 CALL section_vals_val_get(test_section, 'FFT', i_val=runtest(3))
266 CALL section_vals_val_get(test_section, 'ERI', i_val=runtest(4))
267 CALL section_vals_val_get(test_section, 'CLEBSCH_GORDON', i_val=runtest(6))
268 CALL section_vals_val_get(test_section, 'MPI', i_val=runtest(8))
269 CALL section_vals_val_get(test_section, 'MINIMAX', i_val=runtest(10))
270 CALL section_vals_val_get(test_section, 'LEAST_SQ_FT', i_val=runtest(11))
271
272 CALL para_env%sync()
273 END SUBROUTINE test_input
274
275! **************************************************************************************************
276!> \brief Tests the performance to copy two vectors.
277!> \param para_env ...
278!> \param iw ...
279!> \par History
280!> none
281!> \author JGH 6-NOV-2000
282!> \note
283!> The results of these tests allow to determine the size of the cache
284!> of the CPU. This can be used to optimize the performance of the
285!> FFTSG library.
286! **************************************************************************************************
287 SUBROUTINE copy_test(para_env, iw)
288 TYPE(mp_para_env_type), POINTER :: para_env
289 INTEGER :: iw
290
291 INTEGER :: i, j, len, ntim, siz
292 REAL(kind=dp) :: perf, t, tend, tstart
293 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: ca, cb
294
295! test for copy --> Cache size
296
297 siz = abs(runtest(1))
298 IF (para_env%is_source()) WRITE (iw, '(//,A,/)') " Test of copy ( F95 ) "
299 DO i = 6, 24
300 len = 2**i
301 IF (8.0_dp*real(len, kind=dp) > max_memory*0.5_dp) EXIT
302 ALLOCATE (ca(len))
303 ALLOCATE (cb(len))
304
305 CALL random_number(ca)
306 ntim = nint(1.e7_dp/real(len, kind=dp))
307 ntim = max(ntim, 1)
308 ntim = min(ntim, siz*10000)
309
310 tstart = m_walltime()
311 DO j = 1, ntim
312 cb(:) = ca(:)
313 ca(1) = real(j, kind=dp)
314 END DO
315 tend = m_walltime()
316 t = tend - tstart + threshold
317 IF (t > 0.0_dp) THEN
318 perf = real(ntim, kind=dp)*real(len, kind=dp)*1.e-6_dp/t
319 ELSE
320 perf = 0.0_dp
321 END IF
322
323 IF (para_env%is_source()) THEN
324 WRITE (iw, '(A,i2,i10,A,T59,F14.4,A)') " Copy test: Size = 2^", i, &
325 len/1024, " Kwords", perf, " Mcopy/s"
326 END IF
327
328 DEALLOCATE (ca)
329 DEALLOCATE (cb)
330 END DO
331 CALL para_env%sync()
332 END SUBROUTINE copy_test
333
334! **************************************************************************************************
335!> \brief Tests the performance of different kinds of matrix matrix multiply
336!> kernels for the BLAS and F95 intrinsic matmul.
337!> \param para_env ...
338!> \param test_matmul ...
339!> \param test_dgemm ...
340!> \param iw ...
341!> \par History
342!> none
343!> \author JGH 6-NOV-2000
344! **************************************************************************************************
345 SUBROUTINE matmul_test(para_env, test_matmul, test_dgemm, iw)
346 TYPE(mp_para_env_type), POINTER :: para_env
347 LOGICAL :: test_matmul, test_dgemm
348 INTEGER :: iw
349
350 INTEGER :: i, j, len, ntim, siz
351 REAL(kind=dp) :: perf, t, tend, tstart, xdum
352 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: ma, mb, mc
353
354! test for matrix multpies
355
356 IF (test_matmul) THEN
357 siz = abs(runtest(2))
358 IF (para_env%is_source()) WRITE (iw, '(//,A,/)') " Test of matmul ( F95 ) "
359 DO i = 5, siz, 2
360 len = 2**i + 1
361 IF (8.0_dp*real(len*len, kind=dp) > max_memory*0.3_dp) EXIT
362 ALLOCATE (ma(len, len))
363 ALLOCATE (mb(len, len))
364 ALLOCATE (mc(len, len))
365 mc = 0.0_dp
366
367 CALL random_number(xdum)
368 ma = xdum
369 CALL random_number(xdum)
370 mb = xdum
371 ntim = nint(1.e8_dp/(2.0_dp*real(len, kind=dp)**3))
372 ntim = max(ntim, 1)
373 ntim = min(ntim, siz*200)
374 tstart = m_walltime()
375 DO j = 1, ntim
376 mc(:, :) = matmul(ma, mb)
377 ma(1, 1) = real(j, kind=dp)
378 END DO
379 tend = m_walltime()
380 t = tend - tstart + threshold
381 perf = real(ntim, kind=dp)*2.0_dp*real(len, kind=dp)**3*1.e-6_dp/t
382 IF (para_env%is_source()) THEN
383 WRITE (iw, '(A,i6,T59,F14.4,A)') &
384 " Matrix multiply test: c = a * b Size = ", len, perf, " Mflop/s"
385 END IF
386 tstart = m_walltime()
387 DO j = 1, ntim
388 mc(:, :) = mc + matmul(ma, mb)
389 ma(1, 1) = real(j, kind=dp)
390 END DO
391 tend = m_walltime()
392 t = tend - tstart + threshold
393 IF (t > 0.0_dp) THEN
394 perf = real(ntim, kind=dp)*2.0_dp*real(len, kind=dp)**3*1.e-6_dp/t
395 ELSE
396 perf = 0.0_dp
397 END IF
398
399 IF (para_env%is_source()) THEN
400 WRITE (iw, '(A,i6,T59,F14.4,A)') &
401 " Matrix multiply test: a = a * b Size = ", len, perf, " Mflop/s"
402 END IF
403
404 tstart = m_walltime()
405 DO j = 1, ntim
406 mc(:, :) = mc + matmul(ma, transpose(mb))
407 ma(1, 1) = real(j, kind=dp)
408 END DO
409 tend = m_walltime()
410 t = tend - tstart + threshold
411 IF (t > 0.0_dp) THEN
412 perf = real(ntim, kind=dp)*2.0_dp*real(len, kind=dp)**3*1.e-6_dp/t
413 ELSE
414 perf = 0.0_dp
415 END IF
416
417 IF (para_env%is_source()) THEN
418 WRITE (iw, '(A,i6,T59,F14.4,A)') &
419 " Matrix multiply test: c = a * b(T) Size = ", len, perf, " Mflop/s"
420 END IF
421
422 tstart = m_walltime()
423 DO j = 1, ntim
424 mc(:, :) = mc + matmul(transpose(ma), mb)
425 ma(1, 1) = real(j, kind=dp)
426 END DO
427 tend = m_walltime()
428 t = tend - tstart + threshold
429 IF (t > 0.0_dp) THEN
430 perf = real(ntim, kind=dp)*2.0_dp*real(len, kind=dp)**3*1.e-6_dp/t
431 ELSE
432 perf = 0.0_dp
433 END IF
434
435 IF (para_env%is_source()) THEN
436 WRITE (iw, '(A,i6,T59,F14.4,A)') &
437 " Matrix multiply test: c = a(T) * b Size = ", len, perf, " Mflop/s"
438 END IF
439
440 DEALLOCATE (ma)
441 DEALLOCATE (mb)
442 DEALLOCATE (mc)
443 END DO
444 END IF
445
446 ! test for matrix multpies
447 IF (test_dgemm) THEN
448 siz = abs(runtest(5))
449 IF (para_env%is_source()) WRITE (iw, '(//,A,/)') " Test of matmul ( BLAS ) "
450 DO i = 5, siz, 2
451 len = 2**i + 1
452 IF (8.0_dp*real(len*len, kind=dp) > max_memory*0.3_dp) EXIT
453 ALLOCATE (ma(len, len))
454 ALLOCATE (mb(len, len))
455 ALLOCATE (mc(len, len))
456 mc = 0.0_dp
457
458 CALL random_number(xdum)
459 ma = xdum
460 CALL random_number(xdum)
461 mb = xdum
462 ntim = nint(1.e8_dp/(2.0_dp*real(len, kind=dp)**3))
463 ntim = max(ntim, 1)
464 ntim = min(ntim, 1000)
465
466 tstart = m_walltime()
467 DO j = 1, ntim
468 CALL dgemm("N", "N", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
469 END DO
470 tend = m_walltime()
471 t = tend - tstart + threshold
472 IF (t > 0.0_dp) THEN
473 perf = real(ntim, kind=dp)*2.0_dp*real(len, kind=dp)**3*1.e-6_dp/t
474 ELSE
475 perf = 0.0_dp
476 END IF
477
478 IF (para_env%is_source()) THEN
479 WRITE (iw, '(A,i6,T59,F14.4,A)') &
480 " Matrix multiply test: c = a * b Size = ", len, perf, " Mflop/s"
481 END IF
482
483 tstart = m_walltime()
484 DO j = 1, ntim
485 CALL dgemm("N", "N", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
486 END DO
487 tend = m_walltime()
488 t = tend - tstart + threshold
489 IF (t > 0.0_dp) THEN
490 perf = real(ntim, kind=dp)*2.0_dp*real(len, kind=dp)**3*1.e-6_dp/t
491 ELSE
492 perf = 0.0_dp
493 END IF
494
495 IF (para_env%is_source()) THEN
496 WRITE (iw, '(A,i6,T59,F14.4,A)') &
497 " Matrix multiply test: a = a * b Size = ", len, perf, " Mflop/s"
498 END IF
499
500 tstart = m_walltime()
501 DO j = 1, ntim
502 CALL dgemm("N", "T", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
503 END DO
504 tend = m_walltime()
505 t = tend - tstart + threshold
506 IF (t > 0.0_dp) THEN
507 perf = real(ntim, kind=dp)*2.0_dp*real(len, kind=dp)**3*1.e-6_dp/t
508 ELSE
509 perf = 0.0_dp
510 END IF
511
512 IF (para_env%is_source()) THEN
513 WRITE (iw, '(A,i6,T59,F14.4,A)') &
514 " Matrix multiply test: c = a * b(T) Size = ", len, perf, " Mflop/s"
515 END IF
516
517 tstart = m_walltime()
518 DO j = 1, ntim
519 CALL dgemm("T", "N", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
520 END DO
521 tend = m_walltime()
522 t = tend - tstart + threshold
523 IF (t > 0.0_dp) THEN
524 perf = real(ntim, kind=dp)*2.0_dp*real(len, kind=dp)**3*1.e-6_dp/t
525 ELSE
526 perf = 0.0_dp
527 END IF
528
529 IF (para_env%is_source()) THEN
530 WRITE (iw, '(A,i6,T59,F14.4,A)') &
531 " Matrix multiply test: c = a(T) * b Size = ", len, perf, " Mflop/s"
532 END IF
533
534 DEALLOCATE (ma)
535 DEALLOCATE (mb)
536 DEALLOCATE (mc)
537 END DO
538 END IF
539
540 CALL para_env%sync()
541
542 END SUBROUTINE matmul_test
543
544! **************************************************************************************************
545!> \brief Tests the performance of all available FFT libraries for 3D FFTs
546!> \param para_env ...
547!> \param iw ...
548!> \param fftw_plan_type ...
549!> \param wisdom_file where FFTW3 should look to save/load wisdom
550!> \param export_wisdom whether the FFTW3 wisdom is saved to wisdom_file
551!> \par History
552!> none
553!> \author JGH 6-NOV-2000
554! **************************************************************************************************
555 SUBROUTINE fft_test(para_env, iw, fftw_plan_type, wisdom_file, export_wisdom)
556
557 TYPE(mp_para_env_type), POINTER :: para_env
558 INTEGER :: iw, fftw_plan_type
559 CHARACTER(LEN=*), INTENT(IN) :: wisdom_file
560 LOGICAL, INTENT(IN) :: export_wisdom
561
562 INTEGER, PARAMETER :: ndate(3) = [12, 48, 96]
563
564 INTEGER :: iall, it, j, len, n(3), ntim, radix_in, &
565 radix_out, siz, stat
566 COMPLEX(KIND=dp), DIMENSION(4, 4, 4) :: zz
567 COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: ca, cb, cc
568 CHARACTER(LEN=7) :: method
569 REAL(kind=dp) :: flops, perf, scale, t, tdiff, tend, &
570 tstart
571 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: ra
572
573! test for 3d FFT
574
575 IF (para_env%is_source()) WRITE (iw, '(//,A,/)') " Test of 3D-FFT "
576 siz = abs(runtest(3))
577
578 DO iall = 1, 100
579 SELECT CASE (iall)
580 CASE DEFAULT
581 EXIT
582 CASE (1)
583 CALL init_fft("FFTSG", alltoall=.false., wisdom_file=wisdom_file, &
584 pool_limit=10, plan_style=fftw_plan_type)
585 method = "FFTSG "
586 CASE (2)
587 cycle
588 CASE (3)
589 CALL init_fft("FFTW3", alltoall=.false., wisdom_file=wisdom_file, &
590 pool_limit=10, plan_style=fftw_plan_type)
591 method = "FFTW3 "
592 END SELECT
593 n = 4
594 zz = 0.0_dp
595 CALL fft3d(fwfft, n, zz, status=stat)
596 IF (stat == 0) THEN
597 DO it = 1, 3
598 radix_in = ndate(it)
599 CALL fft_radix_operations(radix_in, radix_out, fft_radix_closest)
600 len = radix_out
601 n = len
602 IF (16.0_dp*real(len*len*len, kind=dp) > max_memory*0.5_dp) EXIT
603 ALLOCATE (ra(len, len, len))
604 ALLOCATE (ca(len, len, len))
605 CALL random_number(ra)
606 ca(:, :, :) = ra
607 CALL random_number(ra)
608 ca(:, :, :) = ca + gaussi*ra
609 flops = real(len**3, kind=dp)*15.0_dp*log(real(len, kind=dp))
610 ntim = nint(siz*1.e7_dp/flops)
611 ntim = max(ntim, 1)
612 ntim = min(ntim, 200)
613 scale = 1.0_dp/real(len**3, kind=dp)
614 tstart = m_walltime()
615 DO j = 1, ntim
616 CALL fft3d(fwfft, n, ca)
617 CALL fft3d(bwfft, n, ca)
618 END DO
619 tend = m_walltime()
620 t = tend - tstart + threshold
621 IF (t > 0.0_dp) THEN
622 perf = real(ntim, kind=dp)*2.0_dp*flops*1.e-6_dp/t
623 ELSE
624 perf = 0.0_dp
625 END IF
626
627 IF (para_env%is_source()) THEN
628 WRITE (iw, '(T2,A,A,i6,T59,F14.4,A)') &
629 adjustr(method), " test (in-place) Size = ", len, perf, " Mflop/s"
630 END IF
631 DEALLOCATE (ca)
632 DEALLOCATE (ra)
633 END DO
634 IF (para_env%is_source()) WRITE (iw, *)
635 ! test if input data is preserved
636 len = 24
637 n = len
638 ALLOCATE (ra(len, len, len))
639 ALLOCATE (ca(len, len, len))
640 ALLOCATE (cb(len, len, len))
641 ALLOCATE (cc(len, len, len))
642 CALL random_number(ra)
643 ca(:, :, :) = ra
644 CALL random_number(ra)
645 ca(:, :, :) = ca + gaussi*ra
646 cc(:, :, :) = ca
647 CALL fft3d(fwfft, n, ca, cb)
648 tdiff = maxval(abs(ca - cc))
649 IF (tdiff > 1.0e-12_dp) THEN
650 IF (para_env%is_source()) THEN
651 WRITE (iw, '(T2,A,A,A)') adjustr(method), " FWFFT ", &
652 " Input array is changed in out-of-place FFT !"
653 END IF
654 ELSE
655 IF (para_env%is_source()) THEN
656 WRITE (iw, '(T2,A,A,A)') adjustr(method), " FWFFT ", &
657 " Input array is not changed in out-of-place FFT !"
658 END IF
659 END IF
660 ca(:, :, :) = cc
661 CALL fft3d(bwfft, n, ca, cb)
662 tdiff = maxval(abs(ca - cc))
663 IF (tdiff > 1.0e-12_dp) THEN
664 IF (para_env%is_source()) THEN
665 WRITE (iw, '(T2,A,A,A)') adjustr(method), " BWFFT ", &
666 " Input array is changed in out-of-place FFT !"
667 END IF
668 ELSE
669 IF (para_env%is_source()) THEN
670 WRITE (iw, '(T2,A,A,A)') adjustr(method), " BWFFT ", &
671 " Input array is not changed in out-of-place FFT !"
672 END IF
673 END IF
674 IF (para_env%is_source()) WRITE (iw, *)
675
676 DEALLOCATE (ra)
677 DEALLOCATE (ca)
678 DEALLOCATE (cb)
679 DEALLOCATE (cc)
680 END IF
681 CALL finalize_fft(para_env, wisdom_file=wisdom_file, export_wisdom=export_wisdom)
682 END DO
683
684 END SUBROUTINE fft_test
685
686! **************************************************************************************************
687!> \brief test rs_pw_transfer performance
688!> \param para_env ...
689!> \param iw ...
690!> \param globenv ...
691!> \param rs_pw_transfer_section ...
692!> \author Joost VandeVondele
693!> 9.2008 Randomise rs grid [Iain Bethune]
694!> (c) The Numerical Algorithms Group (NAG) Ltd, 2008 on behalf of the HECToR project
695! **************************************************************************************************
696 SUBROUTINE rs_pw_transfer_test(para_env, iw, globenv, rs_pw_transfer_section)
697
698 TYPE(mp_para_env_type), POINTER :: para_env
699 INTEGER :: iw
700 TYPE(global_environment_type), POINTER :: globenv
701 TYPE(section_vals_type), POINTER :: rs_pw_transfer_section
702
703 CHARACTER(LEN=*), PARAMETER :: routinen = 'rs_pw_transfer_test'
704
705 INTEGER :: halo_size, handle, i_loop, n_loop, ns_max
706 INTEGER, DIMENSION(3) :: no, np
707 INTEGER, DIMENSION(:), POINTER :: i_vals
708 LOGICAL :: do_rs2pw
709 REAL(kind=dp) :: tend, tstart
710 TYPE(cell_type), POINTER :: box
711 TYPE(pw_grid_type), POINTER :: grid
712 TYPE(pw_r3d_rs_type) :: ca
713 TYPE(realspace_grid_desc_type), POINTER :: rs_desc
714 TYPE(realspace_grid_input_type) :: input_settings
715 TYPE(realspace_grid_type) :: rs_grid
716 TYPE(section_vals_type), POINTER :: rs_grid_section
717
718 CALL timeset(routinen, handle)
719
720 !..set fft lib
721 CALL init_fft(globenv%default_fft_library, alltoall=.false., &
722 pool_limit=globenv%fft_pool_scratch_limit, &
723 wisdom_file=globenv%fftw_wisdom_file_name, &
724 plan_style=globenv%fftw_plan_type)
725
726 ! .. set cell (should otherwise be irrelevant)
727 NULLIFY (box)
728 CALL cell_create(box)
729 box%hmat = reshape([20.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 20.0_dp, 0.0_dp, &
730 0.0_dp, 0.0_dp, 20.0_dp], [3, 3])
731 CALL init_cell(box)
732
733 ! .. grid type and pw_grid
734 NULLIFY (grid)
735 CALL section_vals_val_get(rs_pw_transfer_section, "GRID", i_vals=i_vals)
736 np = i_vals
737 CALL pw_grid_create(grid, para_env, box%hmat, grid_span=fullspace, npts=np, fft_usage=.true., iounit=iw)
738 no = grid%npts
739
740 CALL ca%create(grid)
741 CALL pw_zero(ca)
742
743 ! .. rs input setting type
744 CALL section_vals_val_get(rs_pw_transfer_section, "HALO_SIZE", i_val=halo_size)
745 rs_grid_section => section_vals_get_subs_vals(rs_pw_transfer_section, "RS_GRID")
746 ns_max = 2*halo_size + 1
747 CALL init_input_type(input_settings, ns_max, rs_grid_section, 1, [-1, -1, -1])
748
749 ! .. rs type
750 NULLIFY (rs_desc)
751 CALL rs_grid_create_descriptor(rs_desc, pw_grid=grid, input_settings=input_settings)
752 CALL rs_grid_create(rs_grid, rs_desc)
753 CALL rs_grid_print(rs_grid, iw)
754 CALL rs_grid_zero(rs_grid)
755
756 ! Put random values on the grid, so summation check will pick up errors
757 CALL random_number(rs_grid%r)
758
759 CALL section_vals_val_get(rs_pw_transfer_section, "N_loop", i_val=n_loop)
760 CALL section_vals_val_get(rs_pw_transfer_section, "RS2PW", l_val=do_rs2pw)
761
762 ! go for the real loops, sync to get max timings
763 IF (para_env%is_source()) THEN
764 WRITE (iw, '(T2,A)') ""
765 WRITE (iw, '(T2,A)') "Timing rs_pw_transfer routine"
766 WRITE (iw, '(T2,A)') ""
767 WRITE (iw, '(T2,A)') "iteration time[s]"
768 END IF
769 DO i_loop = 1, n_loop
770 CALL para_env%sync()
771 tstart = m_walltime()
772 IF (do_rs2pw) THEN
773 CALL transfer_rs2pw(rs_grid, ca)
774 ELSE
775 CALL transfer_pw2rs(rs_grid, ca)
776 END IF
777 CALL para_env%sync()
778 tend = m_walltime()
779 IF (para_env%is_source()) THEN
780 WRITE (iw, '(T2,I9,1X,F12.6)') i_loop, tend - tstart
781 END IF
782 END DO
783
784 !cleanup
785 CALL rs_grid_release(rs_grid)
786 CALL rs_grid_release_descriptor(rs_desc)
787 CALL ca%release()
788 CALL pw_grid_release(grid)
789 CALL cell_release(box)
790 CALL finalize_fft(para_env, wisdom_file=globenv%fftw_wisdom_file_name, &
791 export_wisdom=globenv%fftw_wisdom_file_explicit)
792
793 CALL timestop(handle)
794
795 END SUBROUTINE rs_pw_transfer_test
796
797! **************************************************************************************************
798!> \brief Tests the performance of PW calls to FFT routines
799!> \param para_env ...
800!> \param iw ...
801!> \param globenv ...
802!> \param pw_transfer_section ...
803!> \par History
804!> JGH 6-Feb-2001 : Test and performance code
805!> Made input sensitive [Joost VandeVondele]
806!> \author JGH 1-JAN-2001
807! **************************************************************************************************
808 SUBROUTINE pw_fft_test(para_env, iw, globenv, pw_transfer_section)
809
810 TYPE(mp_para_env_type), POINTER :: para_env
811 INTEGER :: iw
812 TYPE(global_environment_type), POINTER :: globenv
813 TYPE(section_vals_type), POINTER :: pw_transfer_section
814
815 REAL(kind=dp), PARAMETER :: toler = 1.e-11_dp
816
817 INTEGER :: blocked_id, grid_span, i_layout, i_rep, &
818 ig, ip, itmp, n_loop, n_rep, nn, p, q
819 INTEGER, ALLOCATABLE, DIMENSION(:, :) :: layouts
820 INTEGER, DIMENSION(2) :: distribution_layout
821 INTEGER, DIMENSION(3) :: no, np
822 INTEGER, DIMENSION(:), POINTER :: i_vals
823 LOGICAL :: debug, is_fullspace, odd, &
824 pw_grid_layout_all, spherical
825 REAL(kind=dp) :: em, et, flops, gsq, perf, t, t_max, &
826 t_min, tend, tstart
827 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: t_end, t_start
828 TYPE(cell_type), POINTER :: box
829 TYPE(pw_c1d_gs_type) :: ca, cc
830 TYPE(pw_c3d_rs_type) :: cb
831 TYPE(pw_grid_type), POINTER :: grid
832
833!..set fft lib
834
835 CALL init_fft(globenv%default_fft_library, alltoall=.false., &
836 pool_limit=globenv%fft_pool_scratch_limit, &
837 wisdom_file=globenv%fftw_wisdom_file_name, &
838 plan_style=globenv%fftw_plan_type)
839
840 !..the unit cell (should not really matter, the number of grid points do)
841 NULLIFY (box, grid)
842 CALL cell_create(box)
843 box%hmat = reshape([10.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 8.0_dp, 0.0_dp, &
844 0.0_dp, 0.0_dp, 7.0_dp], [3, 3])
845 CALL init_cell(box)
846
847 CALL section_vals_get(pw_transfer_section, n_repetition=n_rep)
848 DO i_rep = 1, n_rep
849
850 ! how often should we do the transfer
851 CALL section_vals_val_get(pw_transfer_section, "N_loop", i_rep_section=i_rep, i_val=n_loop)
852 ALLOCATE (t_start(n_loop))
853 ALLOCATE (t_end(n_loop))
854
855 ! setup of the grids
856 CALL section_vals_val_get(pw_transfer_section, "GRID", i_rep_section=i_rep, i_vals=i_vals)
857 np = i_vals
858
859 CALL section_vals_val_get(pw_transfer_section, "PW_GRID_BLOCKED", i_rep_section=i_rep, i_val=blocked_id)
860 CALL section_vals_val_get(pw_transfer_section, "DEBUG", i_rep_section=i_rep, l_val=debug)
861
862 CALL section_vals_val_get(pw_transfer_section, "PW_GRID_LAYOUT_ALL", i_rep_section=i_rep, &
863 l_val=pw_grid_layout_all)
864
865 ! prepare to loop over all or a specific layout
866 IF (pw_grid_layout_all) THEN
867 ! count layouts that fit
868 itmp = 0
869 ! start from 2, (/1,para_env%num_pe/) is not supported
870 DO p = 2, para_env%num_pe
871 q = para_env%num_pe/p
872 IF (p*q == para_env%num_pe) THEN
873 itmp = itmp + 1
874 END IF
875 END DO
876 ! build list
877 ALLOCATE (layouts(2, itmp))
878 itmp = 0
879 DO p = 2, para_env%num_pe
880 q = para_env%num_pe/p
881 IF (p*q == para_env%num_pe) THEN
882 itmp = itmp + 1
883 layouts(:, itmp) = [p, q]
884 END IF
885 END DO
886 ELSE
887 CALL section_vals_val_get(pw_transfer_section, "PW_GRID_LAYOUT", i_rep_section=i_rep, i_vals=i_vals)
888 ALLOCATE (layouts(2, 1))
889 layouts(:, 1) = i_vals
890 END IF
891
892 DO i_layout = 1, SIZE(layouts, 2)
893
894 distribution_layout = layouts(:, i_layout)
895
896 CALL section_vals_val_get(pw_transfer_section, "PW_GRID", i_rep_section=i_rep, i_val=itmp)
897
898 ! from cp_control_utils
899 SELECT CASE (itmp)
901 spherical = .true.
902 is_fullspace = .false.
904 spherical = .false.
905 is_fullspace = .true.
907 spherical = .false.
908 is_fullspace = .false.
909 END SELECT
910
911 ! from pw_env_methods
912 IF (spherical) THEN
913 grid_span = halfspace
914 spherical = .true.
915 odd = .true.
916 ELSE IF (is_fullspace) THEN
917 grid_span = fullspace
918 spherical = .false.
919 odd = .false.
920 ELSE
921 grid_span = halfspace
922 spherical = .false.
923 odd = .true.
924 END IF
925
926 ! actual setup
927 CALL pw_grid_create(grid, para_env, box%hmat, grid_span=grid_span, odd=odd, spherical=spherical, &
928 blocked=blocked_id, npts=np, fft_usage=.true., &
929 rs_dims=distribution_layout, iounit=iw)
930
931 IF (iw > 0) CALL m_flush(iw)
932
933 ! note that the number of grid points might be different from what the user requested (fft-able needed)
934 no = grid%npts
935
936 CALL ca%create(grid)
937 CALL cb%create(grid)
938 CALL cc%create(grid)
939
940 ! initialize data
941 CALL pw_zero(ca)
942 CALL pw_zero(cb)
943 CALL pw_zero(cc)
944 nn = SIZE(ca%array)
945 DO ig = 1, nn
946 gsq = grid%gsq(ig)
947 ca%array(ig) = exp(-gsq)
948 END DO
949
950 flops = product(no)*30.0_dp*log(real(maxval(no), kind=dp))
951 tstart = m_walltime()
952 DO ip = 1, n_loop
953 CALL para_env%sync()
954 t_start(ip) = m_walltime()
955 CALL pw_transfer(ca, cb, debug)
956 CALL pw_transfer(cb, cc, debug)
957 CALL para_env%sync()
958 t_end(ip) = m_walltime()
959 END DO
960 tend = m_walltime()
961 t = tend - tstart + threshold
962 IF (t > 0.0_dp) THEN
963 perf = real(n_loop, kind=dp)*2.0_dp*flops*1.e-6_dp/t
964 ELSE
965 perf = 0.0_dp
966 END IF
967
968 em = maxval(abs(ca%array(:) - cc%array(:)))
969 CALL para_env%max(em)
970 et = sum(abs(ca%array(:) - cc%array(:)))
971 CALL para_env%sum(et)
972 t_min = minval(t_end - t_start)
973 t_max = maxval(t_end - t_start)
974
975 IF (para_env%is_source()) THEN
976 WRITE (iw, *)
977 WRITE (iw, '(A,T67,E14.6)') " Parallel FFT Tests: Maximal Error ", em
978 WRITE (iw, '(A,T67,E14.6)') " Parallel FFT Tests: Total Error ", et
979 WRITE (iw, '(A,T67,F14.0)') &
980 " Parallel FFT Tests: Performance [Mflops] ", perf
981 WRITE (iw, '(A,T67,F14.6)') " Best time : ", t_min
982 WRITE (iw, '(A,T67,F14.6)') " Worst time: ", t_max
983 IF (iw > 0) CALL m_flush(iw)
984 END IF
985
986 ! need debugging ???
987 IF (em > toler .OR. et > toler) THEN
988 cpwarn("The FFT results are not accurate ... starting debug pw_transfer")
989 CALL pw_transfer(ca, cb, .true.)
990 CALL pw_transfer(cb, cc, .true.)
991 END IF
992
993 ! done with these grids
994 CALL ca%release()
995 CALL cb%release()
996 CALL cc%release()
997 CALL pw_grid_release(grid)
998
999 END DO
1000
1001 ! local arrays
1002 DEALLOCATE (layouts)
1003 DEALLOCATE (t_start)
1004 DEALLOCATE (t_end)
1005
1006 END DO
1007
1008 ! cleanup
1009 CALL cell_release(box)
1010 CALL finalize_fft(para_env, wisdom_file=globenv%fftw_wisdom_file_name, &
1011 export_wisdom=globenv%fftw_wisdom_file_explicit)
1012
1013 END SUBROUTINE pw_fft_test
1014
1015! **************************************************************************************************
1016!> \brief Tests the eigensolver library routines
1017!> \param para_env ...
1018!> \param iw ...
1019!> \param eigensolver_section ...
1020!> \par History
1021!> JGH 6-Feb-2001 : Test and performance code
1022!> \author JGH 1-JAN-2001
1023! **************************************************************************************************
1024 SUBROUTINE eigensolver_test(para_env, iw, eigensolver_section)
1025
1026 TYPE(mp_para_env_type), POINTER :: para_env
1027 INTEGER :: iw
1028 TYPE(section_vals_type), POINTER :: eigensolver_section
1029
1030 INTEGER :: diag_method, i, i_loop, i_rep, &
1031 init_method, j, n, n_loop, n_rep, &
1032 neig, unit_number
1033 REAL(kind=dp) :: t1, t2
1034 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: eigenvalues
1035 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: buffer
1036 TYPE(cp_blacs_env_type), POINTER :: blacs_env
1037 TYPE(cp_fm_struct_type), POINTER :: fmstruct
1038 TYPE(cp_fm_type) :: eigenvectors, matrix, work
1039 TYPE(rng_stream_type), ALLOCATABLE :: rng_stream
1040
1041 IF (iw > 0) THEN
1042 WRITE (unit=iw, fmt="(/,/,T2,A,/)") "EIGENSOLVER TEST"
1043 END IF
1044
1045 ! create blacs env corresponding to para_env
1046 NULLIFY (blacs_env)
1047 CALL cp_blacs_env_create(blacs_env=blacs_env, &
1048 para_env=para_env)
1049
1050 ! loop over all tests
1051 CALL section_vals_get(eigensolver_section, n_repetition=n_rep)
1052 DO i_rep = 1, n_rep
1053
1054 ! parse section
1055 CALL section_vals_val_get(eigensolver_section, "N", i_rep_section=i_rep, i_val=n)
1056 CALL section_vals_val_get(eigensolver_section, "EIGENVALUES", i_rep_section=i_rep, i_val=neig)
1057 CALL section_vals_val_get(eigensolver_section, "DIAG_METHOD", i_rep_section=i_rep, i_val=diag_method)
1058 CALL section_vals_val_get(eigensolver_section, "INIT_METHOD", i_rep_section=i_rep, i_val=init_method)
1059 CALL section_vals_val_get(eigensolver_section, "N_loop", i_rep_section=i_rep, i_val=n_loop)
1060
1061 ! proper number of eigs
1062 IF (neig < 0) neig = n
1063 neig = min(neig, n)
1064
1065 ! report
1066 IF (iw > 0) THEN
1067 WRITE (iw, *) "Matrix size", n
1068 WRITE (iw, *) "Number of eigenvalues", neig
1069 WRITE (iw, *) "Timing loops", n_loop
1070 SELECT CASE (diag_method)
1071 CASE (do_diag_syevd)
1072 WRITE (iw, *) "Diag using syevd"
1073 CASE (do_diag_syevx)
1074 WRITE (iw, *) "Diag using syevx"
1075 CASE DEFAULT
1076 ! stop
1077 END SELECT
1078
1079 SELECT CASE (init_method)
1080 CASE (do_mat_random)
1081 WRITE (iw, *) "using random matrix"
1082 CASE (do_mat_read)
1083 WRITE (iw, *) "reading from file"
1084 CASE DEFAULT
1085 ! stop
1086 END SELECT
1087 END IF
1088
1089 ! create matrix struct type
1090 NULLIFY (fmstruct)
1091 CALL cp_fm_struct_create(fmstruct=fmstruct, &
1092 para_env=para_env, &
1093 context=blacs_env, &
1094 nrow_global=n, &
1095 ncol_global=n)
1096
1097 ! create all needed matrices, and buffers for the eigenvalues
1098 CALL cp_fm_create(matrix=matrix, &
1099 matrix_struct=fmstruct, &
1100 name="MATRIX")
1101 CALL cp_fm_set_all(matrix, 0.0_dp)
1102
1103 CALL cp_fm_create(matrix=eigenvectors, &
1104 matrix_struct=fmstruct, &
1105 name="EIGENVECTORS")
1106 CALL cp_fm_set_all(eigenvectors, 0.0_dp)
1107
1108 CALL cp_fm_create(matrix=work, &
1109 matrix_struct=fmstruct, &
1110 name="WORK")
1111 CALL cp_fm_set_all(matrix, 0.0_dp)
1112
1113 ALLOCATE (eigenvalues(n))
1114 eigenvalues = 0.0_dp
1115 ALLOCATE (buffer(1, n))
1116
1117 ! generate initial matrix, either by reading a file, or using random numbers
1118 IF (para_env%is_source()) THEN
1119 SELECT CASE (init_method)
1120 CASE (do_mat_random)
1121 rng_stream = rng_stream_type( &
1122 name="rng_stream", &
1123 distribution_type=uniform, &
1124 extended_precision=.true.)
1125 CASE (do_mat_read)
1126 CALL open_file(file_name="MATRIX", &
1127 file_action="READ", &
1128 file_form="FORMATTED", &
1129 file_status="OLD", &
1130 unit_number=unit_number)
1131 END SELECT
1132 END IF
1133
1134 DO i = 1, n
1135 IF (para_env%is_source()) THEN
1136 SELECT CASE (init_method)
1137 CASE (do_mat_random)
1138 DO j = i, n
1139 buffer(1, j) = rng_stream%next() - 0.5_dp
1140 END DO
1141 !MK activate/modify for a diagonal dominant symmetric matrix:
1142 !MK buffer(1,i) = 10.0_dp*buffer(1,i)
1143 CASE (do_mat_read)
1144 READ (unit=unit_number, fmt=*) buffer(1, 1:n)
1145 END SELECT
1146 END IF
1147 CALL para_env%bcast(buffer)
1148 SELECT CASE (init_method)
1149 CASE (do_mat_random)
1150 CALL cp_fm_set_submatrix(fm=matrix, &
1151 new_values=buffer, &
1152 start_row=i, &
1153 start_col=i, &
1154 n_rows=1, &
1155 n_cols=n - i + 1, &
1156 alpha=1.0_dp, &
1157 beta=0.0_dp, &
1158 transpose=.false.)
1159 CALL cp_fm_set_submatrix(fm=matrix, &
1160 new_values=buffer, &
1161 start_row=i, &
1162 start_col=i, &
1163 n_rows=n - i + 1, &
1164 n_cols=1, &
1165 alpha=1.0_dp, &
1166 beta=0.0_dp, &
1167 transpose=.true.)
1168 CASE (do_mat_read)
1169 CALL cp_fm_set_submatrix(fm=matrix, &
1170 new_values=buffer, &
1171 start_row=i, &
1172 start_col=1, &
1173 n_rows=1, &
1174 n_cols=n, &
1175 alpha=1.0_dp, &
1176 beta=0.0_dp, &
1177 transpose=.false.)
1178 END SELECT
1179 END DO
1180
1181 DEALLOCATE (buffer)
1182
1183 IF (para_env%is_source()) THEN
1184 SELECT CASE (init_method)
1185 CASE (do_mat_read)
1186 CALL close_file(unit_number=unit_number)
1187 END SELECT
1188 END IF
1189
1190 DO i_loop = 1, n_loop
1191 eigenvalues = 0.0_dp
1192 CALL cp_fm_set_all(eigenvectors, 0.0_dp)
1193 CALL cp_fm_to_fm(source=matrix, &
1194 destination=work)
1195
1196 ! DONE, now testing
1197 t1 = m_walltime()
1198 SELECT CASE (diag_method)
1199 CASE (do_diag_syevd)
1200 CALL cp_fm_syevd(matrix=work, &
1201 eigenvectors=eigenvectors, &
1202 eigenvalues=eigenvalues)
1203 CASE (do_diag_syevx)
1204 CALL cp_fm_syevx(matrix=work, &
1205 eigenvectors=eigenvectors, &
1206 eigenvalues=eigenvalues, &
1207 neig=neig, &
1208 work_syevx=1.0_dp)
1209 END SELECT
1210 t2 = m_walltime()
1211 IF (iw > 0) WRITE (iw, *) "Timing for loop ", i_loop, " : ", t2 - t1
1212 END DO
1213
1214 IF (iw > 0) THEN
1215 WRITE (iw, *) "Eigenvalues: "
1216 WRITE (unit=iw, fmt="(T3,5F14.6)") eigenvalues(1:neig)
1217 WRITE (unit=iw, fmt="(T3,A4,F16.6)") "Sum:", sum(eigenvalues(1:neig))
1218 WRITE (iw, *) ""
1219 END IF
1220
1221 ! Clean up
1222 DEALLOCATE (eigenvalues)
1223 CALL cp_fm_release(matrix=work)
1224 CALL cp_fm_release(matrix=eigenvectors)
1225 CALL cp_fm_release(matrix=matrix)
1226 CALL cp_fm_struct_release(fmstruct=fmstruct)
1227
1228 END DO
1229
1230 CALL cp_blacs_env_release(blacs_env=blacs_env)
1231
1232 END SUBROUTINE eigensolver_test
1233
1234! **************************************************************************************************
1235!> \brief Tests the parallel matrix multiply
1236!> \param para_env ...
1237!> \param iw ...
1238!> \param cp_fm_gemm_test_section ...
1239! **************************************************************************************************
1240 SUBROUTINE cp_fm_gemm_test(para_env, iw, cp_fm_gemm_test_section)
1241
1242 TYPE(mp_para_env_type), POINTER :: para_env
1243 INTEGER :: iw
1244 TYPE(section_vals_type), POINTER :: cp_fm_gemm_test_section
1245
1246 CHARACTER(LEN=1) :: transa, transb
1247 INTEGER :: i_loop, i_rep, k, m, n, n_loop, n_rep, ncol_block, ncol_block_actual, &
1248 ncol_global, np, nrow_block, nrow_block_actual, nrow_global
1249 INTEGER, DIMENSION(:), POINTER :: grid_2d
1250 LOGICAL :: force_blocksize, row_major, transa_p, &
1251 transb_p
1252 REAL(kind=dp) :: t1, t2, t3, t4
1253 TYPE(cp_blacs_env_type), POINTER :: blacs_env
1254 TYPE(cp_fm_struct_type), POINTER :: fmstruct_a, fmstruct_b, fmstruct_c
1255 TYPE(cp_fm_type) :: matrix_a, matrix_b, matrix_c
1256
1257 CALL section_vals_get(cp_fm_gemm_test_section, n_repetition=n_rep)
1258 DO i_rep = 1, n_rep
1259
1260 ! how often should we do the multiply
1261 CALL section_vals_val_get(cp_fm_gemm_test_section, "N_loop", i_rep_section=i_rep, i_val=n_loop)
1262
1263 ! matrices def.
1264 CALL section_vals_val_get(cp_fm_gemm_test_section, "K", i_rep_section=i_rep, i_val=k)
1265 CALL section_vals_val_get(cp_fm_gemm_test_section, "N", i_rep_section=i_rep, i_val=n)
1266 CALL section_vals_val_get(cp_fm_gemm_test_section, "M", i_rep_section=i_rep, i_val=m)
1267 CALL section_vals_val_get(cp_fm_gemm_test_section, "transa", i_rep_section=i_rep, l_val=transa_p)
1268 CALL section_vals_val_get(cp_fm_gemm_test_section, "transb", i_rep_section=i_rep, l_val=transb_p)
1269 CALL section_vals_val_get(cp_fm_gemm_test_section, "nrow_block", i_rep_section=i_rep, i_val=nrow_block)
1270 CALL section_vals_val_get(cp_fm_gemm_test_section, "ncol_block", i_rep_section=i_rep, i_val=ncol_block)
1271 CALL section_vals_val_get(cp_fm_gemm_test_section, "ROW_MAJOR", i_rep_section=i_rep, l_val=row_major)
1272 CALL section_vals_val_get(cp_fm_gemm_test_section, "GRID_2D", i_rep_section=i_rep, i_vals=grid_2d)
1273 CALL section_vals_val_get(cp_fm_gemm_test_section, "FORCE_BLOCKSIZE", i_rep_section=i_rep, l_val=force_blocksize)
1274 transa = "N"
1275 transb = "N"
1276 IF (transa_p) transa = "T"
1277 IF (transb_p) transb = "T"
1278
1279 IF (iw > 0) THEN
1280 WRITE (iw, '(T2,A)') "----------- TESTING PARALLEL MATRIX MULTIPLY -------------"
1281 WRITE (iw, '(T2,A)', advance="NO") "C = "
1282 IF (transa_p) THEN
1283 WRITE (iw, '(A)', advance="NO") "TRANSPOSE(A) x"
1284 ELSE
1285 WRITE (iw, '(A)', advance="NO") "A x "
1286 END IF
1287 IF (transb_p) THEN
1288 WRITE (iw, '(A)') "TRANSPOSE(B) "
1289 ELSE
1290 WRITE (iw, '(A)') "B "
1291 END IF
1292 WRITE (iw, '(T2,A,T50,I5,A,I5)') 'requested block size', nrow_block, ' by ', ncol_block
1293 WRITE (iw, '(T2,A,T50,I5)') 'number of repetitions of cp_fm_gemm ', n_loop
1294 WRITE (iw, '(T2,A,T50,L5)') 'Row Major', row_major
1295 WRITE (iw, '(T2,A,T50,2I7)') 'GRID_2D ', grid_2d
1296 WRITE (iw, '(T2,A,T50,L5)') 'Force blocksize ', force_blocksize
1297 ! check the return value of pilaenv, too small values limit the performance (assuming pdgemm is the vanilla variant)
1298 np = cp_fm_pilaenv(0, 'D')
1299 IF (np > 0) THEN
1300 WRITE (iw, '(T2,A,T50,I5)') 'PILAENV blocksize', np
1301 END IF
1302 END IF
1303
1304 NULLIFY (blacs_env)
1305 CALL cp_blacs_env_create(blacs_env=blacs_env, &
1306 para_env=para_env, &
1307 row_major=row_major, &
1308 grid_2d=grid_2d)
1309
1310 NULLIFY (fmstruct_a)
1311 IF (transa_p) THEN
1312 nrow_global = m; ncol_global = k
1313 ELSE
1314 nrow_global = k; ncol_global = m
1315 END IF
1316 CALL cp_fm_struct_create(fmstruct=fmstruct_a, para_env=para_env, context=blacs_env, &
1317 nrow_global=nrow_global, ncol_global=ncol_global, &
1318 nrow_block=nrow_block, ncol_block=ncol_block, force_block=force_blocksize)
1319 CALL cp_fm_struct_get(fmstruct_a, nrow_block=nrow_block_actual, ncol_block=ncol_block_actual)
1320 IF (iw > 0) WRITE (iw, '(T2,A,I9,A,I9,A,I5,A,I5)') 'matrix A ', nrow_global, " by ", ncol_global, &
1321 ' using blocks of ', nrow_block_actual, ' by ', ncol_block_actual
1322
1323 IF (transb_p) THEN
1324 nrow_global = n; ncol_global = m
1325 ELSE
1326 nrow_global = m; ncol_global = n
1327 END IF
1328 NULLIFY (fmstruct_b)
1329 CALL cp_fm_struct_create(fmstruct=fmstruct_b, para_env=para_env, context=blacs_env, &
1330 nrow_global=nrow_global, ncol_global=ncol_global, &
1331 nrow_block=nrow_block, ncol_block=ncol_block, force_block=force_blocksize)
1332 CALL cp_fm_struct_get(fmstruct_b, nrow_block=nrow_block_actual, ncol_block=ncol_block_actual)
1333 IF (iw > 0) WRITE (iw, '(T2,A,I9,A,I9,A,I5,A,I5)') 'matrix B ', nrow_global, " by ", ncol_global, &
1334 ' using blocks of ', nrow_block_actual, ' by ', ncol_block_actual
1335
1336 NULLIFY (fmstruct_c)
1337 nrow_global = k
1338 ncol_global = n
1339 CALL cp_fm_struct_create(fmstruct=fmstruct_c, para_env=para_env, context=blacs_env, &
1340 nrow_global=nrow_global, ncol_global=ncol_global, &
1341 nrow_block=nrow_block, ncol_block=ncol_block, force_block=force_blocksize)
1342 CALL cp_fm_struct_get(fmstruct_c, nrow_block=nrow_block_actual, ncol_block=ncol_block_actual)
1343 IF (iw > 0) WRITE (iw, '(T2,A,I9,A,I9,A,I5,A,I5)') 'matrix C ', nrow_global, " by ", ncol_global, &
1344 ' using blocks of ', nrow_block_actual, ' by ', ncol_block_actual
1345
1346 CALL cp_fm_create(matrix=matrix_a, matrix_struct=fmstruct_a, name="MATRIX A")
1347 CALL cp_fm_create(matrix=matrix_b, matrix_struct=fmstruct_b, name="MATRIX B")
1348 CALL cp_fm_create(matrix=matrix_c, matrix_struct=fmstruct_c, name="MATRIX C")
1349
1350 CALL random_number(matrix_a%local_data)
1351 CALL random_number(matrix_b%local_data)
1352 CALL random_number(matrix_c%local_data)
1353
1354 IF (iw > 0) CALL m_flush(iw)
1355
1356 t1 = m_walltime()
1357 DO i_loop = 1, n_loop
1358 t3 = m_walltime()
1359 CALL parallel_gemm(transa, transb, k, n, m, 1.0_dp, matrix_a, matrix_b, 0.0_dp, matrix_c)
1360 t4 = m_walltime()
1361 IF (iw > 0) THEN
1362 WRITE (iw, '(T2,A,T50,F12.6)') "cp_fm_gemm timing: ", (t4 - t3)
1363 CALL m_flush(iw)
1364 END IF
1365 END DO
1366 t2 = m_walltime()
1367
1368 IF (iw > 0) THEN
1369 WRITE (iw, '(T2,A,T50,F12.6)') "average cp_fm_gemm timing: ", (t2 - t1)/n_loop
1370 IF (t2 > t1) THEN
1371 WRITE (iw, '(T2,A,T50,F12.6)') "cp_fm_gemm Gflops per MPI task: ", &
1372 2*real(m, kind=dp)*real(n, kind=dp)*real(k, kind=dp)*n_loop/max(0.001_dp, t2 - t1)/1.0e9_dp/para_env%num_pe
1373 END IF
1374 END IF
1375
1376 CALL cp_fm_release(matrix=matrix_a)
1377 CALL cp_fm_release(matrix=matrix_b)
1378 CALL cp_fm_release(matrix=matrix_c)
1379 CALL cp_fm_struct_release(fmstruct=fmstruct_a)
1380 CALL cp_fm_struct_release(fmstruct=fmstruct_b)
1381 CALL cp_fm_struct_release(fmstruct=fmstruct_c)
1382 CALL cp_blacs_env_release(blacs_env=blacs_env)
1383
1384 END DO
1385
1386 END SUBROUTINE cp_fm_gemm_test
1387
1388! **************************************************************************************************
1389!> \brief Tests the DBCSR interface.
1390!> \param para_env ...
1391!> \param iw ...
1392!> \param input_section ...
1393! **************************************************************************************************
1394 SUBROUTINE cp_dbcsr_tests(para_env, iw, input_section)
1395
1396 TYPE(mp_para_env_type), POINTER :: para_env
1397 INTEGER :: iw
1398 TYPE(section_vals_type), POINTER :: input_section
1399
1400 CHARACTER, DIMENSION(3) :: types
1401 INTEGER :: data_type, i_rep, k, m, n, n_loop, &
1402 n_rep, test_type
1403 INTEGER, DIMENSION(:), POINTER :: bs_k, bs_m, bs_n, nproc
1404 LOGICAL :: always_checksum, retain_sparsity, &
1405 transa_p, transb_p
1406 REAL(kind=dp) :: alpha, beta, filter_eps, s_a, s_b, s_c
1407
1408! ---------------------------------------------------------------------------
1409
1410 NULLIFY (bs_m, bs_n, bs_k)
1411 CALL section_vals_get(input_section, n_repetition=n_rep)
1412 CALL dbcsr_reset_randmat_seed()
1413 DO i_rep = 1, n_rep
1414 ! how often should we do the multiply
1415 CALL section_vals_val_get(input_section, "N_loop", i_rep_section=i_rep, i_val=n_loop)
1416
1417 ! matrices def.
1418 CALL section_vals_val_get(input_section, "TEST_TYPE", i_rep_section=i_rep, i_val=test_type)
1419 CALL section_vals_val_get(input_section, "DATA_TYPE", i_rep_section=i_rep, i_val=data_type)
1420 CALL section_vals_val_get(input_section, "K", i_rep_section=i_rep, i_val=k)
1421 CALL section_vals_val_get(input_section, "N", i_rep_section=i_rep, i_val=n)
1422 CALL section_vals_val_get(input_section, "M", i_rep_section=i_rep, i_val=m)
1423 CALL section_vals_val_get(input_section, "transa", i_rep_section=i_rep, l_val=transa_p)
1424 CALL section_vals_val_get(input_section, "transb", i_rep_section=i_rep, l_val=transb_p)
1425 CALL section_vals_val_get(input_section, "bs_m", i_rep_section=i_rep, &
1426 i_vals=bs_m)
1427 CALL section_vals_val_get(input_section, "bs_n", i_rep_section=i_rep, &
1428 i_vals=bs_n)
1429 CALL section_vals_val_get(input_section, "bs_k", i_rep_section=i_rep, &
1430 i_vals=bs_k)
1431 CALL section_vals_val_get(input_section, "keepsparse", i_rep_section=i_rep, l_val=retain_sparsity)
1432 CALL section_vals_val_get(input_section, "asparsity", i_rep_section=i_rep, r_val=s_a)
1433 CALL section_vals_val_get(input_section, "bsparsity", i_rep_section=i_rep, r_val=s_b)
1434 CALL section_vals_val_get(input_section, "csparsity", i_rep_section=i_rep, r_val=s_c)
1435 CALL section_vals_val_get(input_section, "alpha", i_rep_section=i_rep, r_val=alpha)
1436 CALL section_vals_val_get(input_section, "beta", i_rep_section=i_rep, r_val=beta)
1437 CALL section_vals_val_get(input_section, "nproc", i_rep_section=i_rep, &
1438 i_vals=nproc)
1439 CALL section_vals_val_get(input_section, "atype", i_rep_section=i_rep, &
1440 c_val=types(1))
1441 CALL section_vals_val_get(input_section, "btype", i_rep_section=i_rep, &
1442 c_val=types(2))
1443 CALL section_vals_val_get(input_section, "ctype", i_rep_section=i_rep, &
1444 c_val=types(3))
1445 CALL section_vals_val_get(input_section, "filter_eps", &
1446 i_rep_section=i_rep, r_val=filter_eps)
1447 CALL section_vals_val_get(input_section, "ALWAYS_CHECKSUM", i_rep_section=i_rep, l_val=always_checksum)
1448
1449 CALL dbcsr_run_tests(para_env%get_handle(), iw, nproc, &
1450 [m, n, k], &
1451 [transa_p, transb_p], &
1452 bs_m, bs_n, bs_k, &
1453 [s_a, s_b, s_c], &
1454 alpha, beta, &
1455 data_type=data_type, &
1456 test_type=test_type, &
1457 n_loops=n_loop, eps=filter_eps, retain_sparsity=retain_sparsity, &
1458 always_checksum=always_checksum)
1459 END DO
1460 END SUBROUTINE cp_dbcsr_tests
1461
1462! **************************************************************************************************
1463!> \brief Tests the DBM library.
1464!> \param para_env ...
1465!> \param iw ...
1466!> \param input_section ...
1467! **************************************************************************************************
1468 SUBROUTINE run_dbm_tests(para_env, iw, input_section)
1469
1470 TYPE(mp_para_env_type), POINTER :: para_env
1471 INTEGER :: iw
1472 TYPE(section_vals_type), POINTER :: input_section
1473
1474 INTEGER :: i_rep, k, m, n, n_loop, n_rep
1475 INTEGER, DIMENSION(:), POINTER :: bs_k, bs_m, bs_n
1476 LOGICAL :: always_checksum, retain_sparsity, &
1477 transa_p, transb_p
1478 REAL(kind=dp) :: alpha, beta, filter_eps, s_a, s_b, s_c
1479
1480! ---------------------------------------------------------------------------
1481
1482 NULLIFY (bs_m, bs_n, bs_k)
1483 CALL section_vals_get(input_section, n_repetition=n_rep)
1484 CALL dbcsr_reset_randmat_seed()
1485 DO i_rep = 1, n_rep
1486 CALL section_vals_val_get(input_section, "N_loop", i_rep_section=i_rep, i_val=n_loop)
1487 CALL section_vals_val_get(input_section, "K", i_rep_section=i_rep, i_val=k)
1488 CALL section_vals_val_get(input_section, "N", i_rep_section=i_rep, i_val=n)
1489 CALL section_vals_val_get(input_section, "M", i_rep_section=i_rep, i_val=m)
1490 CALL section_vals_val_get(input_section, "transa", i_rep_section=i_rep, l_val=transa_p)
1491 CALL section_vals_val_get(input_section, "transb", i_rep_section=i_rep, l_val=transb_p)
1492 CALL section_vals_val_get(input_section, "bs_m", i_rep_section=i_rep, i_vals=bs_m)
1493 CALL section_vals_val_get(input_section, "bs_n", i_rep_section=i_rep, i_vals=bs_n)
1494 CALL section_vals_val_get(input_section, "bs_k", i_rep_section=i_rep, i_vals=bs_k)
1495 CALL section_vals_val_get(input_section, "keepsparse", i_rep_section=i_rep, l_val=retain_sparsity)
1496 CALL section_vals_val_get(input_section, "asparsity", i_rep_section=i_rep, r_val=s_a)
1497 CALL section_vals_val_get(input_section, "bsparsity", i_rep_section=i_rep, r_val=s_b)
1498 CALL section_vals_val_get(input_section, "csparsity", i_rep_section=i_rep, r_val=s_c)
1499 CALL section_vals_val_get(input_section, "alpha", i_rep_section=i_rep, r_val=alpha)
1500 CALL section_vals_val_get(input_section, "beta", i_rep_section=i_rep, r_val=beta)
1501 CALL section_vals_val_get(input_section, "filter_eps", i_rep_section=i_rep, r_val=filter_eps)
1502 CALL section_vals_val_get(input_section, "ALWAYS_CHECKSUM", i_rep_section=i_rep, l_val=always_checksum)
1503
1504 CALL dbm_run_tests(mp_group=para_env, &
1505 io_unit=iw, &
1506 matrix_sizes=[m, n, k], &
1507 trs=[transa_p, transb_p], &
1508 bs_m=bs_m, &
1509 bs_n=bs_n, &
1510 bs_k=bs_k, &
1511 sparsities=[s_a, s_b, s_c], &
1512 alpha=alpha, &
1513 beta=beta, &
1514 n_loops=n_loop, &
1515 eps=filter_eps, &
1516 retain_sparsity=retain_sparsity, &
1517 always_checksum=always_checksum)
1518 END DO
1519 END SUBROUTINE run_dbm_tests
1520
1521END MODULE library_tests
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
Test of Electron Repulsion Routines (ERI).
real(kind=dp), parameter threshold
subroutine, public eri_test(iw)
...
Handles all functions related to the CELL.
subroutine, public init_cell(cell, hmat, periodic)
Initialise/readjust a simulation cell after hmat has been changed.
subroutine, public cell_create(cell, hmat, periodic, tag)
allocates and initializes a cell
Handles all functions related to the CELL.
Definition cell_types.F:15
subroutine, public cell_release(cell)
releases the given cell (see doc/ReferenceCounting.html)
Definition cell_types.F:704
Test of the Gaunt coefficients.
Definition cg_test.F:21
subroutine, public gaunt_coefficient_test()
Compare the Gaunt coefficients against a Lebedev quadrature of the triple product of spherical harmon...
Definition cg_test.F:47
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
subroutine, public cp_blacs_env_create(blacs_env, para_env, blacs_grid_layout, blacs_repeatable, row_major, grid_2d)
allocates and initializes a type that represent a blacs context
Interface to Minimax-Ewald method for periodic ERI's to be used in CP2K.
subroutine, public cp_eri_mme_perf_acc_test(para_env, iw, eri_mme_test_section)
...
Utility routines to open and close files.
Definition cp_files.F:22
subroutine, public open_file(file_name, unit_number, file_status, file_form, file_action, file_position, file_pad, file_access, debug)
Opens a file and returns its logical unit number.
Definition cp_files.F:196
subroutine, public close_file(unit_number, file_status)
Closes an open file given by its logical unit number.
Definition cp_files.F:63
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, c_first_col, c_first_row)
computes matrix_c = beta * matrix_c + alpha * ( matrix_a ** transa ) * ( matrix_b ** transb )
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
Definition cp_fm_diag.F:17
subroutine, public cp_fm_syevd(matrix, eigenvectors, eigenvalues, info)
Computes all eigenvalues and vectors of a real symmetric matrix significantly faster than syevx,...
Definition cp_fm_diag.F:590
subroutine, public cp_fm_syevx(matrix, eigenvectors, eigenvalues, neig, work_syevx)
compute eigenvalues and optionally eigenvectors of a real symmetric matrix using scalapack....
Definition cp_fm_diag.F:814
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_get(fmstruct, para_env, context, descriptor, ncol_block, nrow_block, nrow_global, ncol_global, first_p_pos, row_indices, col_indices, nrow_local, ncol_local, nrow_locals, ncol_locals, local_leading_dimension)
returns the values of various attributes of the matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_set_submatrix(fm, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
sets a submatrix of a full matrix fm(start_row:start_row+n_rows,start_col:start_col+n_cols) = alpha*o...
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
integer function, public cp_fm_pilaenv(ictxt, prec)
...
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
subroutine, public init_input_type(input_settings, nsmax, rs_grid_section, ilevel, higher_grid_layout)
parses an input section to assign the proper values to the input type
subroutine, public dbm_run_tests(mp_group, io_unit, matrix_sizes, trs, bs_m, bs_n, bs_k, sparsities, alpha, beta, n_loops, eps, retain_sparsity, always_checksum)
Tests the DBM library.
Definition dbm_tests.F:54
subroutine, public fft_radix_operations(radix_in, radix_out, operation)
Determine the allowed lengths of FFT's '''.
Definition fft_tools.F:233
integer, parameter, public bwfft
Definition fft_tools.F:146
subroutine, public finalize_fft(para_env, wisdom_file, export_wisdom)
does whatever is needed to finalize the current fft setup
Definition fft_tools.F:209
integer, parameter, public fft_radix_closest
Definition fft_tools.F:147
subroutine, public init_fft(fftlib, alltoall, pool_limit, wisdom_file, plan_style)
...
Definition fft_tools.F:181
integer, parameter, public fwfft
Definition fft_tools.F:146
Define type storing the global information of a run. Keep the amount of stored data small....
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_diag_syevd
integer, parameter, public do_mat_read
integer, parameter, public do_pwgrid_ns_fullspace
integer, parameter, public do_diag_syevx
integer, parameter, public do_pwgrid_spherical
integer, parameter, public do_mat_random
integer, parameter, public do_pwgrid_ns_halfspace
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Performance tests for basic tasks like matrix multiplies, copy, fft.
subroutine, public lib_test(root_section, para_env, globenv)
Master routine for tests.
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:126
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:143
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public gaussi
Interface to the message passing library MPI.
Routines to calculate the minimax coefficients in order to approximate 1/x as a sum over exponential ...
Definition minimax_exp.F:29
subroutine, public validate_exp_minimax(n_r, iw)
Unit test checking that numerical error of minimax approximations generated using any k15 or k53 coef...
Interface to the message passing library MPI.
subroutine, public mpi_perf_test(comm, npow, output_unit)
Tests the MPI library.
basic linear algebra operations for full matrixes
Parallel (pseudo)random number generator (RNG) for multiple streams and substreams of random numbers.
subroutine advance(self, e, c)
Advance the state by n steps, i.e. jump n steps forward, if n > 0, or backward if n < 0.
integer, parameter, public uniform
integer, parameter, public halfspace
integer, parameter, public fullspace
This module defines the grid data type and some basic operations on it.
Definition pw_grids.F:36
subroutine, public pw_grid_release(pw_grid)
releases the given pw grid
Definition pw_grids.F:2204
subroutine, public rs_grid_print(rs, iounit)
Print information on grids to output.
subroutine, public rs_grid_create(rs, desc)
...
subroutine, public rs_grid_create_descriptor(desc, pw_grid, input_settings, border_points)
Determine the setup of real space grids - this is divided up into the creation of a descriptor and th...
subroutine, public transfer_pw2rs(rs, pw)
...
subroutine, public rs_grid_release_descriptor(rs_desc)
releases the given rs grid descriptor (see doc/ReferenceCounting.html)
subroutine, public transfer_rs2pw(rs, pw)
...
subroutine, public rs_grid_release(rs_grid)
releases the given rs grid (see doc/ReferenceCounting.html)
subroutine, public rs_grid_zero(rs)
Initialize grid to zero.
Calculates 2-center integrals for different r12 operators comparing the Solid harmonic Gaussian integ...
subroutine, public shg_integrals_perf_acc_test(iw, shg_integrals_test_section)
Unit test for performance and accuracy of the SHG integrals.
Definition and construction of time/frequency grids for correlation methods.
subroutine, public test_least_square_ft(nr, iw)
test the singular value decomposition for the computation of integration weights for the Fourier tran...
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains the initially parsed file and the initial parallel environment
stores all the informations relevant to an mpi environment