54 use,
intrinsic :: iso_fortran_env
106 real(real64) :: shift_aux
107 type(derivatives_t),
pointer :: der_aux => null()
108 type(preconditioner_t) :: prec_aux
118 type(namespace_t),
intent(in) :: namespace
120 type(test_parameters_t) :: param
127 call param%init_from_file(namespace)
210 call parse_variable(namespace,
'TestMode', option__testmode__hartree, test_mode)
220 select case (test_mode)
221 case (option__testmode__hartree)
223 case (option__testmode__derivatives)
225 case (option__testmode__orthogonalization)
227 case (option__testmode__interpolation)
229 case (option__testmode__ion_interaction)
231 case (option__testmode__projector)
233 case (option__testmode__dft_u)
235 case (option__testmode__hamiltonian_apply)
237 case (option__testmode__density_calc)
239 case (option__testmode__exp_apply)
241 case (option__testmode__boundaries)
243 case (option__testmode__subspace_diag)
245 case (option__testmode__batch_ops)
247 case (option__testmode__clock)
249 case (option__testmode__linear_solver)
251 case (option__testmode__cgal)
253 case (option__testmode__dense_eigensolver)
255 case (option__testmode__grid_interpolation)
257 case (option__testmode__iihash)
259 case (option__testmode__sihash)
261 case (option__testmode__sphash)
263 case (option__testmode__mpiwrappers)
265 case (option__testmode__regridding)
267 case (option__testmode__helmholtz_decomposition)
269 case (option__testmode__vecpot_analytical)
271 case (option__testmode__current_density)
273 case (option__testmode__mixing_tests)
275 case (option__testmode__optimizers)
277 case (option__testmode__weighted_kmeans)
279 case (option__testmode__csv_input)
281 case (option__testmode__composition_chebyshev)
283 case (option__testmode__lalg_adv)
285 case (option__testmode__isdf_serial)
287 case (option__testmode__isdf)
305 sys =>
electrons_t(namespace, generate_epot=.false.)
307 call poisson_test(sys%hm%psolver, sys%space, sys%gr, sys%ions%latt, namespace, param%repetitions)
308 safe_deallocate_p(sys)
325 sys =>
electrons_t(namespace, generate_epot=.false.)
328 call helmholtz%init(namespace, sys%gr, sys%mc, sys%space)
331 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Hertzian dipole test"
335 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Gaussian test"
337 call gaussian_test(helmholtz, sys%gr, sys%namespace, sys%space)
339 safe_deallocate_p(sys)
346 use,
intrinsic :: iso_c_binding, only: c_ptr
350 real(real64),
allocatable :: rho(:), x(:),
center(:)
351 real(real64) :: rr, alpha, beta, res
354 real(real64),
parameter :: threshold = 1.e-7_real64
355 type(c_ptr) :: userdata(0)
361 sys =>
electrons_t(namespace, generate_epot=.false.)
367 shift_aux = 0.25_real64
375 alpha =
m_four * sys%gr%spacing(1)
376 beta =
m_one / (alpha**sys%space%dim *
sqrt(
m_pi)**sys%space%dim)
378 safe_allocate(
center(1:sys%space%dim))
381 safe_allocate(rho(1:sys%gr%np))
385 rho(ip) = beta*
exp(-(rr/alpha)**2)
388 safe_allocate(x(1:sys%gr%np))
394 write(
message(1),
'(a,i6,a)')
"Info: CG converged with ", iter,
" iterations."
395 write(
message(2),
'(a,e14.6)')
"Info: The residue is ", res
396 write(
message(3),
'(a,e14.6)')
"Info: Norm solution CG ",
dmf_nrm2(sys%gr, x)
401 safe_deallocate_a(rho)
402 safe_deallocate_p(sys)
417 use,
intrinsic :: iso_c_binding, only: c_ptr
418 real(real64),
contiguous,
intent(in) :: x(:)
419 real(real64),
contiguous,
intent(out) :: Hx(:)
420 type(c_ptr),
intent(in) :: userdata(:)
422 real(real64),
allocatable :: tmpx(:)
426 safe_allocate(tmpx(1:
mesh_aux%np_part))
431 safe_deallocate_a(tmpx)
443 complex(real64),
allocatable :: psi(:, :)
449 call messages_write(
'Info: Testing the nonlocal part of the pseudopotential with SOC')
454 sys =>
electrons_t(namespace, generate_epot=.false.)
463 call sys%st%group%psib(1, 1)%copy_to(epsib)
467 do itime = 1, param%repetitions
469 sys%hm%ep%natoms, 2, sys%st%group%psib(1, 1), epsib)
472 safe_allocate(psi(1:sys%gr%np, 1:sys%st%d%dim))
473 do itime = 1, epsib%nst
475 write(
message(1),
'(a,i1,3x, f12.6)')
"Norm state ", itime,
zmf_nrm2(sys%gr, 2, psi)
478 safe_deallocate_a(psi)
482 safe_deallocate_p(sys)
494 integer :: itime, ist
496 real(real64),
allocatable :: ddot(:,:,:), dweight(:,:)
497 complex(real64),
allocatable :: zdot(:,:,:), zweight(:,:)
498 logical :: skipSOrbitals, useAllOrbitals
516 if (sys%st%pack_states)
call sys%st%pack()
518 call sys%st%group%psib(1, 1)%copy_to(epsib2, copy_data = .
true.)
521 if (.not. sys%hm%phase%is_allocated())
then
522 call sys%st%group%psib(1, 1)%copy_to(epsib, copy_data = .
true.)
524 call sys%st%group%psib(1, 1)%copy_to(epsib)
525 call sys%hm%phase%apply_to(sys%gr, sys%gr%np, &
526 .false., epsib, src=sys%st%group%psib(1, 1))
527 epsib2%has_phase = .
true.
534 call parse_variable(namespace,
'UseAllAtomicOrbitals', .false., useallorbitals)
538 call dorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
539 skipsorbitals, useallorbitals, verbose=.false.)
540 safe_allocate(dweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
541 safe_allocate(ddot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
543 call zorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
544 skipsorbitals, useallorbitals, verbose=.false.)
546 safe_allocate(zweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
547 safe_allocate(zdot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
550 if (sys%hm%phase%is_allocated())
then
556 do itime = 1, param%repetitions
571 if (epsib%is_packed())
then
572 call epsib%do_unpack(force = .
true.)
575 do ist = 1, epsib%nst
577 write(
message(1),
'(a,i2,3x,e13.6)')
"Dotp state ", ist, ddot(1,1,ist)
579 write(
message(1),
'(a,i2,2(3x,e13.6))')
"Dotp state ", ist, zdot(1,1,ist)
587 safe_deallocate_a(dweight)
588 safe_deallocate_a(zweight)
589 safe_deallocate_a(ddot)
590 safe_deallocate_a(zdot)
596 safe_deallocate_p(sys)
608 integer :: itime, terms
627 call parse_variable(namespace,
'TestHamiltonianApply', option__testhamiltonianapply__term_all, terms)
628 if (terms == 0) terms = huge(1)
633 call messages_write(
'Info: Testing the application of the Hamiltonian')
638 sys =>
electrons_t(namespace, generate_epot=.false.)
645 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
648 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
650 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
652 call sys%st%group%psib(1, 1)%copy_to(hpsib)
654 if (sys%hm%apply_packed())
then
655 call sys%st%group%psib(1, 1)%do_pack()
656 call hpsib%do_pack(copy = .false.)
659 do itime = 1, param%repetitions
669 if (hpsib%is_packed())
then
670 call hpsib%do_unpack(force = .
true.)
675 call hpsib%end(copy = .false.)
677 safe_deallocate_p(sys)
700 sys =>
electrons_t(namespace, generate_epot=.false.)
705 if (sys%st%pack_states)
call sys%st%pack()
707 do itime = 1, param%repetitions
711 write(
message(1),
'(a,3x, f12.6)')
"Norm density ",
dmf_nrm2(sys%gr, sys%st%rho(:,1))
715 safe_deallocate_p(sys)
738 sys =>
electrons_t(namespace, generate_epot=.false.)
743 if (sys%st%pack_states)
call sys%st%pack()
745 do itime = 1, param%repetitions
746 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
752 safe_deallocate_p(sys)
766 integer,
allocatable :: degree(:)
774 call messages_write(
'Info: Testing Chebyshev filtering and its composition rule')
784 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
787 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
790 safe_allocate(degree(1:sys%st%group%nblocks))
800 call parse_variable(namespace,
'TestCompositionOrder', 2, degree_n)
812 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
814 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
818 call messages_write(
'Info: Result after calling 2n-th order filtering')
824 call sys%st%group%psib(1, 1)%copy_to(psib, copy_data=.
true.)
827 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
828 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
830 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
831 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
842 safe_deallocate_a(degree)
843 safe_deallocate_p(bounds)
847 safe_deallocate_p(sys)
872 sys =>
electrons_t(namespace, generate_epot=.false.)
879 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
882 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
886 if (sys%hm%apply_packed())
then
887 call sys%st%group%psib(1, 1)%do_pack()
890 do itime = 1, param%repetitions
891 call te%apply_batch(sys%namespace, sys%gr, sys%hm, sys%st%group%psib(1, 1), 1e-3_real64)
897 safe_deallocate_p(sys)
911 real(real64),
allocatable :: diff(:)
922 sys =>
electrons_t(namespace, generate_epot=.false.)
928 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
931 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
933 call sdiag%init(sys%namespace, sys%st)
935 safe_allocate(diff(1:sys%st%nst))
937 do itime = 1, param%repetitions
939 call dsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
941 call zsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
945 safe_deallocate_a(diff)
950 safe_deallocate_p(sys)
962 integer :: itime, ops, ops_default, ist, jst, nst
964 real(real64),
allocatable :: tmp(:)
965 real(real64),
allocatable :: ddotv(:)
966 complex(real64),
allocatable :: zdotv(:)
967 real(real64),
allocatable :: ddot(:,:), df(:,:), dweight(:), dpoints(:,:,:)
968 complex(real64),
allocatable :: zdot(:,:), zf(:,:), zweight(:), zpoints(:,:,:)
969 integer :: sp, block_size, size
998 option__testbatchops__ops_axpy + &
999 option__testbatchops__ops_scal + &
1000 option__testbatchops__ops_nrm2 + &
1001 option__testbatchops__ops_dotp_matrix + &
1002 option__testbatchops__ops_dotp_self + &
1003 option__testbatchops__ops_dotp_vector + &
1004 option__testbatchops__ops_ax_function_py + &
1005 option__testbatchops__ops_get_points
1016 sys =>
electrons_t(namespace, generate_epot=.false.)
1017 call sys%init_parallelization(
mpi_world)
1021 if (sys%st%pack_states)
call sys%st%pack()
1023 if (
bitand(ops, option__testbatchops__ops_axpy) /= 0)
then
1024 message(1) =
'Info: Testing axpy'
1027 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1028 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1030 do itime = 1, param%repetitions
1031 call batch_axpy(sys%gr%np, 0.1_real64, xx, yy)
1039 if (
bitand(ops, option__testbatchops__ops_scal) /= 0)
then
1040 message(1) =
'Info: Testing scal'
1043 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1044 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1046 do itime = 1, param%repetitions
1055 if (
bitand(ops, option__testbatchops__ops_nrm2) /= 0)
then
1056 message(1) =
'Info: Testing nrm2'
1059 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1060 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1062 safe_allocate(tmp(1:xx%nst))
1064 do itime = 1, param%repetitions
1067 do itime = 1, xx%nst
1068 write(
message(1),
'(a,i1,3x,e23.16)')
"Nrm2 norm state ", itime, tmp(itime)
1072 safe_deallocate_a(tmp)
1078 if (
bitand(ops, option__testbatchops__ops_dotp_matrix) /= 0)
then
1080 message(1) =
'Info: Testing dotp_matrix'
1083 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1084 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1086 nst = sys%st%group%psib(1, 1)%nst
1089 safe_allocate(ddot(1:nst, 1:nst))
1090 do itime = 1, param%repetitions
1096 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_matrix states', ist, jst, ddot(ist,jst)
1100 safe_deallocate_a(ddot)
1102 safe_allocate(zdot(1:nst, 1:nst))
1103 do itime = 1, param%repetitions
1109 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_matrix states', ist, jst, zdot(ist,jst)
1113 safe_deallocate_a(zdot)
1120 if (
bitand(ops, option__testbatchops__ops_dotp_vector) /= 0)
then
1122 message(1) =
'Info: Testing dotp_vector'
1125 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1126 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1128 nst = sys%st%group%psib(1, 1)%nst
1131 safe_allocate(ddotv(1:nst))
1132 do itime = 1, param%repetitions
1137 write(
message(ist),
'(a,i3,3x,e23.16)')
'Dotp_vector state', ist, ddotv(ist)
1140 safe_deallocate_a(ddotv)
1142 safe_allocate(zdotv(1:nst))
1143 do itime = 1, param%repetitions
1148 write(
message(ist),
'(a,i3,3x,2(e23.16,1x))')
'Dotp_vector state', ist, zdotv(ist)
1151 safe_deallocate_a(zdotv)
1158 if (
bitand(ops, option__testbatchops__ops_dotp_self) /= 0)
then
1160 message(1) =
'Info: Testing dotp_self'
1163 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1165 nst = sys%st%group%psib(1, 1)%nst
1168 safe_allocate(ddot(1:nst, 1:nst))
1169 do itime = 1, param%repetitions
1175 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_self states', ist, jst, ddot(ist,jst)
1179 safe_deallocate_a(ddot)
1181 safe_allocate(zdot(1:nst, 1:nst))
1182 do itime = 1, param%repetitions
1188 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_self states', ist, jst, zdot(ist,jst)
1192 safe_deallocate_a(zdot)
1198 if (
bitand(ops, option__testbatchops__ops_ax_function_py) /= 0)
then
1199 message(1) =
'Info: Testing ax_function_py'
1202 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1205 safe_allocate(df(sys%gr%np, sys%st%d%dim))
1206 safe_allocate(dweight(1:sys%st%group%psib(1, 1)%nst_linear))
1207 dweight = 0.1_real64
1210 do itime = 1, param%repetitions
1213 safe_deallocate_a(df)
1214 safe_deallocate_a(dweight)
1216 safe_allocate(zf(sys%gr%np, sys%st%d%dim))
1217 safe_allocate(zweight(1:sys%st%group%psib(1, 1)%nst_linear))
1218 zweight = cmplx(0.1_real64,
m_zero, real64)
1221 do itime = 1, param%repetitions
1224 safe_deallocate_a(zf)
1231 if (
bitand(ops, option__testbatchops__ops_get_points) /= 0)
then
1236 call sys%st%group%psib(1, 1)%copy_to(yy)
1242 safe_allocate(dpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1244 do itime = 1, param%repetitions
1245 do sp = 1, sys%gr%np, block_size
1246 size = min(block_size, sys%gr%np - sp + 1)
1251 safe_deallocate_a(dpoints)
1257 safe_allocate(zpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1259 do itime = 1, param%repetitions
1260 do sp = 1, sys%gr%np, block_size
1261 size = min(block_size, sys%gr%np - sp + 1)
1266 safe_deallocate_a(dpoints)
1277 safe_deallocate_p(sys)
1291 sys =>
electrons_t(namespace, generate_epot=.false.)
1292 call sys%init_parallelization(
mpi_world)
1294 message(1) =
'Info: Testing the finite-differences derivatives.'
1298 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1299 call dderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1302 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1303 call zderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1306 safe_deallocate_p(sys)
1325 sys =>
electrons_t(namespace, generate_epot=.false.)
1326 call sys%init_parallelization(
mpi_world)
1328 message(1) =
'Info: Testing orthogonalization.'
1332 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1333 message(1) =
'Info: Real wave-functions.'
1335 do itime = 1, param%repetitions
1340 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1341 message(1) =
'Info: Complex wave-functions.'
1343 do itime = 1, param%repetitions
1348 safe_deallocate_p(sys)
1363 sys =>
electrons_t(namespace, generate_epot=.false.)
1364 call sys%init_parallelization(
mpi_world)
1366 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1375 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1377 call messages_write(
'Info: Testing complex interpolation routines')
1385 safe_deallocate_p(sys)
1400 sys =>
electrons_t(namespace, generate_epot=.false.)
1401 call sys%init_parallelization(
mpi_world)
1403 call ion_interaction_test(sys%space, sys%ions%latt, sys%ions%atom, sys%ions%natoms, sys%ions%pos, &
1404 sys%gr%box%bounding_box_l, namespace, sys%mc)
1406 safe_deallocate_p(sys)
1415 type(
grid_t),
intent(in) :: gr
1416 class(
batch_t),
intent(inout) :: psib
1417 character(*),
optional,
intent(in) :: string
1420 complex(real64),
allocatable :: zpsi(:, :)
1421 real(real64),
allocatable :: dpsi(:, :)
1423 character(80) :: string_
1430 safe_allocate(dpsi(1:gr%np, 1:st%d%dim))
1432 safe_allocate(zpsi(1:gr%np, 1:st%d%dim))
1435 do itime = 1, psib%nst
1438 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
dmf_nrm2(gr, st%d%dim, dpsi)
1441 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
zmf_nrm2(gr, st%d%dim, zpsi)
1447 safe_deallocate_a(dpsi)
1449 safe_deallocate_a(zpsi)
1465 write(
message(1),
'(a)')
" Operation Counter Time Global step"
1480 call clock%set(
clock_t(time_step=
m_four, initial_iteration=1))
1484 write(
message(1),
'(a)')
" Clock comparisons:"
1487 other_clock =
clock_t(time_step=
m_one, initial_iteration=5)
1499 character(len=*),
intent(in) :: operation
1501 write(
message(1),
'(a17,1x,i6,1x,f10.1,1x,i16)') operation, clock%counter(), clock%value(), clock%global_step()
1506 character(len=*),
intent(in) :: condition
1507 logical,
intent(in) :: result
1509 write(
message(1),
'(a10," = ",i1," (",l1,")")') condition, abs(transfer(result, 0)), result
1526 message(1) =
"cgal_polyhedron_point_inside"
1538 integer :: N, ii, jj, N_list(4), i_N
1539 real(real64),
allocatable :: matrix(:, :), eigenvectors(:, :), eigenvalues(:), test(:)
1540 real(real64),
allocatable :: differences(:)
1544 n_list = [15, 32, 100, 500]
1548 safe_allocate(matrix(1:n, 1:n))
1549 safe_allocate(eigenvectors(1:n, 1:n))
1550 safe_allocate(eigenvalues(1:n))
1551 safe_allocate(test(1:n))
1552 safe_allocate(differences(1:n))
1558 matrix(ii, jj) = ii * jj
1563 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1567 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1568 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1570 write(
message(1),
"(A, I3, A, E13.6)")
"Parallel solver - N: ", n, &
1571 ", average difference: ", sum(differences)/n
1575 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1579 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1580 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1582 write(
message(1),
"(A, I3, A, E13.6)")
"Serial solver - N: ", n, &
1583 ", average difference: ", sum(differences)/n
1586 safe_deallocate_a(matrix)
1587 safe_deallocate_a(eigenvectors)
1588 safe_deallocate_a(eigenvalues)
1589 safe_deallocate_a(test)
1590 safe_deallocate_a(differences)
1597 class(
batch_t),
intent(inout) :: psib
1598 class(
mesh_t),
intent(in) :: mesh
1600 real(real64),
allocatable :: dff(:)
1601 complex(real64),
allocatable :: zff(:)
1603 real(real64) :: da, db, dc
1604 complex(real64) :: za, zb, zc
1609 da =
m_one/mesh%box%bounding_box_l(1)
1615 za = da +
m_zi*0.01_real64
1616 zb = db*
exp(
m_zi*0.345_real64)
1617 zc = dc -
m_zi*50.0_real64
1619 safe_allocate(zff(1:mesh%np))
1620 do ist = 1, psib%nst_linear
1624 zff(ip) = zb*
exp(-za*sum(mesh%x(ip, :)**2)) + zc
1629 safe_deallocate_a(zff)
1631 safe_allocate(dff(1:mesh%np))
1632 do ist = 1, psib%nst_linear
1636 dff(ip) = db*
exp(-da*sum(mesh%x(ip, :)**2)) + dc
1641 safe_deallocate_a(dff)
1655 call sys%init_parallelization(
mpi_world)
1658 sys%gr%stencil, sys%mc, nlevels=3)
1664 safe_deallocate_p(sys)
1680 write(
message(1),*)
'hash[1] :', found,
value
1684 write(
message(1),*)
'hash[2] :', found,
value
1688 write(
message(1),*)
'hash[3] :', found,
value
1700 integer ::
value, sum
1709 write(
message(1),*)
'hash["one"]: ', found,
value
1713 write(
message(1),*)
'hash["two"]: ', found,
value
1717 write(
message(1),*)
'hash["three"]: ', found,
value
1724 do while (it%has_next())
1725 value = it%get_next()
1727 write(
message(1),
'(I3,A,I5)') counter,
': hash[...] = ',
value
1729 counter = counter + 1
1731 write(
message(1),*)
'counter = ', counter
1732 write(
message(2),*)
'sum = ', sum
1754 class(*),
pointer :: value
1756 integer :: count_clock, count_space
1758 safe_allocate(clock_2)
1772 write(
message(1),*)
'hash["one"]: ', found,
value%counter()
1775 write(
message(1),*)
'hash["one"]: ', found,
value%short_info()
1778 write(
message(1),*)
'wrong type. found = ', found
1785 write(
message(1),*)
'hash["two"]: ', found,
value%counter()
1788 write(
message(1),*)
'hash["two"]: ', found,
value%short_info()
1791 write(
message(1),*)
'wrong type. found = ',found
1795 safe_deallocate_a(clock_2)
1800 write(
message(1),*)
'hash["three"]: ', found,
value%counter()
1803 write(
message(1),*)
'hash["three"]: ', found,
value%short_info()
1806 write(
message(1),*)
'wrong type. found = ',found
1815 do while (it%has_next())
1816 value => it%get_next()
1819 count_clock = count_clock + 1
1821 count_space = count_space + 1
1825 write(
message(1), *)
'Count_clock = ', count_clock
1826 write(
message(2), *)
'Count_space = ', count_space
1839 real(real64),
allocatable :: ff_A(:), ff_A_reference(:), ff_B(:), ff_B_reference(:), diff_A(:), diff_B(:)
1840 real(real64) :: norm_ff, norm_diff
1849 call sysa%init_parallelization(
mpi_world)
1850 call sysb%init_parallelization(
mpi_world)
1853 safe_allocate(ff_a(1:sysa%gr%np))
1854 safe_allocate(ff_a_reference(1:sysa%gr%np))
1855 safe_allocate(diff_a(1:sysa%gr%np))
1856 safe_allocate(ff_b(1:sysb%gr%np))
1857 safe_allocate(ff_b_reference(1:sysb%gr%np))
1858 safe_allocate(diff_b(1:sysb%gr%np))
1860 do ip = 1, sysa%gr%np
1861 ff_a_reference(ip) =
values(sysa%gr%x(ip, :))
1863 do ip = 1, sysb%gr%np
1864 ff_b_reference(ip) =
values(sysb%gr%x(ip, :))
1868 regridding =>
regridding_t(sysb%gr, sysa%gr, sysa%space, sysa%namespace)
1869 call regridding%do_transfer(ff_b, ff_a_reference)
1870 safe_deallocate_p(regridding)
1873 do ip = 1, sysb%gr%np
1875 ff_b_reference(ip) =
m_zero
1878 diff_b(ip) = abs(ff_b_reference(ip) - ff_b(ip))
1881 norm_ff =
dmf_nrm2(sysb%gr, ff_b_reference)
1882 norm_diff =
dmf_nrm2(sysb%gr, diff_b)
1884 write(
message(1),
'(a, E14.6)')
"Forward: difference of reference to mapped function (rel.): ", &
1889 sysb%gr, ff_b_reference,
unit_one, ierr)
1893 sysa%gr, ff_a_reference,
unit_one, ierr)
1896 regridding =>
regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
1897 call regridding%do_transfer(ff_a, ff_b_reference)
1898 safe_deallocate_p(regridding)
1900 do ip = 1, sysa%gr%np
1902 ff_a_reference(ip) =
m_zero
1905 diff_a(ip) = abs(ff_a_reference(ip) - ff_a(ip))
1908 norm_ff =
dmf_nrm2(sysa%gr, ff_a_reference)
1909 norm_diff =
dmf_nrm2(sysa%gr, diff_a)
1911 write(
message(1),
'(a, E14.6)')
"Backward: difference of reference to mapped function (rel.): ", &
1916 sysa%gr, ff_a_reference,
unit_one, ierr)
1920 sysb%gr, ff_b_reference,
unit_one, ierr)
1922 safe_deallocate_a(ff_a)
1923 safe_deallocate_a(ff_a_reference)
1924 safe_deallocate_a(ff_b)
1925 safe_deallocate_a(ff_b_reference)
1926 safe_deallocate_a(diff_a)
1927 safe_deallocate_a(diff_b)
1928 safe_deallocate_p(sysa)
1929 safe_deallocate_p(sysb)
1935 real(real64) function values(xx)
1936 real(real64),
intent(in) :: xx(:)
1937 real(real64) :: xx0(1:size(xx, dim=1))
1938 real(real64),
parameter :: aa =
m_half
1939 real(real64),
parameter :: bb =
m_four
1943 values = bb *
exp(-aa*sum((xx-xx0)**2))
1953 type(namespace_t),
intent(in) :: namespace
1955 class(maxwell_t),
pointer :: maxwell_system
1957 real(real64),
allocatable :: magnetic_field(:,:)
1958 real(real64),
allocatable :: vector_potential_mag(:,:)
1959 real(real64),
allocatable :: vector_potential_analytical(:,:)
1960 real(real64),
allocatable :: delta(:,:)
1961 real(real64) :: exp_factor
1965 real(real64) :: sigma
1966 integer :: ip, j, ierr, nn
1967 integer(int64) :: out_how
1968 character(len=MAX_PATH_LEN) :: fname, fname2, fname3
1971 maxwell_system => maxwell_t(namespace)
1972 sigma = maxwell_system%gr%box%bounding_box_l(1)/10_real64
1973 call maxwell_system%init_parallelization(mpi_world)
1975 safe_allocate(magnetic_field(1:maxwell_system%gr%np_part, 1:3))
1976 safe_allocate(vector_potential_mag(1:maxwell_system%gr%np_part, 1:3))
1977 safe_allocate(vector_potential_analytical(1:maxwell_system%gr%np_part, 1:3))
1978 safe_allocate(delta(1:maxwell_system%gr%np, 1:3))
1991 call parse_variable(namespace,
'TestVectorPotentialType', option__testvectorpotentialtype__bounded, nn)
1994 case (option__testvectorpotentialtype__bounded)
1995 do ip = 1, maxwell_system%gr%np_part
1996 xx = maxwell_system%gr%x(ip, 1)
1997 yy = maxwell_system%gr%x(ip, 2)
1998 zz = maxwell_system%gr%x(ip, 3)
1999 exp_factor =
exp((-xx**2 - yy**2 - zz**2)*1/(2*sigma**2))
2000 magnetic_field(ip, 1) = exp_factor*yy*(1 - (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
2001 magnetic_field(ip, 2) = exp_factor * xx * (1 + (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
2002 magnetic_field(ip, 3) = exp_factor * 2 * xx * yy * zz * 1/(3*sigma**2)
2004 vector_potential_analytical(ip, 1) = m_third * xx * zz * exp_factor
2005 vector_potential_analytical(ip, 2) = - m_third * yy * zz * exp_factor
2006 vector_potential_analytical(ip, 3) = m_third * (-xx**2 + yy**2) * exp_factor
2008 case (option__testvectorpotentialtype__unbounded)
2010 do ip = 1, maxwell_system%gr%np_part
2011 magnetic_field(ip, 1) = maxwell_system%gr%x(ip, 2)
2012 magnetic_field(ip, 2) = maxwell_system%gr%x(ip, 1)
2013 magnetic_field(ip, 3) = m_zero
2015 vector_potential_analytical(ip, 1) = m_third * maxwell_system%gr%x(ip, 1) * maxwell_system%gr%x(ip, 3)
2016 vector_potential_analytical(ip, 2) = - m_third * maxwell_system%gr%x(ip, 2) * maxwell_system%gr%x(ip, 3)
2017 vector_potential_analytical(ip, 3) = - m_third * (maxwell_system%gr%x(ip, 1)**2 - maxwell_system%gr%x(ip, 2)**2)
2020 call maxwell_system%helmholtz%get_vector_potential(namespace, vector_potential_mag, magnetic_field)
2024 do ip = 1, maxwell_system%gr%np
2025 delta(ip,j) = vector_potential_analytical(ip, j) - vector_potential_mag(ip, j)
2030 write(message(j),*)
'j, norm2(delta)', j, norm2(delta(:,j))
2032 call messages_info(3)
2034 write(fname,
'(a)')
'deviation_from_analytical_formulation'
2035 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, maxwell_system%space, maxwell_system%gr, &
2036 delta, unit_one, ierr)
2037 write(fname2,
'(a)')
'vector_potential_analytical'
2038 call io_function_output_vector(out_how ,
'./' , trim(fname2), namespace, maxwell_system%space, maxwell_system%gr, &
2039 vector_potential_analytical, unit_one, ierr)
2040 write(fname3,
'(a)')
'vector_potential_mag'
2041 call io_function_output_vector(out_how ,
'./' , trim(fname3), namespace, maxwell_system%space, maxwell_system%gr, &
2042 vector_potential_mag, unit_one, ierr)
2044 safe_deallocate_a(magnetic_field)
2045 safe_deallocate_a(vector_potential_mag)
2046 safe_deallocate_a(vector_potential_analytical)
2047 safe_deallocate_a(delta)
2048 safe_deallocate_p(maxwell_system)
2054 type(multigrid_t),
intent(in) :: mgrid
2055 class(space_t),
intent(in) :: space
2057 real(real64),
allocatable :: guess0(:), res0(:), guess1(:)
2058 type(mesh_t),
pointer :: mesh0, mesh1
2059 real(real64) :: delta, xx(3,2), alpha, beta, rr
2060 integer :: nn, ip, ierr
2064 message(1) =
'Info: Testing the grid interpolation.'
2066 call messages_info(2)
2068 mesh0 => mgrid%level(0)%mesh
2069 mesh1 => mgrid%level(1)%mesh
2071 safe_allocate(guess0(1:mesh0%np_part))
2072 safe_allocate(res0(1:mesh0%np_part))
2073 safe_allocate(guess1(1:mesh1%np_part))
2075 alpha = m_four*mesh0%spacing(1)
2076 beta = m_one / (alpha**space%dim *
sqrt(m_pi)**space%dim)
2091 call mesh_r(mesh0, ip, rr, origin = xx(:, nn))
2092 guess0(ip) = guess0(ip) + (-1)**nn * beta*
exp(-(rr/alpha)**2)
2096 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_target", global_namespace, &
2097 space, mesh0, guess0, unit_one, ierr)
2098 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_target", global_namespace, &
2099 space, mesh0, guess0, unit_one, ierr)
2100 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_target", global_namespace, &
2101 space, mesh0, guess0, unit_one, ierr)
2108 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, injection)
2110 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2112 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_result", global_namespace, &
2113 space, mesh0, res0, unit_one, ierr)
2114 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_result", global_namespace, &
2115 space, mesh0, res0, unit_one, ierr)
2116 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_result", global_namespace, &
2117 space, mesh0, res0, unit_one, ierr)
2119 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2120 write(message(1),
'(a,e13.6)')
'Interpolation test (abs.) = ', delta
2126 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, fullweight)
2128 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2130 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"restriction_result", global_namespace, &
2131 space, mesh0, res0, unit_one, ierr)
2132 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"restriction_result", global_namespace, &
2133 space, mesh0, res0, unit_one, ierr)
2134 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"restriction_result", global_namespace, &
2135 space, mesh0, res0, unit_one, ierr)
2137 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2138 write(message(2),
'(a,e13.6)')
'Restriction test (abs.) = ', delta
2139 call messages_info(2)
2141 safe_deallocate_a(guess0)
2142 safe_deallocate_a(res0)
2143 safe_deallocate_a(guess1)
2151 type(namespace_t),
intent(in) :: namespace
2152 type(electrons_t),
pointer :: sys
2154 type(current_t) :: current
2155 character(len=MAX_PATH_LEN) :: fname
2156 integer :: ierr, ip, idir
2157 integer(int64) :: out_how
2158 real(real64),
allocatable :: current_para_ref(:,:), current_dia_ref(:,:), current_mag_ref(:,:), delta(:)
2159 real(real64) :: xx(3), rr, a0, mag_curr, sin_thet, sin_phi, cos_phi, vec_pot_slope
2160 complex(real64) :: alpha
2162 sys => electrons_t(namespace, generate_epot=.false.)
2163 call sys%init_parallelization(mpi_world)
2165 alpha = (0.0_real64, 0.5_real64)
2167 vec_pot_slope = 0.4_real64
2169 call states_elec_allocate_wfns(sys%st, sys%gr, wfs_type = type_cmplx)
2172 call current_init(current, namespace)
2174 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st)
2176 safe_allocate(sys%hm%hm_base%vector_potential(1:3, 1:sys%gr%np))
2178 sys%hm%hm_base%vector_potential = m_zero
2179 do ip = 1, sys%gr%np
2180 xx = sys%gr%x(ip, 1:3)
2181 sys%hm%hm_base%vector_potential(2, ip) = vec_pot_slope * xx(1) / p_c
2184 call states_elec_allocate_current(sys%st, sys%space, sys%gr)
2185 call density_calc(sys%st, sys%gr, sys%st%rho)
2187 call current_calculate(current, namespace, sys%gr, sys%hm, sys%space, sys%st)
2189 safe_allocate(current_para_ref(1:sys%gr%np,1:3))
2190 safe_allocate(current_dia_ref(1:sys%gr%np,1:3))
2191 safe_allocate(current_mag_ref(1:sys%gr%np,1:3))
2192 safe_allocate(delta(1:sys%gr%np))
2195 current_para_ref(:,:) = m_zero
2196 do ip = 1, sys%gr%np
2197 call mesh_r(sys%gr, ip, rr)
2198 xx = sys%gr%x(ip, 1:3)
2199 if (rr > r_small)
then
2201 psi_1s(rr, a0) *
dr_psi_2s(rr, a0) ) * aimag(alpha) / (1 + abs(alpha)**2) * xx(1:3) / rr
2205 write(fname,
'(a)')
'current_para'
2206 out_how = io_function_fill_how(
"PlaneZ")
2207 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2208 sys%st%current_para(:,:,1), unit_one, ierr)
2210 write(fname,
'(a)')
'current_para-ref'
2211 out_how = io_function_fill_how(
"PlaneZ")
2212 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2213 current_para_ref(:,:), unit_one, ierr)
2217 delta(:) = current_para_ref(1:sys%gr%np, idir) - sys%st%current_para(1:sys%gr%np, idir, 1)
2218 write(message(idir),*)
'idir =',idir,
', norm2(delta paramagnetic)',norm2(delta)
2220 call messages_info(3)
2223 current_dia_ref(:,:) = m_zero
2224 do ip = 1, sys%gr%np
2225 call mesh_r(sys%gr, ip, rr)
2226 current_dia_ref(ip,1:3) = - sys%hm%hm_base%vector_potential(1:3,ip) *&
2230 write(fname,
'(a)')
'current_dia'
2231 out_how = io_function_fill_how(
"PlaneZ")
2232 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2233 sys%st%current_dia(:,:,1), unit_one, ierr)
2235 write(fname,
'(a)')
'current_dia-ref'
2236 out_how = io_function_fill_how(
"PlaneZ")
2237 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2238 current_dia_ref(:,:), unit_one, ierr)
2242 delta(:) = current_dia_ref(1:sys%gr%np, idir) - sys%st%current_dia(1:sys%gr%np, idir, 1)
2243 write(message(idir),*)
'idir =',idir,
', norm2(delta diamagnetic)',norm2(delta)
2245 call messages_info(3)
2248 call current_calculate_mag(sys%gr%der, sys%st)
2251 current_mag_ref(:,:) = m_zero
2252 do ip = 1, sys%gr%np
2253 call mesh_r(sys%gr, ip, rr)
2254 xx = sys%gr%x(ip, 1:3)
2255 if (norm2(xx(1:2)) > r_small .and. rr > r_small)
then
2256 sin_thet = norm2(xx(1:2)) / rr
2257 sin_phi = xx(2) / norm2(xx(1:2))
2258 cos_phi = xx(1) / norm2(xx(1:2))
2262 current_mag_ref(ip,1) = m_half * mag_curr * sin_thet * sin_phi / (1+abs(alpha)**2)
2263 current_mag_ref(ip,2) = -m_half * mag_curr * sin_thet * cos_phi / (1+abs(alpha)**2)
2267 write(fname,
'(a)')
'current_mag'
2268 out_how = io_function_fill_how(
"PlaneZ")
2269 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2270 sys%st%current_mag(:,:,1), unit_one, ierr)
2272 write(fname,
'(a)')
'current_mag-ref'
2273 out_how = io_function_fill_how(
"PlaneZ")
2274 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2275 current_mag_ref(:,:), unit_one, ierr)
2279 delta(:) = current_mag_ref(1:sys%gr%np, idir) - sys%st%current_mag(1:sys%gr%np, idir, 1)
2280 write(message(idir),*)
'idir =',idir,
', norm2(delta magnetization)',norm2(delta)
2282 call messages_info(3)
2284 safe_deallocate_a(current_para_ref)
2285 safe_deallocate_a(current_dia_ref)
2286 safe_deallocate_a(current_mag_ref)
2287 safe_deallocate_a(delta)
2288 safe_deallocate_p(sys)
2294 class(batch_t),
intent(inout) :: psib
2295 class(mesh_t),
intent(in) :: mesh
2296 type(namespace_t),
intent(in) :: namespace
2297 complex(real64),
intent(in) :: alpha
2298 real(real64),
intent(in) :: a0
2300 complex(real64),
allocatable :: zff(:)
2307 safe_allocate(zff(1:mesh%np))
2308 if (type_is_complex(psib%type()))
then
2310 call mesh_r(mesh, ip, rr)
2312 call batch_set_state(psib, 1, mesh%np, zff)
2314 safe_deallocate_a(zff)
2316 write(message(1),*)
"States should be complex for the linear combination of hydrogenic states to work"
2317 call messages_info(1, namespace=namespace)
2324 real(real64),
intent(in) :: a0, rr
2325 complex(real64),
intent(in) :: alpha
2331 real(real64) function psi_1s(rr, a0)
2332 real(real64),
intent(in) :: a0, rr
2338 real(real64) function psi_2s(rr, a0)
2339 real(real64),
intent(in) :: a0, rr
2341 psi_2s =
sqrt(m_two) * a0**(-m_three/m_two) * (m_one - rr/(m_two * a0)) *
exp(-rr/(m_two * a0)) &
2342 / (m_two *
sqrt(m_pi))
2345 real(real64) function dr_psi_1s(rr, a0)
2346 real(real64),
intent(in) :: a0, rr
2351 real(real64) function dr_psi_2s(rr, a0)
2352 real(real64),
intent(in) :: a0, rr
2355 a0**(-m_five/m_two) *
exp(-rr/(m_two * a0)) / (
sqrt(m_two) * m_two *
sqrt(m_pi))
2360 type(namespace_t),
intent(in) :: namespace
2363 integer(int64) :: i, j, k
2364 integer(int64) :: dims(3)
2365 character(len=MAX_PATH_LEN) :: fname
2367 real(real64),
allocatable :: ff(:)
2377 call parse_variable(namespace,
'TestCSVFileName',
"", fname)
2379 message(1) =
"Attempting to probe "//trim(fname)
2380 call messages_info(1, namespace=namespace)
2382 call io_csv_get_info(fname, dims, ierr)
2384 message(1) =
"Probing successful."
2385 write(message(2),
'("found dimensions: ",3I20)') dims
2386 call messages_info(2, namespace=namespace)
2388 write(message(1),
'("Probing failed. ierr = ",I5)') ierr
2389 call messages_fatal(1, namespace=namespace)
2392 safe_allocate(ff(1:dims(1)*dims(2)*dims(3)))
2394 message(1) =
"Attempting to read "//trim(fname)
2395 call messages_info(1, namespace=namespace)
2397 call dread_csv(fname, dims(1)*dims(2)*dims(3), ff, ierr)
2399 message(1) =
"Reading successful."
2400 call messages_info(1, namespace=namespace)
2402 do k=1, min(4_int64, dims(3))
2403 do j=1, min(4_int64, dims(2))
2404 write(message(j),
'("data ",2I5, 1X, 4F8.2)') k, j, &
2405 (ff(i + dims(1)*(j-1) + dims(1)* dims(2)*(k-1)), i=1, min(4_int64, dims(1)))
2407 write(message(int(j, int32)),
'("")')
2408 call messages_info(int(j, int32), namespace=namespace)
2412 message(1) =
"Reading failed."
2413 call messages_fatal(1, namespace=namespace)
2416 safe_deallocate_a(ff)
batchified version of the BLAS axpy routine:
scale a batch by a constant or vector
There are several ways how to call batch_set_state and batch_get_state:
constant times a vector plus a vector
Copies a vector x, to a vector y.
scales a vector by a constant
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
double exp(double __x) __attribute__((__nothrow__
double sqrt(double __x) __attribute__((__nothrow__
pure logical function, public accel_is_enabled()
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
subroutine, public dbatch_ax_function_py(np, aa, psi, yy)
This routine performs a set of axpy operations adding the same function psi to all functions of a bat...
subroutine, public batch_set_zero(this, np, async)
fill all mesh functions of the batch with zero
subroutine, public zbatch_ax_function_py(np, aa, psi, yy)
This routine performs a set of axpy operations adding the same function psi to all functions of a bat...
Module implementing boundary conditions in Octopus.
Module, implementing a factory for boxes.
This module handles the calculation mode.
integer, parameter, public p_strategy_kpoints
parallelization in k-points
integer, parameter, public p_strategy_domains
parallelization in domains
type(calc_mode_par_t), public calc_mode_par
Singleton instance of parallel calculation mode.
integer, parameter, public p_strategy_states
parallelization in states
subroutine, public cgal_polyhedron_init(cgal_poly, fname, verbose)
logical function, public cgal_polyhedron_point_inside(cgal_poly, xq, yq, zq)
subroutine, public cgal_polyhedron_end(cgal_poly)
pure real(real64) function center(this)
Center of the filter interval.
This module implements a calculator for the density and defines related functions.
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public dderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public dderivatives_lapl(der, ff, op_ff, ghost_update, set_bc, factor)
apply the Laplacian to a mesh function
subroutine, public zderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public zchebyshev_filter(namespace, mesh, st, hm, degree, bounds, ik, normalize)
Chebyshev Filter.
subroutine, public dchebyshev_filter(namespace, mesh, st, hm, degree, bounds, ik, normalize)
Chebyshev Filter.
integer, parameter, public spin_polarized
subroutine, public exponential_init(te, namespace, full_batch)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_pi
some mathematical constants
complex(real64), parameter, public m_zi
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public zhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
subroutine, public dhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
type(hardware_t), public cpu_hardware
Global instance of CPU hardware specification.
integer, parameter, public sizeof_real64
Number of bytes to store a variable of type real(real64)
integer, parameter, public sizeof_complex64
Number of bytes to store a variable of type complex(real64)
The Helmholtz decomposition is intended to contain "only mathematical" functions and procedures to co...
Test suit for the Helmholtz decomposition module.
subroutine, public gaussian_test(helmholtz, sys_grid, namespace, space)
subroutine, public hertzian_dipole_test(helmholtz, sys_grid, namespace, space)
This module implements a simple hash table for non-negative integer keys and integer values.
subroutine, public iihash_end(h)
Free a hash table.
subroutine, public iihash_insert(h, key, val)
Insert a (key, val) pair into the hash table h.
integer function, public iihash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
subroutine, public iihash_init(h)
Initialize a hash table h.
subroutine, public dio_function_output(how, dir, fname, namespace, space, mesh, ff, unit, ierr, pos, atoms, grp, root)
Top-level IO routine for functions defined on the mesh.
integer(int64) function, public io_function_fill_how(where)
Use this function to quickly plot functions for debugging purposes: call dio_function_output(io_funct...
subroutine, public ion_interaction_test(space, latt, atom, natoms, pos, lsize, namespace, mc)
This modules takes care of testing some linear algebra routines.
subroutine, public test_exponential_matrix(namespace)
Unit tests for the exponential of a matrix.
This module defines functions over batches of mesh functions.
subroutine, public dmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public dmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public mesh_batch_nrm2(mesh, aa, nrm2, reduce)
Calculate the norms (norm2, not the square!) of a batch of mesh functions.
subroutine, public zmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
subroutine, public zmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public zmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public zmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public dmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public dmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
This module defines various routines, operating on mesh functions.
class(mesh_t), pointer, public mesh_aux
Globally-scoped pointer to the mesh instance.
real(real64) function, public dmf_dotp_aux(f1, f2)
dot product between two vectors (mesh functions)
subroutine, public mesh_init_mesh_aux(mesh)
Initialise a pointer to the grid/mesh, that is globally exposed, such that low level mesh operations ...
subroutine, public zmesh_interpolation_test(mesh)
subroutine, public dmesh_interpolation_test(mesh)
This module defines the meshes, which are used in Octopus.
pure subroutine, public mesh_r(mesh, ip, rr, origin, coords)
return the distance to the origin for a given grid point
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
character(len=512), private msg
subroutine, public messages_obsolete_variable(namespace, name, rep)
subroutine, public messages_new_line()
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This modules takes care of testing optimizers using standard test functions.
subroutine, public test_optimizers(namespace)
Unit tests for different optimizers.
This module implements unit tests for the mixing methods.
subroutine, public mix_tests_run()
type(mpi_grp_t), public mpi_world
subroutine, public test_mpiwrappers
This module handles the communicators for the various parallelization strategies.
subroutine, public multigrid_end(mgrid)
subroutine, public multigrid_init(mgrid, namespace, space, mesh, der, stencil, mc, nlevels)
type(namespace_t), public global_namespace
subroutine, public orbitalbasis_end(this)
subroutine, public zorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public dorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public orbitalbasis_init(this, namespace, periodic_dim)
subroutine, public dorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public zorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public orbitalset_update_phase(os, dim, kpt, kpoints, spin_polarized, vec_pot, vec_pot_var, kpt_max)
Build the phase correction to the global phase in case the orbital crosses the border of the simulato...
subroutine, public dorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public zorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public poisson_test(this, space, mesh, latt, namespace, repetitions)
This routine checks the Hartree solver selected in the input file by calculating numerically and anal...
subroutine, public preconditioner_end(this)
subroutine, public preconditioner_init(this, namespace, gr, mc, space)
subroutine, public zproject_psi_batch(mesh, bnd, pj, npj, dim, psib, ppsib)
To optimize the application of the non-local operator in parallel, the projectors are applied in step...
Implementation details for regridding.
This module implements a simple hash table for string valued keys and integer values using the C++ ST...
subroutine, public sihash_insert(h, key, val)
Insert a (key, val) pair into the hash table h.
subroutine, public sihash_init(h)
Initialize a hash table h with size entries. Since we use separate chaining, the number of entries in...
integer function, public sihash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
subroutine, public sihash_end(h)
Free a hash table.
This module is intended to contain "only mathematical" functions and procedures.
This module implements a simple hash table for string valued keys and integer values using the C++ ST...
subroutine, public sphash_init(h)
Initialize a hash table h with size entries. Since we use separate chaining, the number of entries in...
subroutine, public sphash_insert(h, key, val, clone)
Insert a (key, val) pair into the hash table h. If clone=.true., the object will be copied.
subroutine, public sphash_end(h)
Free a hash table.
class(*) function, pointer, public sphash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
pure logical function, public states_are_real(st)
subroutine, public zstates_elec_calc_orth_test(st, namespace, mesh, kpoints)
subroutine, public dstates_elec_calc_orth_test(st, namespace, mesh, kpoints)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public states_elec_deallocate_wfns(st)
Deallocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
Allocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public dsubspace_diag(this, namespace, mesh, st, hm, ik, eigenval, diff, nonortho)
Diagonalises the Hamiltonian in the subspace defined by the states.
subroutine, public zsubspace_diag(this, namespace, mesh, st, hm, ik, eigenval, diff, nonortho)
Diagonalises the Hamiltonian in the subspace defined by the states.
Integration tests for ISDF.
subroutine, public test_isdf(namespace, serial)
Set up an electron system, compute some optimal centroid positions, and use these to build a set of I...
subroutine, public test_weighted_kmeans(namespace)
Test weighted kmeans algorithm for a finite system.
This module implements a unit-test like runmode for Octopus.
subroutine set_der_aux(der)
real(real64) function psi_2s(rr, a0)
subroutine test_helmholtz_decomposition(namespace)
subroutine test_hartree(param, namespace)
subroutine test_derivatives(param, namespace)
subroutine laplacian_op(x, hx, userdata)
Computes .
subroutine test_subspace_diagonalization(param, namespace)
subroutine, public test_run(namespace)
Components and integration test runner.
subroutine test_density_calc(param, namespace)
real(real64) function psi_1s(rr, a0)
subroutine test_current_density(namespace)
Here we test the different contributions to the total electronic current density.
subroutine test_batch_set_gaussian(psib, mesh)
subroutine test_regridding(namespace)
subroutine test_sphash(namespace)
subroutine test_hamiltonian(param, namespace)
subroutine test_dense_eigensolver()
subroutine test_interpolation(param, namespace)
subroutine multigrid_test_interpolation(mgrid, space)
subroutine test_ion_interaction(namespace)
subroutine test_boundaries(param, namespace)
subroutine test_orthogonalization(param, namespace)
real(real64) function dr_psi_2s(rr, a0)
subroutine test_batch_ops(param, namespace)
complex(real64) function lc_hydrogen_state(rr, alpha, a0)
subroutine test_projector(param, namespace)
subroutine test_dft_u(param, namespace)
subroutine test_prints_info_batch(st, gr, psib, string)
subroutine test_composition_chebyshev(namespace)
Test the composition rule for Chebyshev polynomials.
real(real64) function dr_psi_1s(rr, a0)
subroutine test_linear_solver(namespace)
subroutine test_grid_interpolation()
subroutine set_hydrogen_states(psib, mesh, namespace, alpha, a0)
subroutine test_exponential(param, namespace)
subroutine test_csv_input(namespace)
subroutine test_vecpot_analytical(namespace)
Here, analytical formulation for vector potential and B field are used. Ref: Sangita Sen and Erik I....
type(type_t), public type_cmplx
logical pure function, public type_is_complex(this)
This module defines the unit system, used for input and output.
type(unit_t), public unit_one
some special units required for particular quantities
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
Class defining batches of mesh functions.
Overload default constructor.
class representing derivatives
Class describing the electron system.
Description of the grid, containing information on derivatives, stencil, and symmetries.
This class implements the iteration counter used by the multisystem algorithms. As any iteration coun...
Describes mesh distribution to nodes.
contains the information of the meshes and provides the transfer functions
The states_elec_t class contains all electronic wave functions.
batches of electronic states
subroutine write_clock(operation)
subroutine write_condition_result(condition, result)
real(real64) function values(xx)