55 use,
intrinsic :: iso_fortran_env
108 real(real64),
target :: shift_aux
109 type(preconditioner_t) :: prec_aux
119 type(namespace_t),
intent(in) :: namespace
120 type(mpi_grp_t),
intent(in) :: grp
122 type(test_parameters_t) :: param
129 call param%init_from_file(namespace)
214 call parse_variable(namespace,
'TestMode', option__testmode__hartree, test_mode)
224 select case (test_mode)
225 case (option__testmode__hartree)
227 case (option__testmode__derivatives)
229 case (option__testmode__orthogonalization)
231 case (option__testmode__interpolation)
233 case (option__testmode__ion_interaction)
235 case (option__testmode__projector)
237 case (option__testmode__dft_u)
239 case (option__testmode__hamiltonian_apply)
241 case (option__testmode__density_calc)
243 case (option__testmode__exp_apply)
245 case (option__testmode__boundaries)
247 case (option__testmode__subspace_diag)
249 case (option__testmode__batch_ops)
251 case (option__testmode__clock)
253 case (option__testmode__linear_solver)
255 case (option__testmode__cgal)
257 case (option__testmode__dense_eigensolver)
259 case (option__testmode__grid_interpolation)
261 case (option__testmode__iihash)
263 case (option__testmode__sihash)
265 case (option__testmode__sphash)
267 case (option__testmode__mpiwrappers)
269 case (option__testmode__regridding)
271 case (option__testmode__helmholtz_decomposition)
273 case (option__testmode__vecpot_analytical)
275 case (option__testmode__current_density)
277 case (option__testmode__mixing_tests)
279 case (option__testmode__optimizers)
281 case (option__testmode__weighted_kmeans)
283 case (option__testmode__csv_input)
285 case (option__testmode__composition_chebyshev)
287 case (option__testmode__lalg_adv)
289 case (option__testmode__isdf_serial)
291 case (option__testmode__isdf)
293 case (option__testmode__mesh_generation)
312 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
313 call poisson_test(sys%hm%psolver, sys%space, sys%gr, sys%ions%latt, namespace, param%repetitions)
314 safe_deallocate_p(sys)
332 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
334 call helmholtz%init(namespace, sys%gr, sys%mc, sys%space)
337 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Hertzian dipole test"
341 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Gaussian test"
343 call gaussian_test(helmholtz, sys%gr, sys%namespace, sys%space)
345 safe_deallocate_p(sys)
352 use,
intrinsic :: iso_c_binding, only: c_ptr
357 real(real64),
allocatable :: rho(:), x(:),
center(:)
358 real(real64) :: rr, alpha, beta, res
360 integer,
target :: prefactor = -1
362 real(real64),
parameter :: threshold = 1.e-7_real64
368 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
373 shift_aux = 0.25_real64
379 alpha =
m_four * sys%gr%spacing(1)
380 beta =
m_one / (alpha**sys%space%dim *
sqrt(
m_pi)**sys%space%dim)
382 safe_allocate(
center(1:sys%space%dim))
385 safe_allocate(rho(1:sys%gr%np))
389 rho(ip) = beta*
exp(-(rr/alpha)**2)
392 safe_allocate(x(1:sys%gr%np))
399 threshold, userdata=[c_loc(sys%gr%der),c_loc(shift_aux),c_loc(prefactor)])
400 write(
message(1),
'(a,i6,a)')
"Info: CG converged with ", iter,
" iterations."
401 write(
message(2),
'(a,e14.6)')
"Info: The residue is ", res
402 write(
message(3),
'(a,e14.6)')
"Info: Norm solution CG ",
dmf_nrm2(sys%gr, x)
407 safe_deallocate_a(rho)
408 safe_deallocate_p(sys)
422 complex(real64),
allocatable :: psi(:, :)
428 call messages_write(
'Info: Testing the nonlocal part of the pseudopotential with SOC')
433 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
441 call sys%st%group%psib(1, 1)%copy_to(epsib)
445 do itime = 1, param%repetitions
447 sys%hm%ep%natoms, 2, sys%st%group%psib(1, 1), epsib)
450 safe_allocate(psi(1:sys%gr%np, 1:sys%st%d%dim))
451 do itime = 1, epsib%nst
453 write(
message(1),
'(a,i1,3x, f12.6)')
"Norm state ", itime,
zmf_nrm2(sys%gr, 2, psi)
456 safe_deallocate_a(psi)
460 safe_deallocate_p(sys)
473 integer :: itime, ist
475 real(real64),
allocatable :: ddot(:,:,:), dweight(:,:)
476 complex(real64),
allocatable :: zdot(:,:,:), zweight(:,:)
477 logical :: skipSOrbitals, useAllOrbitals
490 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
494 if (sys%st%pack_states)
call sys%st%pack()
496 call sys%st%group%psib(1, 1)%copy_to(epsib2, copy_data = .
true.)
499 if (.not. sys%hm%phase%is_allocated())
then
500 call sys%st%group%psib(1, 1)%copy_to(epsib, copy_data = .
true.)
502 call sys%st%group%psib(1, 1)%copy_to(epsib)
503 call sys%hm%phase%apply_to(sys%gr, sys%gr%np, &
504 .false., epsib, src=sys%st%group%psib(1, 1))
505 epsib2%has_phase = .
true.
512 call parse_variable(namespace,
'UseAllAtomicOrbitals', .false., useallorbitals)
516 call dorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
517 skipsorbitals, useallorbitals, verbose=.false.)
518 safe_allocate(dweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
519 safe_allocate(ddot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
521 call zorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
522 skipsorbitals, useallorbitals, verbose=.false.)
524 safe_allocate(zweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
525 safe_allocate(zdot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
528 if (sys%hm%phase%is_allocated())
then
534 do itime = 1, param%repetitions
549 if (epsib%is_packed())
then
550 call epsib%do_unpack(force = .
true.)
553 do ist = 1, epsib%nst
555 write(
message(1),
'(a,i2,3x,e13.6)')
"Dotp state ", ist, ddot(1,1,ist)
557 write(
message(1),
'(a,i2,2(3x,e13.6))')
"Dotp state ", ist, zdot(1,1,ist)
565 safe_deallocate_a(dweight)
566 safe_deallocate_a(zweight)
567 safe_deallocate_a(ddot)
568 safe_deallocate_a(zdot)
574 safe_deallocate_p(sys)
587 type(
wfs_elec_t) :: hpsib, hpsib_copy, hpsib_diff
588 integer :: itime, terms
590 logical :: copy_before_apply
591 real(real64),
allocatable :: norm_hpsib(:), norm_diff(:)
592 real(real64) :: max_rel_diff
593 real(real64),
parameter :: hamiltonian_copy_rel_tol = 1.0e-12_real64
612 call parse_variable(namespace,
'TestHamiltonianApply', option__testhamiltonianapply__term_all, terms)
613 if (terms == 0) terms = huge(1)
623 call parse_variable(namespace,
'TestHamiltonianCopyBeforeApply', .false., copy_before_apply)
629 call messages_write(
'Info: Testing the application of the Hamiltonian')
634 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
640 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
643 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
645 if (copy_before_apply)
then
649 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
651 call sys%st%group%psib(1, 1)%copy_to(hpsib)
652 if (copy_before_apply)
call sys%st%group%psib(1, 1)%copy_to(hpsib_copy)
654 if (sys%hm%apply_packed())
then
655 call sys%st%group%psib(1, 1)%do_pack()
656 call hpsib%do_pack(copy = .false.)
657 if (copy_before_apply)
call hpsib_copy%do_pack(copy = .false.)
660 do itime = 1, param%repetitions
663 terms = terms, set_bc = .false.)
664 if (copy_before_apply)
then
666 terms = terms, set_bc = .false.)
670 terms = terms, set_bc = .false.)
671 if (copy_before_apply)
then
673 terms = terms, set_bc = .false.)
678 if (hpsib%is_packed())
then
679 call hpsib%do_unpack(force = .
true.)
681 if (copy_before_apply .and. hpsib_copy%is_packed())
then
682 call hpsib_copy%do_unpack(force = .
true.)
685 if (copy_before_apply)
then
686 call hpsib_copy%copy_to(hpsib_diff, copy_data = .
true.)
687 call batch_axpy(sys%gr%np, -1.0_real64, hpsib, hpsib_diff)
689 safe_allocate(norm_hpsib(1:hpsib%nst))
690 safe_allocate(norm_diff(1:hpsib_diff%nst))
694 max_rel_diff = maxval(norm_diff / max(norm_hpsib, tiny(1.0_real64)))
695 write(
message(1),
'(a,e23.16)')
'Hamiltonian copy max relative difference ', max_rel_diff
698 do ist = 1, hpsib%nst
699 if (norm_diff(ist) > hamiltonian_copy_rel_tol*max(norm_hpsib(ist), tiny(1.0_real64)))
then
700 write(
message(1),
'(a,i6)')
'Hamiltonian copy mismatch for state ', ist
705 safe_deallocate_a(norm_hpsib)
706 safe_deallocate_a(norm_diff)
707 call hpsib_diff%end(copy = .false.)
712 if (copy_before_apply)
then
714 call hpsib_copy%end(copy = .false.)
716 if (sys%hm%apply_packed())
then
717 call hpsib%do_pack(copy = .false.)
721 terms = terms, set_bc = .false.)
724 terms = terms, set_bc = .false.)
727 call hpsib%end(copy = .false.)
729 safe_deallocate_p(sys)
753 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
757 if (sys%st%pack_states)
call sys%st%pack()
759 do itime = 1, param%repetitions
763 write(
message(1),
'(a,3x, f12.6)')
"Norm density ",
dmf_nrm2(sys%gr, sys%st%rho(:,1))
767 safe_deallocate_p(sys)
791 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
795 if (sys%st%pack_states)
call sys%st%pack()
797 do itime = 1, param%repetitions
798 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
804 safe_deallocate_p(sys)
819 integer,
allocatable :: degree(:)
827 call messages_write(
'Info: Testing Chebyshev filtering and its composition rule')
832 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
836 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
839 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
842 safe_allocate(degree(1:sys%st%group%nblocks))
852 call parse_variable(namespace,
'TestCompositionOrder', 2, degree_n)
864 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
866 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
870 call messages_write(
'Info: Result after calling 2n-th order filtering')
876 call sys%st%group%psib(1, 1)%copy_to(psib, copy_data=.
true.)
879 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
880 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
882 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
883 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
894 safe_deallocate_a(degree)
895 safe_deallocate_p(bounds)
899 safe_deallocate_p(sys)
925 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
931 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
934 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
938 if (sys%hm%apply_packed())
then
939 call sys%st%group%psib(1, 1)%do_pack()
942 do itime = 1, param%repetitions
943 call te%apply_batch(sys%namespace, sys%gr, sys%hm, sys%st%group%psib(1, 1), 1e-3_real64)
949 safe_deallocate_p(sys)
964 real(real64),
allocatable :: diff(:)
975 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
980 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
983 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
985 call sdiag%init(sys%namespace, sys%st)
987 safe_allocate(diff(1:sys%st%nst))
989 do itime = 1, param%repetitions
991 call dsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
993 call zsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
997 safe_deallocate_a(diff)
1002 safe_deallocate_p(sys)
1015 integer :: itime, ops, ops_default, ist, jst, nst, ip
1017 real(real64),
allocatable :: tmp(:)
1018 real(real64),
allocatable :: ddotv(:)
1019 complex(real64),
allocatable :: zdotv(:)
1020 real(real64),
allocatable :: ddot(:,:), df(:,:), dweight(:), dpoints(:,:,:)
1021 complex(real64),
allocatable :: zdot(:,:), zf(:,:), zweight(:), zpoints(:,:,:)
1022 real(real64),
allocatable :: dff_mf(:)
1023 complex(real64),
allocatable :: zff_mf(:)
1024 integer :: sp, block_size, size
1053 option__testbatchops__ops_axpy + &
1054 option__testbatchops__ops_scal + &
1055 option__testbatchops__ops_nrm2 + &
1056 option__testbatchops__ops_dotp_matrix + &
1057 option__testbatchops__ops_dotp_self + &
1058 option__testbatchops__ops_dotp_vector + &
1059 option__testbatchops__ops_ax_function_py + &
1060 option__testbatchops__ops_get_points
1071 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
1075 if (sys%st%pack_states)
call sys%st%pack()
1077 if (
bitand(ops, option__testbatchops__ops_axpy) /= 0)
then
1078 message(1) =
'Info: Testing axpy'
1081 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1082 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1084 do itime = 1, param%repetitions
1085 call batch_axpy(sys%gr%np, 0.1_real64, xx, yy)
1092 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1093 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1094 do itime = 1, param%repetitions
1095 call batch_axpby(sys%gr%np, 0.1_real64, xx, 0.2_real64, yy)
1103 if (
bitand(ops, option__testbatchops__ops_scal) /= 0)
then
1107 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1109 do itime = 1, param%repetitions
1115 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1116 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .false.)
1117 do itime = 1, param%repetitions
1124 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1125 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1126 call sys%st%group%psib(1, 1)%copy_to(zz, copy_data = .false.)
1128 do itime = 1, param%repetitions
1136 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1137 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .false.)
1139 safe_allocate(dff_mf(1:sys%gr%np))
1140 do ip = 1, sys%gr%np
1141 dff_mf(ip) = 0.01_real64 + 0.001_real64*real(sys%gr%x(1, ip), real64)
1144 do itime = 1, param%repetitions
1148 safe_allocate(zff_mf(1:sys%gr%np))
1149 do ip = 1, sys%gr%np
1150 zff_mf(ip) = cmplx(0.01_real64 + 0.001_real64*real(sys%gr%x(1, ip), real64), 0.02_real64, real64)
1153 do itime = 1, param%repetitions
1161 safe_deallocate_a(dff_mf)
1162 safe_deallocate_a(zff_mf)
1168 if (
bitand(ops, option__testbatchops__ops_nrm2) /= 0)
then
1169 message(1) =
'Info: Testing nrm2'
1172 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1173 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1175 safe_allocate(tmp(1:xx%nst))
1177 do itime = 1, param%repetitions
1180 do itime = 1, xx%nst
1181 write(
message(1),
'(a,i1,3x,e23.16)')
"Nrm2 norm state ", itime, tmp(itime)
1185 safe_deallocate_a(tmp)
1191 if (
bitand(ops, option__testbatchops__ops_dotp_matrix) /= 0)
then
1193 message(1) =
'Info: Testing dotp_matrix'
1196 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1197 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1199 nst = sys%st%group%psib(1, 1)%nst
1202 safe_allocate(ddot(1:nst, 1:nst))
1203 do itime = 1, param%repetitions
1209 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_matrix states', ist, jst, ddot(ist,jst)
1213 safe_deallocate_a(ddot)
1215 safe_allocate(zdot(1:nst, 1:nst))
1216 do itime = 1, param%repetitions
1222 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_matrix states', ist, jst, zdot(ist,jst)
1226 safe_deallocate_a(zdot)
1232 message(1) =
'Info: Testing dotp_matrix with distinct batches'
1235 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1236 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .false.)
1238 nst = sys%st%group%psib(1, 1)%nst
1241 safe_allocate(dff_mf(1:sys%gr%np))
1242 do ip = 1, sys%gr%np
1243 dff_mf(ip) = 0.5_real64 + 0.1_real64*real(sys%gr%x(1, ip), real64)
1246 safe_deallocate_a(dff_mf)
1248 safe_allocate(ddot(1:nst, 1:nst))
1252 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_matrix_ab states', ist, jst, ddot(ist,jst)
1256 safe_deallocate_a(ddot)
1258 safe_allocate(zff_mf(1:sys%gr%np))
1259 do ip = 1, sys%gr%np
1260 zff_mf(ip) = cmplx(0.5_real64 + 0.1_real64*real(sys%gr%x(1, ip), real64), &
1261 0.3_real64*real(sys%gr%x(1, ip), real64), real64)
1264 safe_deallocate_a(zff_mf)
1266 safe_allocate(zdot(1:nst, 1:nst))
1270 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_matrix_ab states', ist, jst, zdot(ist,jst)
1274 safe_deallocate_a(zdot)
1281 if (
bitand(ops, option__testbatchops__ops_dotp_vector) /= 0)
then
1283 message(1) =
'Info: Testing dotp_vector'
1286 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1287 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1289 nst = sys%st%group%psib(1, 1)%nst
1292 safe_allocate(ddotv(1:nst))
1293 do itime = 1, param%repetitions
1298 write(
message(ist),
'(a,i3,3x,e23.16)')
'Dotp_vector state', ist, ddotv(ist)
1301 safe_deallocate_a(ddotv)
1303 safe_allocate(zdotv(1:nst))
1304 do itime = 1, param%repetitions
1309 write(
message(ist),
'(a,i3,3x,2(e23.16,1x))')
'Dotp_vector state', ist, zdotv(ist)
1312 safe_deallocate_a(zdotv)
1319 if (
bitand(ops, option__testbatchops__ops_dotp_self) /= 0)
then
1321 message(1) =
'Info: Testing dotp_self'
1324 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1326 nst = sys%st%group%psib(1, 1)%nst
1329 safe_allocate(ddot(1:nst, 1:nst))
1330 do itime = 1, param%repetitions
1336 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_self states', ist, jst, ddot(ist,jst)
1340 safe_deallocate_a(ddot)
1342 safe_allocate(zdot(1:nst, 1:nst))
1343 do itime = 1, param%repetitions
1349 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_self states', ist, jst, zdot(ist,jst)
1353 safe_deallocate_a(zdot)
1359 if (
bitand(ops, option__testbatchops__ops_ax_function_py) /= 0)
then
1360 message(1) =
'Info: Testing ax_function_py'
1363 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1366 safe_allocate(df(sys%gr%np, sys%st%d%dim))
1367 safe_allocate(dweight(1:sys%st%group%psib(1, 1)%nst_linear))
1368 dweight = 0.1_real64
1371 do itime = 1, param%repetitions
1374 safe_deallocate_a(df)
1375 safe_deallocate_a(dweight)
1377 safe_allocate(zf(sys%gr%np, sys%st%d%dim))
1378 safe_allocate(zweight(1:sys%st%group%psib(1, 1)%nst_linear))
1379 zweight = cmplx(0.1_real64,
m_zero, real64)
1382 do itime = 1, param%repetitions
1385 safe_deallocate_a(zf)
1386 safe_deallocate_a(zweight)
1393 if (
bitand(ops, option__testbatchops__ops_get_points) /= 0)
then
1398 call sys%st%group%psib(1, 1)%copy_to(yy)
1404 safe_allocate(dpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1406 do itime = 1, param%repetitions
1407 do sp = 1, sys%gr%np, block_size
1408 size = min(block_size, sys%gr%np - sp + 1)
1413 safe_deallocate_a(dpoints)
1419 safe_allocate(zpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1421 do itime = 1, param%repetitions
1422 do sp = 1, sys%gr%np, block_size
1423 size = min(block_size, sys%gr%np - sp + 1)
1428 safe_deallocate_a(zpoints)
1439 safe_deallocate_p(sys)
1454 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
1456 message(1) =
'Info: Testing the finite-differences derivatives.'
1460 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1461 call dderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1464 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1465 call zderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1468 if (sys%space%dim > 1)
then
1472 safe_deallocate_p(sys)
1492 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
1494 message(1) =
'Info: Testing orthogonalization.'
1498 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1499 message(1) =
'Info: Real wave-functions.'
1501 do itime = 1, param%repetitions
1506 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1507 message(1) =
'Info: Complex wave-functions.'
1509 do itime = 1, param%repetitions
1514 safe_deallocate_p(sys)
1530 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
1532 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1541 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1543 call messages_write(
'Info: Testing complex interpolation routines')
1551 safe_deallocate_p(sys)
1567 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
1569 call ion_interaction_test(sys%space, sys%ions%latt, sys%ions%atom, sys%ions%natoms, sys%ions%pos, &
1570 sys%gr%box%bounding_box_l, namespace, sys%mc)
1572 safe_deallocate_p(sys)
1581 type(
grid_t),
intent(in) :: gr
1582 class(
batch_t),
intent(inout) :: psib
1583 character(*),
optional,
intent(in) :: string
1586 complex(real64),
allocatable :: zpsi(:, :)
1587 real(real64),
allocatable :: dpsi(:, :)
1589 character(80) :: string_
1596 safe_allocate(dpsi(1:gr%np, 1:st%d%dim))
1598 safe_allocate(zpsi(1:gr%np, 1:st%d%dim))
1601 do itime = 1, psib%nst
1604 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
dmf_nrm2(gr, st%d%dim, dpsi)
1607 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
zmf_nrm2(gr, st%d%dim, zpsi)
1613 safe_deallocate_a(dpsi)
1615 safe_deallocate_a(zpsi)
1631 write(
message(1),
'(a)')
" Operation Counter Time Global step"
1646 call clock%set(
clock_t(time_step=
m_four, initial_iteration=1))
1650 write(
message(1),
'(a)')
" Clock comparisons:"
1653 other_clock =
clock_t(time_step=
m_one, initial_iteration=5)
1665 character(len=*),
intent(in) :: operation
1667 write(
message(1),
'(a17,1x,i6,1x,f10.1,1x,i16)') operation, clock%counter(), clock%value(), clock%global_step()
1672 character(len=*),
intent(in) :: condition
1673 logical,
intent(in) :: result
1675 write(
message(1),
'(a10," = ",i1," (",l1,")")') condition, abs(transfer(result, 0)), result
1692 message(1) =
"cgal_polyhedron_point_inside"
1704 integer :: N, ii, jj, N_list(4), i_N
1705 real(real64),
allocatable :: matrix(:, :), eigenvectors(:, :), eigenvalues(:), test(:)
1706 real(real64),
allocatable :: differences(:)
1710 n_list = [15, 32, 100, 500]
1714 safe_allocate(matrix(1:n, 1:n))
1715 safe_allocate(eigenvectors(1:n, 1:n))
1716 safe_allocate(eigenvalues(1:n))
1717 safe_allocate(test(1:n))
1718 safe_allocate(differences(1:n))
1724 matrix(ii, jj) = ii * jj
1729 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1733 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1734 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1736 write(
message(1),
"(A, I3, A, E13.6)")
"Parallel solver - N: ", n, &
1737 ", average difference: ", sum(differences)/n
1741 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1745 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1746 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1748 write(
message(1),
"(A, I3, A, E13.6)")
"Serial solver - N: ", n, &
1749 ", average difference: ", sum(differences)/n
1752 safe_deallocate_a(matrix)
1753 safe_deallocate_a(eigenvectors)
1754 safe_deallocate_a(eigenvalues)
1755 safe_deallocate_a(test)
1756 safe_deallocate_a(differences)
1763 class(
batch_t),
intent(inout) :: psib
1764 class(
mesh_t),
intent(in) :: mesh
1766 real(real64),
allocatable :: dff(:)
1767 complex(real64),
allocatable :: zff(:)
1769 real(real64) :: da, db, dc
1770 complex(real64) :: za, zb, zc
1775 da =
m_one/mesh%box%bounding_box_l(1)
1781 za = da +
m_zi*0.01_real64
1782 zb = db*
exp(
m_zi*0.345_real64)
1783 zc = dc -
m_zi*50.0_real64
1785 safe_allocate(zff(1:mesh%np))
1786 do ist = 1, psib%nst_linear
1790 zff(ip) = zb*
exp(-za*sum(mesh%x(:, ip)**2)) + zc
1795 safe_deallocate_a(zff)
1797 safe_allocate(dff(1:mesh%np))
1798 do ist = 1, psib%nst_linear
1802 dff(ip) = db*
exp(-da*sum(mesh%x(:, ip)**2)) + dc
1807 safe_deallocate_a(dff)
1824 sys%gr%stencil, sys%mc, nlevels=3)
1830 safe_deallocate_p(sys)
1846 write(
message(1),*)
'hash[1] :', found,
value
1850 write(
message(1),*)
'hash[2] :', found,
value
1854 write(
message(1),*)
'hash[3] :', found,
value
1866 integer ::
value, sum
1875 write(
message(1),*)
'hash["one"]: ', found,
value
1879 write(
message(1),*)
'hash["two"]: ', found,
value
1883 write(
message(1),*)
'hash["three"]: ', found,
value
1890 do while (it%has_next())
1891 value = it%get_next()
1893 write(
message(1),
'(I3,A,I5)') counter,
': hash[...] = ',
value
1895 counter = counter + 1
1897 write(
message(1),*)
'counter = ', counter
1898 write(
message(2),*)
'sum = ', sum
1920 class(*),
pointer :: value
1922 integer :: count_clock, count_space
1924 safe_allocate(clock_2)
1938 write(
message(1),*)
'hash["one"]: ', found,
value%counter()
1941 write(
message(1),*)
'hash["one"]: ', found,
value%short_info()
1944 write(
message(1),*)
'wrong type. found = ', found
1951 write(
message(1),*)
'hash["two"]: ', found,
value%counter()
1954 write(
message(1),*)
'hash["two"]: ', found,
value%short_info()
1957 write(
message(1),*)
'wrong type. found = ',found
1961 safe_deallocate_a(clock_2)
1966 write(
message(1),*)
'hash["three"]: ', found,
value%counter()
1969 write(
message(1),*)
'hash["three"]: ', found,
value%short_info()
1972 write(
message(1),*)
'wrong type. found = ',found
1981 do while (it%has_next())
1982 value => it%get_next()
1985 count_clock = count_clock + 1
1987 count_space = count_space + 1
1991 write(
message(1), *)
'Count_clock = ', count_clock
1992 write(
message(2), *)
'Count_space = ', count_space
2006 real(real64),
allocatable :: ff_A(:), ff_A_reference(:), ff_B(:), ff_B_reference(:), diff_A(:), diff_B(:)
2007 real(real64) :: norm_ff, norm_diff
2017 safe_allocate(ff_a(1:sysa%gr%np))
2018 safe_allocate(ff_a_reference(1:sysa%gr%np))
2019 safe_allocate(diff_a(1:sysa%gr%np))
2020 safe_allocate(ff_b(1:sysb%gr%np))
2021 safe_allocate(ff_b_reference(1:sysb%gr%np))
2022 safe_allocate(diff_b(1:sysb%gr%np))
2024 do ip = 1, sysa%gr%np
2025 ff_a_reference(ip) =
values(sysa%gr%x(:, ip))
2027 do ip = 1, sysb%gr%np
2028 ff_b_reference(ip) =
values(sysb%gr%x(:, ip))
2032 regridding =>
regridding_t(sysb%gr, sysa%gr, sysa%space, sysa%namespace)
2033 call regridding%do_transfer(ff_b, ff_a_reference)
2034 safe_deallocate_p(regridding)
2037 do ip = 1, sysb%gr%np
2039 ff_b_reference(ip) =
m_zero
2042 diff_b(ip) = abs(ff_b_reference(ip) - ff_b(ip))
2045 norm_ff =
dmf_nrm2(sysb%gr, ff_b_reference)
2046 norm_diff =
dmf_nrm2(sysb%gr, diff_b)
2048 write(
message(1),
'(a, E14.6)')
"Forward: difference of reference to mapped function (rel.): ", &
2053 sysb%gr, ff_b_reference,
unit_one, ierr)
2057 sysa%gr, ff_a_reference,
unit_one, ierr)
2060 regridding =>
regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
2061 call regridding%do_transfer(ff_a, ff_b_reference)
2062 safe_deallocate_p(regridding)
2064 do ip = 1, sysa%gr%np
2066 ff_a_reference(ip) =
m_zero
2069 diff_a(ip) = abs(ff_a_reference(ip) - ff_a(ip))
2072 norm_ff =
dmf_nrm2(sysa%gr, ff_a_reference)
2073 norm_diff =
dmf_nrm2(sysa%gr, diff_a)
2075 write(
message(1),
'(a, E14.6)')
"Backward: difference of reference to mapped function (rel.): ", &
2080 sysa%gr, ff_a_reference,
unit_one, ierr)
2084 sysb%gr, ff_b_reference,
unit_one, ierr)
2086 safe_deallocate_a(ff_a)
2087 safe_deallocate_a(ff_a_reference)
2088 safe_deallocate_a(ff_b)
2089 safe_deallocate_a(ff_b_reference)
2090 safe_deallocate_a(diff_a)
2091 safe_deallocate_a(diff_b)
2092 safe_deallocate_p(sysa)
2093 safe_deallocate_p(sysb)
2099 real(real64) function values(xx)
2100 real(real64),
intent(in) :: xx(:)
2101 real(real64) :: xx0(1:size(xx, dim=1))
2102 real(real64),
parameter :: aa =
m_half
2103 real(real64),
parameter :: bb =
m_four
2107 values = bb *
exp(-aa*sum((xx-xx0)**2))
2113 type(namespace_t),
intent(in) :: namespace
2114 type(mpi_grp_t),
intent(in) :: grp
2116 type(namespace_t) :: namespace_a, namespace_b
2117 type(electrons_t),
pointer :: sysA, sysB
2118 type(regridding_t),
pointer :: regridding
2119 real(real64),
allocatable :: ff_a(:), ff_b(:), lapl_a(:), lapl_b(:), lapl_b_on_a(:), diff_lapl(:)
2120 real(real64) :: abs_diff, rel_diff, norm_lapl
2122 real(real64),
parameter :: alpha = 0.5_real64
2126 call calc_mode_par%set_parallelization(p_strategy_states, default=.false.)
2128 namespace_a = namespace_t(
"A", namespace)
2129 namespace_b = namespace_t(
"B", namespace)
2131 sysa => electrons_t(namespace_a, grp, int(option__calculationmode__dummy, int32))
2132 sysb => electrons_t(namespace_b, grp, int(option__calculationmode__dummy, int32))
2134 assert(sysa%gr%np_global == sysb%gr%np_global)
2135 assert(sysa%st%nst == sysb%st%nst)
2136 assert(sysa%ions%natoms == sysb%ions%natoms)
2138 dim = sysa%gr%box%dim
2139 safe_allocate(ff_a(1:sysa%gr%np_part))
2140 safe_allocate(ff_b(1:sysb%gr%np_part))
2141 safe_allocate(lapl_a(1:sysa%gr%np))
2142 safe_allocate(lapl_b(1:sysb%gr%np))
2143 safe_allocate(lapl_b_on_a(1:sysa%gr%np))
2144 safe_allocate(diff_lapl(1:sysa%gr%np))
2146 do ip = 1, sysa%gr%np_part
2147 ff_a(ip) =
gaussian(sysa%gr%x(1:dim, ip), alpha)
2149 do ip = 1, sysb%gr%np_part
2150 ff_b(ip) =
gaussian(sysb%gr%x(1:dim, ip), alpha)
2153 call dderivatives_lapl(sysa%gr%der, ff_a, lapl_a, set_bc=.false.)
2154 call dderivatives_lapl(sysb%gr%der, ff_b, lapl_b, set_bc=.false.)
2156 regridding => regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
2157 call regridding%do_transfer(lapl_b_on_a, lapl_b)
2158 safe_deallocate_p(regridding)
2160 diff_lapl = lapl_a - lapl_b_on_a
2161 abs_diff = dmf_nrm2(sysa%gr, diff_lapl)
2162 norm_lapl = dmf_nrm2(sysa%gr, lapl_a)
2163 rel_diff = abs_diff/max(norm_lapl, m_epsilon)
2165 assert(rel_diff <= 1.0e-12_real64)
2167 write(message(1),
'(a)')
"System A initialized"
2168 call messages_info(1, namespace=namespace_a)
2169 write(message(1),
'(a)')
"System B initialized"
2170 call messages_info(1, namespace=namespace_b)
2171 write(message(1),
'(a,es17.10)')
"Gaussian Laplacian absolute difference = ", abs_diff
2172 write(message(2),
'(a,es17.10)')
"Gaussian Laplacian relative difference = ", rel_diff
2173 write(message(3),
'(a,es17.10)')
"Gaussian Laplacian reference norm = ", norm_lapl
2174 call messages_info(3, namespace=namespace)
2176 safe_deallocate_a(ff_a)
2177 safe_deallocate_a(ff_b)
2178 safe_deallocate_a(lapl_a)
2179 safe_deallocate_a(lapl_b)
2180 safe_deallocate_a(lapl_b_on_a)
2181 safe_deallocate_a(diff_lapl)
2182 safe_deallocate_p(sysa)
2183 safe_deallocate_p(sysb)
2187 real(real64) function gaussian(x, a) result(val)
2188 real(real64),
intent(in) :: x(:)
2189 real(real64),
intent(in) :: a
2191 val =
exp(-a*sum(x**2))
2202 type(namespace_t),
intent(in) :: namespace
2203 type(mpi_grp_t),
intent(in) :: grp
2205 class(maxwell_t),
pointer :: maxwell_system
2207 real(real64),
allocatable :: magnetic_field(:,:)
2208 real(real64),
allocatable :: vector_potential_mag(:,:)
2209 real(real64),
allocatable :: vector_potential_analytical(:,:)
2210 real(real64),
allocatable :: delta(:,:)
2211 real(real64) :: exp_factor
2215 real(real64) :: sigma
2216 integer :: ip, j, ierr, nn
2217 integer(int64) :: out_how
2218 character(len=MAX_PATH_LEN) :: fname, fname2, fname3
2221 maxwell_system => maxwell_t(namespace, grp)
2222 sigma = maxwell_system%gr%box%bounding_box_l(1)/10_real64
2224 safe_allocate(magnetic_field(1:maxwell_system%gr%np_part, 1:3))
2225 safe_allocate(vector_potential_mag(1:maxwell_system%gr%np_part, 1:3))
2226 safe_allocate(vector_potential_analytical(1:maxwell_system%gr%np_part, 1:3))
2227 safe_allocate(delta(1:maxwell_system%gr%np, 1:3))
2240 call parse_variable(namespace,
'TestVectorPotentialType', option__testvectorpotentialtype__bounded, nn)
2243 case (option__testvectorpotentialtype__bounded)
2244 do ip = 1, maxwell_system%gr%np_part
2245 xx = maxwell_system%gr%x(1, ip)
2246 yy = maxwell_system%gr%x(2, ip)
2247 zz = maxwell_system%gr%x(3, ip)
2248 exp_factor =
exp((-xx**2 - yy**2 - zz**2)*1/(2*sigma**2))
2249 magnetic_field(ip, 1) = exp_factor*yy*(1 - (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
2250 magnetic_field(ip, 2) = exp_factor * xx * (1 + (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
2251 magnetic_field(ip, 3) = exp_factor * 2 * xx * yy * zz * 1/(3*sigma**2)
2253 vector_potential_analytical(ip, 1) = m_third * xx * zz * exp_factor
2254 vector_potential_analytical(ip, 2) = - m_third * yy * zz * exp_factor
2255 vector_potential_analytical(ip, 3) = m_third * (-xx**2 + yy**2) * exp_factor
2257 case (option__testvectorpotentialtype__unbounded)
2259 do ip = 1, maxwell_system%gr%np_part
2260 magnetic_field(ip, 1) = maxwell_system%gr%x(2, ip)
2261 magnetic_field(ip, 2) = maxwell_system%gr%x(1, ip)
2262 magnetic_field(ip, 3) = m_zero
2264 vector_potential_analytical(ip, 1) = m_third * maxwell_system%gr%x(1, ip) * maxwell_system%gr%x(3, ip)
2265 vector_potential_analytical(ip, 2) = - m_third * maxwell_system%gr%x(2, ip) * maxwell_system%gr%x(3, ip)
2266 vector_potential_analytical(ip, 3) = - m_third * (maxwell_system%gr%x(1, ip)**2 - maxwell_system%gr%x(2, ip)**2)
2269 call maxwell_system%helmholtz%get_vector_potential(namespace, vector_potential_mag, magnetic_field)
2273 do ip = 1, maxwell_system%gr%np
2274 delta(ip,j) = vector_potential_analytical(ip, j) - vector_potential_mag(ip, j)
2279 write(message(j),*)
'j, norm2(delta)', j, norm2(delta(:,j))
2281 call messages_info(3)
2283 write(fname,
'(a)')
'deviation_from_analytical_formulation'
2284 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, maxwell_system%space, maxwell_system%gr, &
2285 delta, unit_one, ierr)
2286 write(fname2,
'(a)')
'vector_potential_analytical'
2287 call io_function_output_vector(out_how ,
'./' , trim(fname2), namespace, maxwell_system%space, maxwell_system%gr, &
2288 vector_potential_analytical, unit_one, ierr)
2289 write(fname3,
'(a)')
'vector_potential_mag'
2290 call io_function_output_vector(out_how ,
'./' , trim(fname3), namespace, maxwell_system%space, maxwell_system%gr, &
2291 vector_potential_mag, unit_one, ierr)
2293 safe_deallocate_a(magnetic_field)
2294 safe_deallocate_a(vector_potential_mag)
2295 safe_deallocate_a(vector_potential_analytical)
2296 safe_deallocate_a(delta)
2297 safe_deallocate_p(maxwell_system)
2303 type(multigrid_t),
intent(in) :: mgrid
2304 class(space_t),
intent(in) :: space
2306 real(real64),
allocatable :: guess0(:), res0(:), guess1(:)
2307 type(mesh_t),
pointer :: mesh0, mesh1
2308 real(real64) :: delta, xx(3,2), alpha, beta, rr
2309 integer :: nn, ip, ierr
2313 message(1) =
'Info: Testing the grid interpolation.'
2315 call messages_info(2)
2317 mesh0 => mgrid%level(0)%mesh
2318 mesh1 => mgrid%level(1)%mesh
2320 safe_allocate(guess0(1:mesh0%np_part))
2321 safe_allocate(res0(1:mesh0%np_part))
2322 safe_allocate(guess1(1:mesh1%np_part))
2324 alpha = m_four*mesh0%spacing(1)
2325 beta = m_one / (alpha**space%dim *
sqrt(m_pi)**space%dim)
2340 call mesh_r(mesh0, ip, rr, origin = xx(:, nn))
2341 guess0(ip) = guess0(ip) + (-1)**nn * beta*
exp(-(rr/alpha)**2)
2345 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_target", global_namespace, &
2346 space, mesh0, guess0, unit_one, ierr)
2347 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_target", global_namespace, &
2348 space, mesh0, guess0, unit_one, ierr)
2349 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_target", global_namespace, &
2350 space, mesh0, guess0, unit_one, ierr)
2357 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, injection)
2359 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2361 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_result", global_namespace, &
2362 space, mesh0, res0, unit_one, ierr)
2363 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_result", global_namespace, &
2364 space, mesh0, res0, unit_one, ierr)
2365 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_result", global_namespace, &
2366 space, mesh0, res0, unit_one, ierr)
2368 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2369 write(message(1),
'(a,e13.6)')
'Interpolation test (abs.) = ', delta
2375 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, fullweight)
2377 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2379 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"restriction_result", global_namespace, &
2380 space, mesh0, res0, unit_one, ierr)
2381 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"restriction_result", global_namespace, &
2382 space, mesh0, res0, unit_one, ierr)
2383 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"restriction_result", global_namespace, &
2384 space, mesh0, res0, unit_one, ierr)
2386 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2387 write(message(2),
'(a,e13.6)')
'Restriction test (abs.) = ', delta
2388 call messages_info(2)
2390 safe_deallocate_a(guess0)
2391 safe_deallocate_a(res0)
2392 safe_deallocate_a(guess1)
2400 type(namespace_t),
intent(in) :: namespace
2401 type(mpi_grp_t),
intent(in) :: grp
2402 type(electrons_t),
pointer :: sys
2404 type(current_t) :: current
2405 character(len=MAX_PATH_LEN) :: fname
2406 integer :: ierr, ip, idir
2407 integer(int64) :: out_how
2408 real(real64),
allocatable :: current_para_ref(:,:), current_dia_ref(:,:), current_mag_ref(:,:), delta(:)
2409 real(real64) :: xx(3), rr, a0, mag_curr, sin_thet, sin_phi, cos_phi, vec_pot_slope
2410 complex(real64) :: alpha
2412 sys => electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
2414 alpha = (0.0_real64, 0.5_real64)
2416 vec_pot_slope = 0.4_real64
2418 call states_elec_allocate_wfns(sys%st, sys%gr, wfs_type = type_cmplx)
2421 call current_init(current, namespace)
2423 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st)
2425 safe_allocate(sys%hm%hm_base%vector_potential(1:3, 1:sys%gr%np))
2427 sys%hm%hm_base%vector_potential = m_zero
2428 do ip = 1, sys%gr%np
2429 xx = sys%gr%x(1:3, ip)
2430 sys%hm%hm_base%vector_potential(2, ip) = vec_pot_slope * xx(1) / p_c
2433 call states_elec_allocate_current(sys%st, sys%space, sys%gr)
2434 call density_calc(sys%st, sys%gr, sys%st%rho)
2436 call current_calculate(current, namespace, sys%gr, sys%hm, sys%space, sys%st)
2438 safe_allocate(current_para_ref(1:sys%gr%np,1:3))
2439 safe_allocate(current_dia_ref(1:sys%gr%np,1:3))
2440 safe_allocate(current_mag_ref(1:sys%gr%np,1:3))
2441 safe_allocate(delta(1:sys%gr%np))
2444 current_para_ref(:,:) = m_zero
2445 do ip = 1, sys%gr%np
2446 call mesh_r(sys%gr, ip, rr)
2447 xx = sys%gr%x(1:3, ip)
2448 if (rr > r_small)
then
2450 psi_1s(rr, a0) *
dr_psi_2s(rr, a0) ) * aimag(alpha) / (1 + abs(alpha)**2) * xx(1:3) / rr
2454 write(fname,
'(a)')
'current_para'
2455 out_how = io_function_fill_how(
"PlaneZ")
2456 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2457 sys%st%current_para(:,:,1), unit_one, ierr)
2459 write(fname,
'(a)')
'current_para-ref'
2460 out_how = io_function_fill_how(
"PlaneZ")
2461 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2462 current_para_ref(:,:), unit_one, ierr)
2466 delta(:) = current_para_ref(1:sys%gr%np, idir) - sys%st%current_para(1:sys%gr%np, idir, 1)
2467 write(message(idir),*)
'idir =',idir,
', norm2(delta paramagnetic)',norm2(delta)
2469 call messages_info(3)
2472 current_dia_ref(:,:) = m_zero
2473 do ip = 1, sys%gr%np
2474 call mesh_r(sys%gr, ip, rr)
2475 current_dia_ref(ip,1:3) = - sys%hm%hm_base%vector_potential(1:3,ip) *&
2479 write(fname,
'(a)')
'current_dia'
2480 out_how = io_function_fill_how(
"PlaneZ")
2481 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2482 sys%st%current_dia(:,:,1), unit_one, ierr)
2484 write(fname,
'(a)')
'current_dia-ref'
2485 out_how = io_function_fill_how(
"PlaneZ")
2486 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2487 current_dia_ref(:,:), unit_one, ierr)
2491 delta(:) = current_dia_ref(1:sys%gr%np, idir) - sys%st%current_dia(1:sys%gr%np, idir, 1)
2492 write(message(idir),*)
'idir =',idir,
', norm2(delta diamagnetic)',norm2(delta)
2494 call messages_info(3)
2497 call current_calculate_mag(sys%gr%der, sys%st)
2500 current_mag_ref(:,:) = m_zero
2501 do ip = 1, sys%gr%np
2502 call mesh_r(sys%gr, ip, rr)
2503 xx = sys%gr%x(1:3, ip)
2504 if (norm2(xx(1:2)) > r_small .and. rr > r_small)
then
2505 sin_thet = norm2(xx(1:2)) / rr
2506 sin_phi = xx(2) / norm2(xx(1:2))
2507 cos_phi = xx(1) / norm2(xx(1:2))
2511 current_mag_ref(ip,1) = m_half * mag_curr * sin_thet * sin_phi / (1+abs(alpha)**2)
2512 current_mag_ref(ip,2) = -m_half * mag_curr * sin_thet * cos_phi / (1+abs(alpha)**2)
2516 write(fname,
'(a)')
'current_mag'
2517 out_how = io_function_fill_how(
"PlaneZ")
2518 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2519 sys%st%current_mag(:,:,1), unit_one, ierr)
2521 write(fname,
'(a)')
'current_mag-ref'
2522 out_how = io_function_fill_how(
"PlaneZ")
2523 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2524 current_mag_ref(:,:), unit_one, ierr)
2528 delta(:) = current_mag_ref(1:sys%gr%np, idir) - sys%st%current_mag(1:sys%gr%np, idir, 1)
2529 write(message(idir),*)
'idir =',idir,
', norm2(delta magnetization)',norm2(delta)
2531 call messages_info(3)
2533 safe_deallocate_a(current_para_ref)
2534 safe_deallocate_a(current_dia_ref)
2535 safe_deallocate_a(current_mag_ref)
2536 safe_deallocate_a(delta)
2537 safe_deallocate_p(sys)
2543 class(batch_t),
intent(inout) :: psib
2544 class(mesh_t),
intent(in) :: mesh
2545 type(namespace_t),
intent(in) :: namespace
2546 complex(real64),
intent(in) :: alpha
2547 real(real64),
intent(in) :: a0
2549 complex(real64),
allocatable :: zff(:)
2556 safe_allocate(zff(1:mesh%np))
2557 if (type_is_complex(psib%type()))
then
2559 call mesh_r(mesh, ip, rr)
2562 call batch_set_state(psib, 1, mesh%np, zff)
2564 write(message(1),*)
"States should be complex for the linear combination of hydrogenic states to work"
2565 call messages_info(1, namespace=namespace)
2567 safe_deallocate_a(zff)
2573 real(real64),
intent(in) :: a0, rr
2574 complex(real64),
intent(in) :: alpha
2580 real(real64) function psi_1s(rr, a0)
2581 real(real64),
intent(in) :: a0, rr
2587 real(real64) function psi_2s(rr, a0)
2588 real(real64),
intent(in) :: a0, rr
2590 psi_2s =
sqrt(m_two) * a0**(-m_three/m_two) * (m_one - rr/(m_two * a0)) *
exp(-rr/(m_two * a0)) &
2591 / (m_two *
sqrt(m_pi))
2594 real(real64) function dr_psi_1s(rr, a0)
2595 real(real64),
intent(in) :: a0, rr
2600 real(real64) function dr_psi_2s(rr, a0)
2601 real(real64),
intent(in) :: a0, rr
2604 a0**(-m_five/m_two) *
exp(-rr/(m_two * a0)) / (
sqrt(m_two) * m_two *
sqrt(m_pi))
2609 type(namespace_t),
intent(in) :: namespace
2612 integer(int64) :: i, j, k
2613 integer(int64) :: dims(3)
2614 character(len=MAX_PATH_LEN) :: fname
2616 real(real64),
allocatable :: ff(:)
2626 call parse_variable(namespace,
'TestCSVFileName',
"", fname)
2628 message(1) =
"Attempting to probe "//trim(fname)
2629 call messages_info(1, namespace=namespace)
2631 call io_csv_get_info(fname, dims, ierr)
2633 message(1) =
"Probing successful."
2634 write(message(2),
'("found dimensions: ",3I20)') dims
2635 call messages_info(2, namespace=namespace)
2637 write(message(1),
'("Probing failed. ierr = ",I5)') ierr
2638 call messages_fatal(1, namespace=namespace)
2641 safe_allocate(ff(1:dims(1)*dims(2)*dims(3)))
2643 message(1) =
"Attempting to read "//trim(fname)
2644 call messages_info(1, namespace=namespace)
2646 call dread_csv(fname, dims(1)*dims(2)*dims(3), ff, ierr)
2648 message(1) =
"Reading successful."
2649 call messages_info(1, namespace=namespace)
2651 do k=1, min(4_int64, dims(3))
2652 do j=1, min(4_int64, dims(2))
2653 write(message(j),
'("data ",2I5, 1X, 4F8.2)') k, j, &
2654 (ff(i + dims(1)*(j-1) + dims(1)* dims(2)*(k-1)), i=1, min(4_int64, dims(1)))
2656 write(message(int(j, int32)),
'("")')
2657 call messages_info(int(j, int32), namespace=namespace)
2661 message(1) =
"Reading failed."
2662 call messages_fatal(1, namespace=namespace)
2665 safe_deallocate_a(ff)
batchified version of the BLAS axpy routine:
batchified multiplication by mesh function with optional conjugation:
batchified scale with optional conjugation:
scale a batch by a constant or vector
There are several ways how to call batch_set_state and batch_get_state:
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.
This module provides unit tests for the derivatives.
subroutine, public zderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public dderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public derivatives_advanced_benchmark(this, namespace)
Further unit tests design to challenge numerical stability of the finite differences.
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_end(hm)
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
subroutine, public hamiltonian_elec_copy(hm_out, hm_in)
Deep-copy a hamiltonian_elec_t snapshot.
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.
Computes and , suitable as an operator callback for iterative solvers (CG, QMR, etc....
subroutine, public dshifted_laplacian_op(x, lx, userdata)
Computes the shifted Laplacian operator: .
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)
A simple switch between specialized kernels and generic kernels.
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)
A simple switch between specialized kernels and generic kernels.
This module defines various routines, operating on mesh functions.
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_fatal(no_lines, only_root_writes, namespace)
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()
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.
real(real64) function psi_2s(rr, a0)
subroutine test_ion_interaction(namespace, grp)
subroutine test_hartree(param, namespace, grp)
subroutine test_interpolation(param, namespace, grp)
subroutine test_helmholtz_decomposition(namespace, grp)
subroutine test_current_density(namespace, grp)
Here we test the different contributions to the total electronic current density.
subroutine test_derivatives(param, namespace, grp)
real(real64) function psi_1s(rr, a0)
subroutine test_batch_set_gaussian(psib, mesh)
subroutine test_boundaries(param, namespace, grp)
subroutine test_sphash(namespace)
subroutine test_hamiltonian(param, namespace, grp)
subroutine test_dense_eigensolver()
subroutine multigrid_test_interpolation(mgrid, space)
subroutine test_projector(param, namespace, grp)
real(real64) function dr_psi_2s(rr, a0)
subroutine test_composition_chebyshev(namespace, grp)
Test the composition rule for Chebyshev polynomials.
complex(real64) function lc_hydrogen_state(rr, alpha, a0)
subroutine test_subspace_diagonalization(param, namespace, grp)
subroutine, public test_run(namespace, grp)
Components and integration test runner.
subroutine test_density_calc(param, namespace, grp)
subroutine test_linear_solver(namespace, grp)
subroutine test_prints_info_batch(st, gr, psib, string)
subroutine test_orthogonalization(param, namespace, grp)
real(real64) function dr_psi_1s(rr, a0)
subroutine test_regridding(namespace, grp)
subroutine test_batch_ops(param, namespace, grp)
subroutine test_vecpot_analytical(namespace, grp)
Here, analytical formulation for vector potential and B field are used. Ref: Sangita Sen and Erik I....
subroutine test_exponential(param, namespace, grp)
subroutine test_mesh_generation(namespace, grp)
subroutine set_hydrogen_states(psib, mesh, namespace, alpha, a0)
subroutine test_dft_u(param, namespace, grp)
subroutine test_grid_interpolation(grp)
subroutine test_csv_input(namespace)
type(type_t), parameter, 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 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.
This is defined even when running serial.
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)
real(real64) function gaussian(x, a)
subroutine write_condition_result(condition, result)
real(real64) function values(xx)