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)
1233 if (
bitand(ops, option__testbatchops__ops_dotp_vector) /= 0)
then
1235 message(1) =
'Info: Testing dotp_vector'
1238 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1239 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1241 nst = sys%st%group%psib(1, 1)%nst
1244 safe_allocate(ddotv(1:nst))
1245 do itime = 1, param%repetitions
1250 write(
message(ist),
'(a,i3,3x,e23.16)')
'Dotp_vector state', ist, ddotv(ist)
1253 safe_deallocate_a(ddotv)
1255 safe_allocate(zdotv(1:nst))
1256 do itime = 1, param%repetitions
1261 write(
message(ist),
'(a,i3,3x,2(e23.16,1x))')
'Dotp_vector state', ist, zdotv(ist)
1264 safe_deallocate_a(zdotv)
1271 if (
bitand(ops, option__testbatchops__ops_dotp_self) /= 0)
then
1273 message(1) =
'Info: Testing dotp_self'
1276 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1278 nst = sys%st%group%psib(1, 1)%nst
1281 safe_allocate(ddot(1:nst, 1:nst))
1282 do itime = 1, param%repetitions
1288 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_self states', ist, jst, ddot(ist,jst)
1292 safe_deallocate_a(ddot)
1294 safe_allocate(zdot(1:nst, 1:nst))
1295 do itime = 1, param%repetitions
1301 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_self states', ist, jst, zdot(ist,jst)
1305 safe_deallocate_a(zdot)
1311 if (
bitand(ops, option__testbatchops__ops_ax_function_py) /= 0)
then
1312 message(1) =
'Info: Testing ax_function_py'
1315 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1318 safe_allocate(df(sys%gr%np, sys%st%d%dim))
1319 safe_allocate(dweight(1:sys%st%group%psib(1, 1)%nst_linear))
1320 dweight = 0.1_real64
1323 do itime = 1, param%repetitions
1326 safe_deallocate_a(df)
1327 safe_deallocate_a(dweight)
1329 safe_allocate(zf(sys%gr%np, sys%st%d%dim))
1330 safe_allocate(zweight(1:sys%st%group%psib(1, 1)%nst_linear))
1331 zweight = cmplx(0.1_real64,
m_zero, real64)
1334 do itime = 1, param%repetitions
1337 safe_deallocate_a(zf)
1338 safe_deallocate_a(zweight)
1345 if (
bitand(ops, option__testbatchops__ops_get_points) /= 0)
then
1350 call sys%st%group%psib(1, 1)%copy_to(yy)
1356 safe_allocate(dpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1358 do itime = 1, param%repetitions
1359 do sp = 1, sys%gr%np, block_size
1360 size = min(block_size, sys%gr%np - sp + 1)
1365 safe_deallocate_a(dpoints)
1371 safe_allocate(zpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1373 do itime = 1, param%repetitions
1374 do sp = 1, sys%gr%np, block_size
1375 size = min(block_size, sys%gr%np - sp + 1)
1380 safe_deallocate_a(zpoints)
1391 safe_deallocate_p(sys)
1406 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
1408 message(1) =
'Info: Testing the finite-differences derivatives.'
1412 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1413 call dderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1416 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1417 call zderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1420 if (sys%space%dim > 1)
then
1424 safe_deallocate_p(sys)
1444 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
1446 message(1) =
'Info: Testing orthogonalization.'
1450 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1451 message(1) =
'Info: Real wave-functions.'
1453 do itime = 1, param%repetitions
1458 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1459 message(1) =
'Info: Complex wave-functions.'
1461 do itime = 1, param%repetitions
1466 safe_deallocate_p(sys)
1482 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
1484 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1493 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1495 call messages_write(
'Info: Testing complex interpolation routines')
1503 safe_deallocate_p(sys)
1519 sys =>
electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
1521 call ion_interaction_test(sys%space, sys%ions%latt, sys%ions%atom, sys%ions%natoms, sys%ions%pos, &
1522 sys%gr%box%bounding_box_l, namespace, sys%mc)
1524 safe_deallocate_p(sys)
1533 type(
grid_t),
intent(in) :: gr
1534 class(
batch_t),
intent(inout) :: psib
1535 character(*),
optional,
intent(in) :: string
1538 complex(real64),
allocatable :: zpsi(:, :)
1539 real(real64),
allocatable :: dpsi(:, :)
1541 character(80) :: string_
1548 safe_allocate(dpsi(1:gr%np, 1:st%d%dim))
1550 safe_allocate(zpsi(1:gr%np, 1:st%d%dim))
1553 do itime = 1, psib%nst
1556 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
dmf_nrm2(gr, st%d%dim, dpsi)
1559 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
zmf_nrm2(gr, st%d%dim, zpsi)
1565 safe_deallocate_a(dpsi)
1567 safe_deallocate_a(zpsi)
1583 write(
message(1),
'(a)')
" Operation Counter Time Global step"
1598 call clock%set(
clock_t(time_step=
m_four, initial_iteration=1))
1602 write(
message(1),
'(a)')
" Clock comparisons:"
1605 other_clock =
clock_t(time_step=
m_one, initial_iteration=5)
1617 character(len=*),
intent(in) :: operation
1619 write(
message(1),
'(a17,1x,i6,1x,f10.1,1x,i16)') operation, clock%counter(), clock%value(), clock%global_step()
1624 character(len=*),
intent(in) :: condition
1625 logical,
intent(in) :: result
1627 write(
message(1),
'(a10," = ",i1," (",l1,")")') condition, abs(transfer(result, 0)), result
1644 message(1) =
"cgal_polyhedron_point_inside"
1656 integer :: N, ii, jj, N_list(4), i_N
1657 real(real64),
allocatable :: matrix(:, :), eigenvectors(:, :), eigenvalues(:), test(:)
1658 real(real64),
allocatable :: differences(:)
1662 n_list = [15, 32, 100, 500]
1666 safe_allocate(matrix(1:n, 1:n))
1667 safe_allocate(eigenvectors(1:n, 1:n))
1668 safe_allocate(eigenvalues(1:n))
1669 safe_allocate(test(1:n))
1670 safe_allocate(differences(1:n))
1676 matrix(ii, jj) = ii * jj
1681 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1685 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1686 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1688 write(
message(1),
"(A, I3, A, E13.6)")
"Parallel solver - N: ", n, &
1689 ", average difference: ", sum(differences)/n
1693 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1697 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1698 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1700 write(
message(1),
"(A, I3, A, E13.6)")
"Serial solver - N: ", n, &
1701 ", average difference: ", sum(differences)/n
1704 safe_deallocate_a(matrix)
1705 safe_deallocate_a(eigenvectors)
1706 safe_deallocate_a(eigenvalues)
1707 safe_deallocate_a(test)
1708 safe_deallocate_a(differences)
1715 class(
batch_t),
intent(inout) :: psib
1716 class(
mesh_t),
intent(in) :: mesh
1718 real(real64),
allocatable :: dff(:)
1719 complex(real64),
allocatable :: zff(:)
1721 real(real64) :: da, db, dc
1722 complex(real64) :: za, zb, zc
1727 da =
m_one/mesh%box%bounding_box_l(1)
1733 za = da +
m_zi*0.01_real64
1734 zb = db*
exp(
m_zi*0.345_real64)
1735 zc = dc -
m_zi*50.0_real64
1737 safe_allocate(zff(1:mesh%np))
1738 do ist = 1, psib%nst_linear
1742 zff(ip) = zb*
exp(-za*sum(mesh%x(:, ip)**2)) + zc
1747 safe_deallocate_a(zff)
1749 safe_allocate(dff(1:mesh%np))
1750 do ist = 1, psib%nst_linear
1754 dff(ip) = db*
exp(-da*sum(mesh%x(:, ip)**2)) + dc
1759 safe_deallocate_a(dff)
1776 sys%gr%stencil, sys%mc, nlevels=3)
1782 safe_deallocate_p(sys)
1798 write(
message(1),*)
'hash[1] :', found,
value
1802 write(
message(1),*)
'hash[2] :', found,
value
1806 write(
message(1),*)
'hash[3] :', found,
value
1818 integer ::
value, sum
1827 write(
message(1),*)
'hash["one"]: ', found,
value
1831 write(
message(1),*)
'hash["two"]: ', found,
value
1835 write(
message(1),*)
'hash["three"]: ', found,
value
1842 do while (it%has_next())
1843 value = it%get_next()
1845 write(
message(1),
'(I3,A,I5)') counter,
': hash[...] = ',
value
1847 counter = counter + 1
1849 write(
message(1),*)
'counter = ', counter
1850 write(
message(2),*)
'sum = ', sum
1872 class(*),
pointer :: value
1874 integer :: count_clock, count_space
1876 safe_allocate(clock_2)
1890 write(
message(1),*)
'hash["one"]: ', found,
value%counter()
1893 write(
message(1),*)
'hash["one"]: ', found,
value%short_info()
1896 write(
message(1),*)
'wrong type. found = ', found
1903 write(
message(1),*)
'hash["two"]: ', found,
value%counter()
1906 write(
message(1),*)
'hash["two"]: ', found,
value%short_info()
1909 write(
message(1),*)
'wrong type. found = ',found
1913 safe_deallocate_a(clock_2)
1918 write(
message(1),*)
'hash["three"]: ', found,
value%counter()
1921 write(
message(1),*)
'hash["three"]: ', found,
value%short_info()
1924 write(
message(1),*)
'wrong type. found = ',found
1933 do while (it%has_next())
1934 value => it%get_next()
1937 count_clock = count_clock + 1
1939 count_space = count_space + 1
1943 write(
message(1), *)
'Count_clock = ', count_clock
1944 write(
message(2), *)
'Count_space = ', count_space
1958 real(real64),
allocatable :: ff_A(:), ff_A_reference(:), ff_B(:), ff_B_reference(:), diff_A(:), diff_B(:)
1959 real(real64) :: norm_ff, norm_diff
1969 safe_allocate(ff_a(1:sysa%gr%np))
1970 safe_allocate(ff_a_reference(1:sysa%gr%np))
1971 safe_allocate(diff_a(1:sysa%gr%np))
1972 safe_allocate(ff_b(1:sysb%gr%np))
1973 safe_allocate(ff_b_reference(1:sysb%gr%np))
1974 safe_allocate(diff_b(1:sysb%gr%np))
1976 do ip = 1, sysa%gr%np
1977 ff_a_reference(ip) =
values(sysa%gr%x(:, ip))
1979 do ip = 1, sysb%gr%np
1980 ff_b_reference(ip) =
values(sysb%gr%x(:, ip))
1984 regridding =>
regridding_t(sysb%gr, sysa%gr, sysa%space, sysa%namespace)
1985 call regridding%do_transfer(ff_b, ff_a_reference)
1986 safe_deallocate_p(regridding)
1989 do ip = 1, sysb%gr%np
1991 ff_b_reference(ip) =
m_zero
1994 diff_b(ip) = abs(ff_b_reference(ip) - ff_b(ip))
1997 norm_ff =
dmf_nrm2(sysb%gr, ff_b_reference)
1998 norm_diff =
dmf_nrm2(sysb%gr, diff_b)
2000 write(
message(1),
'(a, E14.6)')
"Forward: difference of reference to mapped function (rel.): ", &
2005 sysb%gr, ff_b_reference,
unit_one, ierr)
2009 sysa%gr, ff_a_reference,
unit_one, ierr)
2012 regridding =>
regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
2013 call regridding%do_transfer(ff_a, ff_b_reference)
2014 safe_deallocate_p(regridding)
2016 do ip = 1, sysa%gr%np
2018 ff_a_reference(ip) =
m_zero
2021 diff_a(ip) = abs(ff_a_reference(ip) - ff_a(ip))
2024 norm_ff =
dmf_nrm2(sysa%gr, ff_a_reference)
2025 norm_diff =
dmf_nrm2(sysa%gr, diff_a)
2027 write(
message(1),
'(a, E14.6)')
"Backward: difference of reference to mapped function (rel.): ", &
2032 sysa%gr, ff_a_reference,
unit_one, ierr)
2036 sysb%gr, ff_b_reference,
unit_one, ierr)
2038 safe_deallocate_a(ff_a)
2039 safe_deallocate_a(ff_a_reference)
2040 safe_deallocate_a(ff_b)
2041 safe_deallocate_a(ff_b_reference)
2042 safe_deallocate_a(diff_a)
2043 safe_deallocate_a(diff_b)
2044 safe_deallocate_p(sysa)
2045 safe_deallocate_p(sysb)
2051 real(real64) function values(xx)
2052 real(real64),
intent(in) :: xx(:)
2053 real(real64) :: xx0(1:size(xx, dim=1))
2054 real(real64),
parameter :: aa =
m_half
2055 real(real64),
parameter :: bb =
m_four
2059 values = bb *
exp(-aa*sum((xx-xx0)**2))
2065 type(namespace_t),
intent(in) :: namespace
2066 type(mpi_grp_t),
intent(in) :: grp
2068 type(namespace_t) :: namespace_a, namespace_b
2069 type(electrons_t),
pointer :: sysA, sysB
2070 type(regridding_t),
pointer :: regridding
2071 real(real64),
allocatable :: ff_a(:), ff_b(:), lapl_a(:), lapl_b(:), lapl_b_on_a(:), diff_lapl(:)
2072 real(real64) :: abs_diff, rel_diff, norm_lapl
2074 real(real64),
parameter :: alpha = 0.5_real64
2078 call calc_mode_par%set_parallelization(p_strategy_states, default=.false.)
2080 namespace_a = namespace_t(
"A", namespace)
2081 namespace_b = namespace_t(
"B", namespace)
2083 sysa => electrons_t(namespace_a, grp, int(option__calculationmode__dummy, int32))
2084 sysb => electrons_t(namespace_b, grp, int(option__calculationmode__dummy, int32))
2086 assert(sysa%gr%np_global == sysb%gr%np_global)
2087 assert(sysa%st%nst == sysb%st%nst)
2088 assert(sysa%ions%natoms == sysb%ions%natoms)
2090 dim = sysa%gr%box%dim
2091 safe_allocate(ff_a(1:sysa%gr%np_part))
2092 safe_allocate(ff_b(1:sysb%gr%np_part))
2093 safe_allocate(lapl_a(1:sysa%gr%np))
2094 safe_allocate(lapl_b(1:sysb%gr%np))
2095 safe_allocate(lapl_b_on_a(1:sysa%gr%np))
2096 safe_allocate(diff_lapl(1:sysa%gr%np))
2098 do ip = 1, sysa%gr%np_part
2099 ff_a(ip) =
gaussian(sysa%gr%x(1:dim, ip), alpha)
2101 do ip = 1, sysb%gr%np_part
2102 ff_b(ip) =
gaussian(sysb%gr%x(1:dim, ip), alpha)
2105 call dderivatives_lapl(sysa%gr%der, ff_a, lapl_a, set_bc=.false.)
2106 call dderivatives_lapl(sysb%gr%der, ff_b, lapl_b, set_bc=.false.)
2108 regridding => regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
2109 call regridding%do_transfer(lapl_b_on_a, lapl_b)
2110 safe_deallocate_p(regridding)
2112 diff_lapl = lapl_a - lapl_b_on_a
2113 abs_diff = dmf_nrm2(sysa%gr, diff_lapl)
2114 norm_lapl = dmf_nrm2(sysa%gr, lapl_a)
2115 rel_diff = abs_diff/max(norm_lapl, m_epsilon)
2117 assert(rel_diff <= 1.0e-12_real64)
2119 write(message(1),
'(a)')
"System A initialized"
2120 call messages_info(1, namespace=namespace_a)
2121 write(message(1),
'(a)')
"System B initialized"
2122 call messages_info(1, namespace=namespace_b)
2123 write(message(1),
'(a,es17.10)')
"Gaussian Laplacian absolute difference = ", abs_diff
2124 write(message(2),
'(a,es17.10)')
"Gaussian Laplacian relative difference = ", rel_diff
2125 write(message(3),
'(a,es17.10)')
"Gaussian Laplacian reference norm = ", norm_lapl
2126 call messages_info(3, namespace=namespace)
2128 safe_deallocate_a(ff_a)
2129 safe_deallocate_a(ff_b)
2130 safe_deallocate_a(lapl_a)
2131 safe_deallocate_a(lapl_b)
2132 safe_deallocate_a(lapl_b_on_a)
2133 safe_deallocate_a(diff_lapl)
2134 safe_deallocate_p(sysa)
2135 safe_deallocate_p(sysb)
2139 real(real64) function gaussian(x, a) result(val)
2140 real(real64),
intent(in) :: x(:)
2141 real(real64),
intent(in) :: a
2143 val =
exp(-a*sum(x**2))
2154 type(namespace_t),
intent(in) :: namespace
2155 type(mpi_grp_t),
intent(in) :: grp
2157 class(maxwell_t),
pointer :: maxwell_system
2159 real(real64),
allocatable :: magnetic_field(:,:)
2160 real(real64),
allocatable :: vector_potential_mag(:,:)
2161 real(real64),
allocatable :: vector_potential_analytical(:,:)
2162 real(real64),
allocatable :: delta(:,:)
2163 real(real64) :: exp_factor
2167 real(real64) :: sigma
2168 integer :: ip, j, ierr, nn
2169 integer(int64) :: out_how
2170 character(len=MAX_PATH_LEN) :: fname, fname2, fname3
2173 maxwell_system => maxwell_t(namespace, grp)
2174 sigma = maxwell_system%gr%box%bounding_box_l(1)/10_real64
2176 safe_allocate(magnetic_field(1:maxwell_system%gr%np_part, 1:3))
2177 safe_allocate(vector_potential_mag(1:maxwell_system%gr%np_part, 1:3))
2178 safe_allocate(vector_potential_analytical(1:maxwell_system%gr%np_part, 1:3))
2179 safe_allocate(delta(1:maxwell_system%gr%np, 1:3))
2192 call parse_variable(namespace,
'TestVectorPotentialType', option__testvectorpotentialtype__bounded, nn)
2195 case (option__testvectorpotentialtype__bounded)
2196 do ip = 1, maxwell_system%gr%np_part
2197 xx = maxwell_system%gr%x(1, ip)
2198 yy = maxwell_system%gr%x(2, ip)
2199 zz = maxwell_system%gr%x(3, ip)
2200 exp_factor =
exp((-xx**2 - yy**2 - zz**2)*1/(2*sigma**2))
2201 magnetic_field(ip, 1) = exp_factor*yy*(1 - (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
2202 magnetic_field(ip, 2) = exp_factor * xx * (1 + (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
2203 magnetic_field(ip, 3) = exp_factor * 2 * xx * yy * zz * 1/(3*sigma**2)
2205 vector_potential_analytical(ip, 1) = m_third * xx * zz * exp_factor
2206 vector_potential_analytical(ip, 2) = - m_third * yy * zz * exp_factor
2207 vector_potential_analytical(ip, 3) = m_third * (-xx**2 + yy**2) * exp_factor
2209 case (option__testvectorpotentialtype__unbounded)
2211 do ip = 1, maxwell_system%gr%np_part
2212 magnetic_field(ip, 1) = maxwell_system%gr%x(2, ip)
2213 magnetic_field(ip, 2) = maxwell_system%gr%x(1, ip)
2214 magnetic_field(ip, 3) = m_zero
2216 vector_potential_analytical(ip, 1) = m_third * maxwell_system%gr%x(1, ip) * maxwell_system%gr%x(3, ip)
2217 vector_potential_analytical(ip, 2) = - m_third * maxwell_system%gr%x(2, ip) * maxwell_system%gr%x(3, ip)
2218 vector_potential_analytical(ip, 3) = - m_third * (maxwell_system%gr%x(1, ip)**2 - maxwell_system%gr%x(2, ip)**2)
2221 call maxwell_system%helmholtz%get_vector_potential(namespace, vector_potential_mag, magnetic_field)
2225 do ip = 1, maxwell_system%gr%np
2226 delta(ip,j) = vector_potential_analytical(ip, j) - vector_potential_mag(ip, j)
2231 write(message(j),*)
'j, norm2(delta)', j, norm2(delta(:,j))
2233 call messages_info(3)
2235 write(fname,
'(a)')
'deviation_from_analytical_formulation'
2236 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, maxwell_system%space, maxwell_system%gr, &
2237 delta, unit_one, ierr)
2238 write(fname2,
'(a)')
'vector_potential_analytical'
2239 call io_function_output_vector(out_how ,
'./' , trim(fname2), namespace, maxwell_system%space, maxwell_system%gr, &
2240 vector_potential_analytical, unit_one, ierr)
2241 write(fname3,
'(a)')
'vector_potential_mag'
2242 call io_function_output_vector(out_how ,
'./' , trim(fname3), namespace, maxwell_system%space, maxwell_system%gr, &
2243 vector_potential_mag, unit_one, ierr)
2245 safe_deallocate_a(magnetic_field)
2246 safe_deallocate_a(vector_potential_mag)
2247 safe_deallocate_a(vector_potential_analytical)
2248 safe_deallocate_a(delta)
2249 safe_deallocate_p(maxwell_system)
2255 type(multigrid_t),
intent(in) :: mgrid
2256 class(space_t),
intent(in) :: space
2258 real(real64),
allocatable :: guess0(:), res0(:), guess1(:)
2259 type(mesh_t),
pointer :: mesh0, mesh1
2260 real(real64) :: delta, xx(3,2), alpha, beta, rr
2261 integer :: nn, ip, ierr
2265 message(1) =
'Info: Testing the grid interpolation.'
2267 call messages_info(2)
2269 mesh0 => mgrid%level(0)%mesh
2270 mesh1 => mgrid%level(1)%mesh
2272 safe_allocate(guess0(1:mesh0%np_part))
2273 safe_allocate(res0(1:mesh0%np_part))
2274 safe_allocate(guess1(1:mesh1%np_part))
2276 alpha = m_four*mesh0%spacing(1)
2277 beta = m_one / (alpha**space%dim *
sqrt(m_pi)**space%dim)
2292 call mesh_r(mesh0, ip, rr, origin = xx(:, nn))
2293 guess0(ip) = guess0(ip) + (-1)**nn * beta*
exp(-(rr/alpha)**2)
2297 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_target", global_namespace, &
2298 space, mesh0, guess0, unit_one, ierr)
2299 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_target", global_namespace, &
2300 space, mesh0, guess0, unit_one, ierr)
2301 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_target", global_namespace, &
2302 space, mesh0, guess0, unit_one, ierr)
2309 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, injection)
2311 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2313 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_result", global_namespace, &
2314 space, mesh0, res0, unit_one, ierr)
2315 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_result", global_namespace, &
2316 space, mesh0, res0, unit_one, ierr)
2317 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_result", global_namespace, &
2318 space, mesh0, res0, unit_one, ierr)
2320 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2321 write(message(1),
'(a,e13.6)')
'Interpolation test (abs.) = ', delta
2327 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, fullweight)
2329 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2331 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"restriction_result", global_namespace, &
2332 space, mesh0, res0, unit_one, ierr)
2333 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"restriction_result", global_namespace, &
2334 space, mesh0, res0, unit_one, ierr)
2335 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"restriction_result", global_namespace, &
2336 space, mesh0, res0, unit_one, ierr)
2338 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2339 write(message(2),
'(a,e13.6)')
'Restriction test (abs.) = ', delta
2340 call messages_info(2)
2342 safe_deallocate_a(guess0)
2343 safe_deallocate_a(res0)
2344 safe_deallocate_a(guess1)
2352 type(namespace_t),
intent(in) :: namespace
2353 type(mpi_grp_t),
intent(in) :: grp
2354 type(electrons_t),
pointer :: sys
2356 type(current_t) :: current
2357 character(len=MAX_PATH_LEN) :: fname
2358 integer :: ierr, ip, idir
2359 integer(int64) :: out_how
2360 real(real64),
allocatable :: current_para_ref(:,:), current_dia_ref(:,:), current_mag_ref(:,:), delta(:)
2361 real(real64) :: xx(3), rr, a0, mag_curr, sin_thet, sin_phi, cos_phi, vec_pot_slope
2362 complex(real64) :: alpha
2364 sys => electrons_t(namespace, grp, int(option__calculationmode__dummy, int32))
2366 alpha = (0.0_real64, 0.5_real64)
2368 vec_pot_slope = 0.4_real64
2370 call states_elec_allocate_wfns(sys%st, sys%gr, wfs_type = type_cmplx)
2373 call current_init(current, namespace)
2375 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st)
2377 safe_allocate(sys%hm%hm_base%vector_potential(1:3, 1:sys%gr%np))
2379 sys%hm%hm_base%vector_potential = m_zero
2380 do ip = 1, sys%gr%np
2381 xx = sys%gr%x(1:3, ip)
2382 sys%hm%hm_base%vector_potential(2, ip) = vec_pot_slope * xx(1) / p_c
2385 call states_elec_allocate_current(sys%st, sys%space, sys%gr)
2386 call density_calc(sys%st, sys%gr, sys%st%rho)
2388 call current_calculate(current, namespace, sys%gr, sys%hm, sys%space, sys%st)
2390 safe_allocate(current_para_ref(1:sys%gr%np,1:3))
2391 safe_allocate(current_dia_ref(1:sys%gr%np,1:3))
2392 safe_allocate(current_mag_ref(1:sys%gr%np,1:3))
2393 safe_allocate(delta(1:sys%gr%np))
2396 current_para_ref(:,:) = m_zero
2397 do ip = 1, sys%gr%np
2398 call mesh_r(sys%gr, ip, rr)
2399 xx = sys%gr%x(1:3, ip)
2400 if (rr > r_small)
then
2402 psi_1s(rr, a0) *
dr_psi_2s(rr, a0) ) * aimag(alpha) / (1 + abs(alpha)**2) * xx(1:3) / rr
2406 write(fname,
'(a)')
'current_para'
2407 out_how = io_function_fill_how(
"PlaneZ")
2408 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2409 sys%st%current_para(:,:,1), unit_one, ierr)
2411 write(fname,
'(a)')
'current_para-ref'
2412 out_how = io_function_fill_how(
"PlaneZ")
2413 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2414 current_para_ref(:,:), unit_one, ierr)
2418 delta(:) = current_para_ref(1:sys%gr%np, idir) - sys%st%current_para(1:sys%gr%np, idir, 1)
2419 write(message(idir),*)
'idir =',idir,
', norm2(delta paramagnetic)',norm2(delta)
2421 call messages_info(3)
2424 current_dia_ref(:,:) = m_zero
2425 do ip = 1, sys%gr%np
2426 call mesh_r(sys%gr, ip, rr)
2427 current_dia_ref(ip,1:3) = - sys%hm%hm_base%vector_potential(1:3,ip) *&
2431 write(fname,
'(a)')
'current_dia'
2432 out_how = io_function_fill_how(
"PlaneZ")
2433 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2434 sys%st%current_dia(:,:,1), unit_one, ierr)
2436 write(fname,
'(a)')
'current_dia-ref'
2437 out_how = io_function_fill_how(
"PlaneZ")
2438 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2439 current_dia_ref(:,:), unit_one, ierr)
2443 delta(:) = current_dia_ref(1:sys%gr%np, idir) - sys%st%current_dia(1:sys%gr%np, idir, 1)
2444 write(message(idir),*)
'idir =',idir,
', norm2(delta diamagnetic)',norm2(delta)
2446 call messages_info(3)
2449 call current_calculate_mag(sys%gr%der, sys%st)
2452 current_mag_ref(:,:) = m_zero
2453 do ip = 1, sys%gr%np
2454 call mesh_r(sys%gr, ip, rr)
2455 xx = sys%gr%x(1:3, ip)
2456 if (norm2(xx(1:2)) > r_small .and. rr > r_small)
then
2457 sin_thet = norm2(xx(1:2)) / rr
2458 sin_phi = xx(2) / norm2(xx(1:2))
2459 cos_phi = xx(1) / norm2(xx(1:2))
2463 current_mag_ref(ip,1) = m_half * mag_curr * sin_thet * sin_phi / (1+abs(alpha)**2)
2464 current_mag_ref(ip,2) = -m_half * mag_curr * sin_thet * cos_phi / (1+abs(alpha)**2)
2468 write(fname,
'(a)')
'current_mag'
2469 out_how = io_function_fill_how(
"PlaneZ")
2470 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2471 sys%st%current_mag(:,:,1), unit_one, ierr)
2473 write(fname,
'(a)')
'current_mag-ref'
2474 out_how = io_function_fill_how(
"PlaneZ")
2475 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2476 current_mag_ref(:,:), unit_one, ierr)
2480 delta(:) = current_mag_ref(1:sys%gr%np, idir) - sys%st%current_mag(1:sys%gr%np, idir, 1)
2481 write(message(idir),*)
'idir =',idir,
', norm2(delta magnetization)',norm2(delta)
2483 call messages_info(3)
2485 safe_deallocate_a(current_para_ref)
2486 safe_deallocate_a(current_dia_ref)
2487 safe_deallocate_a(current_mag_ref)
2488 safe_deallocate_a(delta)
2489 safe_deallocate_p(sys)
2495 class(batch_t),
intent(inout) :: psib
2496 class(mesh_t),
intent(in) :: mesh
2497 type(namespace_t),
intent(in) :: namespace
2498 complex(real64),
intent(in) :: alpha
2499 real(real64),
intent(in) :: a0
2501 complex(real64),
allocatable :: zff(:)
2508 safe_allocate(zff(1:mesh%np))
2509 if (type_is_complex(psib%type()))
then
2511 call mesh_r(mesh, ip, rr)
2514 call batch_set_state(psib, 1, mesh%np, zff)
2516 write(message(1),*)
"States should be complex for the linear combination of hydrogenic states to work"
2517 call messages_info(1, namespace=namespace)
2519 safe_deallocate_a(zff)
2525 real(real64),
intent(in) :: a0, rr
2526 complex(real64),
intent(in) :: alpha
2532 real(real64) function psi_1s(rr, a0)
2533 real(real64),
intent(in) :: a0, rr
2539 real(real64) function psi_2s(rr, a0)
2540 real(real64),
intent(in) :: a0, rr
2542 psi_2s =
sqrt(m_two) * a0**(-m_three/m_two) * (m_one - rr/(m_two * a0)) *
exp(-rr/(m_two * a0)) &
2543 / (m_two *
sqrt(m_pi))
2546 real(real64) function dr_psi_1s(rr, a0)
2547 real(real64),
intent(in) :: a0, rr
2552 real(real64) function dr_psi_2s(rr, a0)
2553 real(real64),
intent(in) :: a0, rr
2556 a0**(-m_five/m_two) *
exp(-rr/(m_two * a0)) / (
sqrt(m_two) * m_two *
sqrt(m_pi))
2561 type(namespace_t),
intent(in) :: namespace
2564 integer(int64) :: i, j, k
2565 integer(int64) :: dims(3)
2566 character(len=MAX_PATH_LEN) :: fname
2568 real(real64),
allocatable :: ff(:)
2578 call parse_variable(namespace,
'TestCSVFileName',
"", fname)
2580 message(1) =
"Attempting to probe "//trim(fname)
2581 call messages_info(1, namespace=namespace)
2583 call io_csv_get_info(fname, dims, ierr)
2585 message(1) =
"Probing successful."
2586 write(message(2),
'("found dimensions: ",3I20)') dims
2587 call messages_info(2, namespace=namespace)
2589 write(message(1),
'("Probing failed. ierr = ",I5)') ierr
2590 call messages_fatal(1, namespace=namespace)
2593 safe_allocate(ff(1:dims(1)*dims(2)*dims(3)))
2595 message(1) =
"Attempting to read "//trim(fname)
2596 call messages_info(1, namespace=namespace)
2598 call dread_csv(fname, dims(1)*dims(2)*dims(3), ff, ierr)
2600 message(1) =
"Reading successful."
2601 call messages_info(1, namespace=namespace)
2603 do k=1, min(4_int64, dims(3))
2604 do j=1, min(4_int64, dims(2))
2605 write(message(j),
'("data ",2I5, 1X, 4F8.2)') k, j, &
2606 (ff(i + dims(1)*(j-1) + dims(1)* dims(2)*(k-1)), i=1, min(4_int64, dims(1)))
2608 write(message(int(j, int32)),
'("")')
2609 call messages_info(int(j, int32), namespace=namespace)
2613 message(1) =
"Reading failed."
2614 call messages_fatal(1, namespace=namespace)
2617 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)