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
121 type(test_parameters_t) :: param
128 call param%init_from_file(namespace)
211 call parse_variable(namespace,
'TestMode', option__testmode__hartree, test_mode)
221 select case (test_mode)
222 case (option__testmode__hartree)
224 case (option__testmode__derivatives)
226 case (option__testmode__orthogonalization)
228 case (option__testmode__interpolation)
230 case (option__testmode__ion_interaction)
232 case (option__testmode__projector)
234 case (option__testmode__dft_u)
236 case (option__testmode__hamiltonian_apply)
238 case (option__testmode__density_calc)
240 case (option__testmode__exp_apply)
242 case (option__testmode__boundaries)
244 case (option__testmode__subspace_diag)
246 case (option__testmode__batch_ops)
248 case (option__testmode__clock)
250 case (option__testmode__linear_solver)
252 case (option__testmode__cgal)
254 case (option__testmode__dense_eigensolver)
256 case (option__testmode__grid_interpolation)
258 case (option__testmode__iihash)
260 case (option__testmode__sihash)
262 case (option__testmode__sphash)
264 case (option__testmode__mpiwrappers)
266 case (option__testmode__regridding)
268 case (option__testmode__helmholtz_decomposition)
270 case (option__testmode__vecpot_analytical)
272 case (option__testmode__current_density)
274 case (option__testmode__mixing_tests)
276 case (option__testmode__optimizers)
278 case (option__testmode__weighted_kmeans)
280 case (option__testmode__csv_input)
282 case (option__testmode__composition_chebyshev)
284 case (option__testmode__lalg_adv)
286 case (option__testmode__isdf_serial)
288 case (option__testmode__isdf)
306 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
308 call poisson_test(sys%hm%psolver, sys%space, sys%gr, sys%ions%latt, namespace, param%repetitions)
309 safe_deallocate_p(sys)
326 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
329 call helmholtz%init(namespace, sys%gr, sys%mc, sys%space)
332 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Hertzian dipole test"
336 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Gaussian test"
338 call gaussian_test(helmholtz, sys%gr, sys%namespace, sys%space)
340 safe_deallocate_p(sys)
347 use,
intrinsic :: iso_c_binding, only: c_ptr
351 real(real64),
allocatable :: rho(:), x(:),
center(:)
352 real(real64) :: rr, alpha, beta, res
354 integer,
target :: prefactor = -1
356 real(real64),
parameter :: threshold = 1.e-7_real64
362 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
368 shift_aux = 0.25_real64
374 alpha =
m_four * sys%gr%spacing(1)
375 beta =
m_one / (alpha**sys%space%dim *
sqrt(
m_pi)**sys%space%dim)
377 safe_allocate(
center(1:sys%space%dim))
380 safe_allocate(rho(1:sys%gr%np))
384 rho(ip) = beta*
exp(-(rr/alpha)**2)
387 safe_allocate(x(1:sys%gr%np))
394 threshold, userdata=[c_loc(sys%gr%der),c_loc(shift_aux),c_loc(prefactor)])
395 write(
message(1),
'(a,i6,a)')
"Info: CG converged with ", iter,
" iterations."
396 write(
message(2),
'(a,e14.6)')
"Info: The residue is ", res
397 write(
message(3),
'(a,e14.6)')
"Info: Norm solution CG ",
dmf_nrm2(sys%gr, x)
402 safe_deallocate_a(rho)
403 safe_deallocate_p(sys)
416 complex(real64),
allocatable :: psi(:, :)
422 call messages_write(
'Info: Testing the nonlocal part of the pseudopotential with SOC')
427 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
436 call sys%st%group%psib(1, 1)%copy_to(epsib)
440 do itime = 1, param%repetitions
442 sys%hm%ep%natoms, 2, sys%st%group%psib(1, 1), epsib)
445 safe_allocate(psi(1:sys%gr%np, 1:sys%st%d%dim))
446 do itime = 1, epsib%nst
448 write(
message(1),
'(a,i1,3x, f12.6)')
"Norm state ", itime,
zmf_nrm2(sys%gr, 2, psi)
451 safe_deallocate_a(psi)
455 safe_deallocate_p(sys)
467 integer :: itime, ist
469 real(real64),
allocatable :: ddot(:,:,:), dweight(:,:)
470 complex(real64),
allocatable :: zdot(:,:,:), zweight(:,:)
471 logical :: skipSOrbitals, useAllOrbitals
484 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
489 if (sys%st%pack_states)
call sys%st%pack()
491 call sys%st%group%psib(1, 1)%copy_to(epsib2, copy_data = .
true.)
494 if (.not. sys%hm%phase%is_allocated())
then
495 call sys%st%group%psib(1, 1)%copy_to(epsib, copy_data = .
true.)
497 call sys%st%group%psib(1, 1)%copy_to(epsib)
498 call sys%hm%phase%apply_to(sys%gr, sys%gr%np, &
499 .false., epsib, src=sys%st%group%psib(1, 1))
500 epsib2%has_phase = .
true.
507 call parse_variable(namespace,
'UseAllAtomicOrbitals', .false., useallorbitals)
511 call dorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
512 skipsorbitals, useallorbitals, verbose=.false.)
513 safe_allocate(dweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
514 safe_allocate(ddot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
516 call zorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
517 skipsorbitals, useallorbitals, verbose=.false.)
519 safe_allocate(zweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
520 safe_allocate(zdot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
523 if (sys%hm%phase%is_allocated())
then
529 do itime = 1, param%repetitions
544 if (epsib%is_packed())
then
545 call epsib%do_unpack(force = .
true.)
548 do ist = 1, epsib%nst
550 write(
message(1),
'(a,i2,3x,e13.6)')
"Dotp state ", ist, ddot(1,1,ist)
552 write(
message(1),
'(a,i2,2(3x,e13.6))')
"Dotp state ", ist, zdot(1,1,ist)
560 safe_deallocate_a(dweight)
561 safe_deallocate_a(zweight)
562 safe_deallocate_a(ddot)
563 safe_deallocate_a(zdot)
569 safe_deallocate_p(sys)
581 type(
wfs_elec_t) :: hpsib, hpsib_copy, hpsib_diff
582 integer :: itime, terms
584 logical :: copy_before_apply
585 real(real64),
allocatable :: norm_hpsib(:), norm_diff(:)
586 real(real64) :: max_rel_diff
587 real(real64),
parameter :: hamiltonian_copy_rel_tol = 1.0e-12_real64
606 call parse_variable(namespace,
'TestHamiltonianApply', option__testhamiltonianapply__term_all, terms)
607 if (terms == 0) terms = huge(1)
617 call parse_variable(namespace,
'TestHamiltonianCopyBeforeApply', .false., copy_before_apply)
623 call messages_write(
'Info: Testing the application of the Hamiltonian')
628 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
635 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
638 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
640 if (copy_before_apply)
then
644 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
646 call sys%st%group%psib(1, 1)%copy_to(hpsib)
647 if (copy_before_apply)
call sys%st%group%psib(1, 1)%copy_to(hpsib_copy)
649 if (sys%hm%apply_packed())
then
650 call sys%st%group%psib(1, 1)%do_pack()
651 call hpsib%do_pack(copy = .false.)
652 if (copy_before_apply)
call hpsib_copy%do_pack(copy = .false.)
655 do itime = 1, param%repetitions
658 terms = terms, set_bc = .false.)
659 if (copy_before_apply)
then
661 terms = terms, set_bc = .false.)
665 terms = terms, set_bc = .false.)
666 if (copy_before_apply)
then
668 terms = terms, set_bc = .false.)
673 if (hpsib%is_packed())
then
674 call hpsib%do_unpack(force = .
true.)
676 if (copy_before_apply .and. hpsib_copy%is_packed())
then
677 call hpsib_copy%do_unpack(force = .
true.)
680 if (copy_before_apply)
then
681 call hpsib_copy%copy_to(hpsib_diff, copy_data = .
true.)
682 call batch_axpy(sys%gr%np, -1.0_real64, hpsib, hpsib_diff)
684 safe_allocate(norm_hpsib(1:hpsib%nst))
685 safe_allocate(norm_diff(1:hpsib_diff%nst))
689 max_rel_diff = maxval(norm_diff / max(norm_hpsib, tiny(1.0_real64)))
690 write(
message(1),
'(a,e23.16)')
'Hamiltonian copy max relative difference ', max_rel_diff
693 do ist = 1, hpsib%nst
694 if (norm_diff(ist) > hamiltonian_copy_rel_tol*max(norm_hpsib(ist), tiny(1.0_real64)))
then
695 write(
message(1),
'(a,i6)')
'Hamiltonian copy mismatch for state ', ist
700 safe_deallocate_a(norm_hpsib)
701 safe_deallocate_a(norm_diff)
702 call hpsib_diff%end(copy = .false.)
707 if (copy_before_apply)
then
709 call hpsib_copy%end(copy = .false.)
711 if (sys%hm%apply_packed())
then
712 call hpsib%do_pack(copy = .false.)
716 terms = terms, set_bc = .false.)
719 terms = terms, set_bc = .false.)
722 call hpsib%end(copy = .false.)
724 safe_deallocate_p(sys)
747 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
752 if (sys%st%pack_states)
call sys%st%pack()
754 do itime = 1, param%repetitions
758 write(
message(1),
'(a,3x, f12.6)')
"Norm density ",
dmf_nrm2(sys%gr, sys%st%rho(:,1))
762 safe_deallocate_p(sys)
785 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
790 if (sys%st%pack_states)
call sys%st%pack()
792 do itime = 1, param%repetitions
793 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
799 safe_deallocate_p(sys)
813 integer,
allocatable :: degree(:)
821 call messages_write(
'Info: Testing Chebyshev filtering and its composition rule')
826 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
831 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
834 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
837 safe_allocate(degree(1:sys%st%group%nblocks))
847 call parse_variable(namespace,
'TestCompositionOrder', 2, degree_n)
859 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
861 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
865 call messages_write(
'Info: Result after calling 2n-th order filtering')
871 call sys%st%group%psib(1, 1)%copy_to(psib, copy_data=.
true.)
874 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
875 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
877 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
878 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
889 safe_deallocate_a(degree)
890 safe_deallocate_p(bounds)
894 safe_deallocate_p(sys)
919 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
926 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
929 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
933 if (sys%hm%apply_packed())
then
934 call sys%st%group%psib(1, 1)%do_pack()
937 do itime = 1, param%repetitions
938 call te%apply_batch(sys%namespace, sys%gr, sys%hm, sys%st%group%psib(1, 1), 1e-3_real64)
944 safe_deallocate_p(sys)
958 real(real64),
allocatable :: diff(:)
969 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
975 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
978 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
980 call sdiag%init(sys%namespace, sys%st)
982 safe_allocate(diff(1:sys%st%nst))
984 do itime = 1, param%repetitions
986 call dsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
988 call zsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
992 safe_deallocate_a(diff)
997 safe_deallocate_p(sys)
1009 integer :: itime, ops, ops_default, ist, jst, nst, ip
1011 real(real64),
allocatable :: tmp(:)
1012 real(real64),
allocatable :: ddotv(:)
1013 complex(real64),
allocatable :: zdotv(:)
1014 real(real64),
allocatable :: ddot(:,:), df(:,:), dweight(:), dpoints(:,:,:)
1015 complex(real64),
allocatable :: zdot(:,:), zf(:,:), zweight(:), zpoints(:,:,:)
1016 real(real64),
allocatable :: dff_mf(:)
1017 complex(real64),
allocatable :: zff_mf(:)
1018 integer :: sp, block_size, size
1047 option__testbatchops__ops_axpy + &
1048 option__testbatchops__ops_scal + &
1049 option__testbatchops__ops_nrm2 + &
1050 option__testbatchops__ops_dotp_matrix + &
1051 option__testbatchops__ops_dotp_self + &
1052 option__testbatchops__ops_dotp_vector + &
1053 option__testbatchops__ops_ax_function_py + &
1054 option__testbatchops__ops_get_points
1065 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
1066 call sys%init_parallelization(
mpi_world)
1070 if (sys%st%pack_states)
call sys%st%pack()
1072 if (
bitand(ops, option__testbatchops__ops_axpy) /= 0)
then
1073 message(1) =
'Info: Testing axpy'
1076 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1077 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1079 do itime = 1, param%repetitions
1080 call batch_axpy(sys%gr%np, 0.1_real64, xx, yy)
1087 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1088 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1089 do itime = 1, param%repetitions
1090 call batch_axpby(sys%gr%np, 0.1_real64, xx, 0.2_real64, yy)
1098 if (
bitand(ops, option__testbatchops__ops_scal) /= 0)
then
1102 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1104 do itime = 1, param%repetitions
1110 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1111 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .false.)
1112 do itime = 1, param%repetitions
1119 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1120 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1121 call sys%st%group%psib(1, 1)%copy_to(zz, copy_data = .false.)
1123 do itime = 1, param%repetitions
1131 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1132 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .false.)
1134 safe_allocate(dff_mf(1:sys%gr%np))
1135 do ip = 1, sys%gr%np
1136 dff_mf(ip) = 0.01_real64 + 0.001_real64*real(sys%gr%x(1, ip), real64)
1139 do itime = 1, param%repetitions
1143 safe_allocate(zff_mf(1:sys%gr%np))
1144 do ip = 1, sys%gr%np
1145 zff_mf(ip) = cmplx(0.01_real64 + 0.001_real64*real(sys%gr%x(1, ip), real64), 0.02_real64, real64)
1148 do itime = 1, param%repetitions
1156 safe_deallocate_a(dff_mf)
1157 safe_deallocate_a(zff_mf)
1163 if (
bitand(ops, option__testbatchops__ops_nrm2) /= 0)
then
1164 message(1) =
'Info: Testing nrm2'
1167 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1168 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1170 safe_allocate(tmp(1:xx%nst))
1172 do itime = 1, param%repetitions
1175 do itime = 1, xx%nst
1176 write(
message(1),
'(a,i1,3x,e23.16)')
"Nrm2 norm state ", itime, tmp(itime)
1180 safe_deallocate_a(tmp)
1186 if (
bitand(ops, option__testbatchops__ops_dotp_matrix) /= 0)
then
1188 message(1) =
'Info: Testing dotp_matrix'
1191 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1192 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1194 nst = sys%st%group%psib(1, 1)%nst
1197 safe_allocate(ddot(1:nst, 1:nst))
1198 do itime = 1, param%repetitions
1204 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_matrix states', ist, jst, ddot(ist,jst)
1208 safe_deallocate_a(ddot)
1210 safe_allocate(zdot(1:nst, 1:nst))
1211 do itime = 1, param%repetitions
1217 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_matrix states', ist, jst, zdot(ist,jst)
1221 safe_deallocate_a(zdot)
1228 if (
bitand(ops, option__testbatchops__ops_dotp_vector) /= 0)
then
1230 message(1) =
'Info: Testing dotp_vector'
1233 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1234 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1236 nst = sys%st%group%psib(1, 1)%nst
1239 safe_allocate(ddotv(1:nst))
1240 do itime = 1, param%repetitions
1245 write(
message(ist),
'(a,i3,3x,e23.16)')
'Dotp_vector state', ist, ddotv(ist)
1248 safe_deallocate_a(ddotv)
1250 safe_allocate(zdotv(1:nst))
1251 do itime = 1, param%repetitions
1256 write(
message(ist),
'(a,i3,3x,2(e23.16,1x))')
'Dotp_vector state', ist, zdotv(ist)
1259 safe_deallocate_a(zdotv)
1266 if (
bitand(ops, option__testbatchops__ops_dotp_self) /= 0)
then
1268 message(1) =
'Info: Testing dotp_self'
1271 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1273 nst = sys%st%group%psib(1, 1)%nst
1276 safe_allocate(ddot(1:nst, 1:nst))
1277 do itime = 1, param%repetitions
1283 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_self states', ist, jst, ddot(ist,jst)
1287 safe_deallocate_a(ddot)
1289 safe_allocate(zdot(1:nst, 1:nst))
1290 do itime = 1, param%repetitions
1296 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_self states', ist, jst, zdot(ist,jst)
1300 safe_deallocate_a(zdot)
1306 if (
bitand(ops, option__testbatchops__ops_ax_function_py) /= 0)
then
1307 message(1) =
'Info: Testing ax_function_py'
1310 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1313 safe_allocate(df(sys%gr%np, sys%st%d%dim))
1314 safe_allocate(dweight(1:sys%st%group%psib(1, 1)%nst_linear))
1315 dweight = 0.1_real64
1318 do itime = 1, param%repetitions
1321 safe_deallocate_a(df)
1322 safe_deallocate_a(dweight)
1324 safe_allocate(zf(sys%gr%np, sys%st%d%dim))
1325 safe_allocate(zweight(1:sys%st%group%psib(1, 1)%nst_linear))
1326 zweight = cmplx(0.1_real64,
m_zero, real64)
1329 do itime = 1, param%repetitions
1332 safe_deallocate_a(zf)
1339 if (
bitand(ops, option__testbatchops__ops_get_points) /= 0)
then
1344 call sys%st%group%psib(1, 1)%copy_to(yy)
1350 safe_allocate(dpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1352 do itime = 1, param%repetitions
1353 do sp = 1, sys%gr%np, block_size
1354 size = min(block_size, sys%gr%np - sp + 1)
1359 safe_deallocate_a(dpoints)
1365 safe_allocate(zpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1367 do itime = 1, param%repetitions
1368 do sp = 1, sys%gr%np, block_size
1369 size = min(block_size, sys%gr%np - sp + 1)
1374 safe_deallocate_a(dpoints)
1385 safe_deallocate_p(sys)
1399 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
1400 call sys%init_parallelization(
mpi_world)
1402 message(1) =
'Info: Testing the finite-differences derivatives.'
1406 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1407 call dderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1410 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1411 call zderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1414 if (sys%space%dim > 1)
then
1418 safe_deallocate_p(sys)
1437 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
1438 call sys%init_parallelization(
mpi_world)
1440 message(1) =
'Info: Testing orthogonalization.'
1444 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1445 message(1) =
'Info: Real wave-functions.'
1447 do itime = 1, param%repetitions
1452 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1453 message(1) =
'Info: Complex wave-functions.'
1455 do itime = 1, param%repetitions
1460 safe_deallocate_p(sys)
1475 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
1476 call sys%init_parallelization(
mpi_world)
1478 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1487 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1489 call messages_write(
'Info: Testing complex interpolation routines')
1497 safe_deallocate_p(sys)
1512 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
1513 call sys%init_parallelization(
mpi_world)
1515 call ion_interaction_test(sys%space, sys%ions%latt, sys%ions%atom, sys%ions%natoms, sys%ions%pos, &
1516 sys%gr%box%bounding_box_l, namespace, sys%mc)
1518 safe_deallocate_p(sys)
1527 type(
grid_t),
intent(in) :: gr
1528 class(
batch_t),
intent(inout) :: psib
1529 character(*),
optional,
intent(in) :: string
1532 complex(real64),
allocatable :: zpsi(:, :)
1533 real(real64),
allocatable :: dpsi(:, :)
1535 character(80) :: string_
1542 safe_allocate(dpsi(1:gr%np, 1:st%d%dim))
1544 safe_allocate(zpsi(1:gr%np, 1:st%d%dim))
1547 do itime = 1, psib%nst
1550 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
dmf_nrm2(gr, st%d%dim, dpsi)
1553 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
zmf_nrm2(gr, st%d%dim, zpsi)
1559 safe_deallocate_a(dpsi)
1561 safe_deallocate_a(zpsi)
1577 write(
message(1),
'(a)')
" Operation Counter Time Global step"
1592 call clock%set(
clock_t(time_step=
m_four, initial_iteration=1))
1596 write(
message(1),
'(a)')
" Clock comparisons:"
1599 other_clock =
clock_t(time_step=
m_one, initial_iteration=5)
1611 character(len=*),
intent(in) :: operation
1613 write(
message(1),
'(a17,1x,i6,1x,f10.1,1x,i16)') operation, clock%counter(), clock%value(), clock%global_step()
1618 character(len=*),
intent(in) :: condition
1619 logical,
intent(in) :: result
1621 write(
message(1),
'(a10," = ",i1," (",l1,")")') condition, abs(transfer(result, 0)), result
1638 message(1) =
"cgal_polyhedron_point_inside"
1650 integer :: N, ii, jj, N_list(4), i_N
1651 real(real64),
allocatable :: matrix(:, :), eigenvectors(:, :), eigenvalues(:), test(:)
1652 real(real64),
allocatable :: differences(:)
1656 n_list = [15, 32, 100, 500]
1660 safe_allocate(matrix(1:n, 1:n))
1661 safe_allocate(eigenvectors(1:n, 1:n))
1662 safe_allocate(eigenvalues(1:n))
1663 safe_allocate(test(1:n))
1664 safe_allocate(differences(1:n))
1670 matrix(ii, jj) = ii * jj
1675 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1679 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1680 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1682 write(
message(1),
"(A, I3, A, E13.6)")
"Parallel solver - N: ", n, &
1683 ", average difference: ", sum(differences)/n
1687 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1691 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1692 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1694 write(
message(1),
"(A, I3, A, E13.6)")
"Serial solver - N: ", n, &
1695 ", average difference: ", sum(differences)/n
1698 safe_deallocate_a(matrix)
1699 safe_deallocate_a(eigenvectors)
1700 safe_deallocate_a(eigenvalues)
1701 safe_deallocate_a(test)
1702 safe_deallocate_a(differences)
1709 class(
batch_t),
intent(inout) :: psib
1710 class(
mesh_t),
intent(in) :: mesh
1712 real(real64),
allocatable :: dff(:)
1713 complex(real64),
allocatable :: zff(:)
1715 real(real64) :: da, db, dc
1716 complex(real64) :: za, zb, zc
1721 da =
m_one/mesh%box%bounding_box_l(1)
1727 za = da +
m_zi*0.01_real64
1728 zb = db*
exp(
m_zi*0.345_real64)
1729 zc = dc -
m_zi*50.0_real64
1731 safe_allocate(zff(1:mesh%np))
1732 do ist = 1, psib%nst_linear
1736 zff(ip) = zb*
exp(-za*sum(mesh%x(:, ip)**2)) + zc
1741 safe_deallocate_a(zff)
1743 safe_allocate(dff(1:mesh%np))
1744 do ist = 1, psib%nst_linear
1748 dff(ip) = db*
exp(-da*sum(mesh%x(:, ip)**2)) + dc
1753 safe_deallocate_a(dff)
1767 call sys%init_parallelization(
mpi_world)
1770 sys%gr%stencil, sys%mc, nlevels=3)
1776 safe_deallocate_p(sys)
1792 write(
message(1),*)
'hash[1] :', found,
value
1796 write(
message(1),*)
'hash[2] :', found,
value
1800 write(
message(1),*)
'hash[3] :', found,
value
1812 integer ::
value, sum
1821 write(
message(1),*)
'hash["one"]: ', found,
value
1825 write(
message(1),*)
'hash["two"]: ', found,
value
1829 write(
message(1),*)
'hash["three"]: ', found,
value
1836 do while (it%has_next())
1837 value = it%get_next()
1839 write(
message(1),
'(I3,A,I5)') counter,
': hash[...] = ',
value
1841 counter = counter + 1
1843 write(
message(1),*)
'counter = ', counter
1844 write(
message(2),*)
'sum = ', sum
1866 class(*),
pointer :: value
1868 integer :: count_clock, count_space
1870 safe_allocate(clock_2)
1884 write(
message(1),*)
'hash["one"]: ', found,
value%counter()
1887 write(
message(1),*)
'hash["one"]: ', found,
value%short_info()
1890 write(
message(1),*)
'wrong type. found = ', found
1897 write(
message(1),*)
'hash["two"]: ', found,
value%counter()
1900 write(
message(1),*)
'hash["two"]: ', found,
value%short_info()
1903 write(
message(1),*)
'wrong type. found = ',found
1907 safe_deallocate_a(clock_2)
1912 write(
message(1),*)
'hash["three"]: ', found,
value%counter()
1915 write(
message(1),*)
'hash["three"]: ', found,
value%short_info()
1918 write(
message(1),*)
'wrong type. found = ',found
1927 do while (it%has_next())
1928 value => it%get_next()
1931 count_clock = count_clock + 1
1933 count_space = count_space + 1
1937 write(
message(1), *)
'Count_clock = ', count_clock
1938 write(
message(2), *)
'Count_space = ', count_space
1951 real(real64),
allocatable :: ff_A(:), ff_A_reference(:), ff_B(:), ff_B_reference(:), diff_A(:), diff_B(:)
1952 real(real64) :: norm_ff, norm_diff
1961 call sysa%init_parallelization(
mpi_world)
1962 call sysb%init_parallelization(
mpi_world)
1965 safe_allocate(ff_a(1:sysa%gr%np))
1966 safe_allocate(ff_a_reference(1:sysa%gr%np))
1967 safe_allocate(diff_a(1:sysa%gr%np))
1968 safe_allocate(ff_b(1:sysb%gr%np))
1969 safe_allocate(ff_b_reference(1:sysb%gr%np))
1970 safe_allocate(diff_b(1:sysb%gr%np))
1972 do ip = 1, sysa%gr%np
1973 ff_a_reference(ip) =
values(sysa%gr%x(:, ip))
1975 do ip = 1, sysb%gr%np
1976 ff_b_reference(ip) =
values(sysb%gr%x(:, ip))
1980 regridding =>
regridding_t(sysb%gr, sysa%gr, sysa%space, sysa%namespace)
1981 call regridding%do_transfer(ff_b, ff_a_reference)
1982 safe_deallocate_p(regridding)
1985 do ip = 1, sysb%gr%np
1987 ff_b_reference(ip) =
m_zero
1990 diff_b(ip) = abs(ff_b_reference(ip) - ff_b(ip))
1993 norm_ff =
dmf_nrm2(sysb%gr, ff_b_reference)
1994 norm_diff =
dmf_nrm2(sysb%gr, diff_b)
1996 write(
message(1),
'(a, E14.6)')
"Forward: difference of reference to mapped function (rel.): ", &
2001 sysb%gr, ff_b_reference,
unit_one, ierr)
2005 sysa%gr, ff_a_reference,
unit_one, ierr)
2008 regridding =>
regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
2009 call regridding%do_transfer(ff_a, ff_b_reference)
2010 safe_deallocate_p(regridding)
2012 do ip = 1, sysa%gr%np
2014 ff_a_reference(ip) =
m_zero
2017 diff_a(ip) = abs(ff_a_reference(ip) - ff_a(ip))
2020 norm_ff =
dmf_nrm2(sysa%gr, ff_a_reference)
2021 norm_diff =
dmf_nrm2(sysa%gr, diff_a)
2023 write(
message(1),
'(a, E14.6)')
"Backward: difference of reference to mapped function (rel.): ", &
2028 sysa%gr, ff_a_reference,
unit_one, ierr)
2032 sysb%gr, ff_b_reference,
unit_one, ierr)
2034 safe_deallocate_a(ff_a)
2035 safe_deallocate_a(ff_a_reference)
2036 safe_deallocate_a(ff_b)
2037 safe_deallocate_a(ff_b_reference)
2038 safe_deallocate_a(diff_a)
2039 safe_deallocate_a(diff_b)
2040 safe_deallocate_p(sysa)
2041 safe_deallocate_p(sysb)
2047 real(real64) function values(xx)
2048 real(real64),
intent(in) :: xx(:)
2049 real(real64) :: xx0(1:size(xx, dim=1))
2050 real(real64),
parameter :: aa =
m_half
2051 real(real64),
parameter :: bb =
m_four
2055 values = bb *
exp(-aa*sum((xx-xx0)**2))
2065 type(namespace_t),
intent(in) :: namespace
2067 class(maxwell_t),
pointer :: maxwell_system
2069 real(real64),
allocatable :: magnetic_field(:,:)
2070 real(real64),
allocatable :: vector_potential_mag(:,:)
2071 real(real64),
allocatable :: vector_potential_analytical(:,:)
2072 real(real64),
allocatable :: delta(:,:)
2073 real(real64) :: exp_factor
2077 real(real64) :: sigma
2078 integer :: ip, j, ierr, nn
2079 integer(int64) :: out_how
2080 character(len=MAX_PATH_LEN) :: fname, fname2, fname3
2083 maxwell_system => maxwell_t(namespace)
2084 sigma = maxwell_system%gr%box%bounding_box_l(1)/10_real64
2085 call maxwell_system%init_parallelization(mpi_world)
2087 safe_allocate(magnetic_field(1:maxwell_system%gr%np_part, 1:3))
2088 safe_allocate(vector_potential_mag(1:maxwell_system%gr%np_part, 1:3))
2089 safe_allocate(vector_potential_analytical(1:maxwell_system%gr%np_part, 1:3))
2090 safe_allocate(delta(1:maxwell_system%gr%np, 1:3))
2103 call parse_variable(namespace,
'TestVectorPotentialType', option__testvectorpotentialtype__bounded, nn)
2106 case (option__testvectorpotentialtype__bounded)
2107 do ip = 1, maxwell_system%gr%np_part
2108 xx = maxwell_system%gr%x(1, ip)
2109 yy = maxwell_system%gr%x(2, ip)
2110 zz = maxwell_system%gr%x(3, ip)
2111 exp_factor =
exp((-xx**2 - yy**2 - zz**2)*1/(2*sigma**2))
2112 magnetic_field(ip, 1) = exp_factor*yy*(1 - (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
2113 magnetic_field(ip, 2) = exp_factor * xx * (1 + (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
2114 magnetic_field(ip, 3) = exp_factor * 2 * xx * yy * zz * 1/(3*sigma**2)
2116 vector_potential_analytical(ip, 1) = m_third * xx * zz * exp_factor
2117 vector_potential_analytical(ip, 2) = - m_third * yy * zz * exp_factor
2118 vector_potential_analytical(ip, 3) = m_third * (-xx**2 + yy**2) * exp_factor
2120 case (option__testvectorpotentialtype__unbounded)
2122 do ip = 1, maxwell_system%gr%np_part
2123 magnetic_field(ip, 1) = maxwell_system%gr%x(2, ip)
2124 magnetic_field(ip, 2) = maxwell_system%gr%x(1, ip)
2125 magnetic_field(ip, 3) = m_zero
2127 vector_potential_analytical(ip, 1) = m_third * maxwell_system%gr%x(1, ip) * maxwell_system%gr%x(3, ip)
2128 vector_potential_analytical(ip, 2) = - m_third * maxwell_system%gr%x(2, ip) * maxwell_system%gr%x(3, ip)
2129 vector_potential_analytical(ip, 3) = - m_third * (maxwell_system%gr%x(1, ip)**2 - maxwell_system%gr%x(2, ip)**2)
2132 call maxwell_system%helmholtz%get_vector_potential(namespace, vector_potential_mag, magnetic_field)
2136 do ip = 1, maxwell_system%gr%np
2137 delta(ip,j) = vector_potential_analytical(ip, j) - vector_potential_mag(ip, j)
2142 write(message(j),*)
'j, norm2(delta)', j, norm2(delta(:,j))
2144 call messages_info(3)
2146 write(fname,
'(a)')
'deviation_from_analytical_formulation'
2147 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, maxwell_system%space, maxwell_system%gr, &
2148 delta, unit_one, ierr)
2149 write(fname2,
'(a)')
'vector_potential_analytical'
2150 call io_function_output_vector(out_how ,
'./' , trim(fname2), namespace, maxwell_system%space, maxwell_system%gr, &
2151 vector_potential_analytical, unit_one, ierr)
2152 write(fname3,
'(a)')
'vector_potential_mag'
2153 call io_function_output_vector(out_how ,
'./' , trim(fname3), namespace, maxwell_system%space, maxwell_system%gr, &
2154 vector_potential_mag, unit_one, ierr)
2156 safe_deallocate_a(magnetic_field)
2157 safe_deallocate_a(vector_potential_mag)
2158 safe_deallocate_a(vector_potential_analytical)
2159 safe_deallocate_a(delta)
2160 safe_deallocate_p(maxwell_system)
2166 type(multigrid_t),
intent(in) :: mgrid
2167 class(space_t),
intent(in) :: space
2169 real(real64),
allocatable :: guess0(:), res0(:), guess1(:)
2170 type(mesh_t),
pointer :: mesh0, mesh1
2171 real(real64) :: delta, xx(3,2), alpha, beta, rr
2172 integer :: nn, ip, ierr
2176 message(1) =
'Info: Testing the grid interpolation.'
2178 call messages_info(2)
2180 mesh0 => mgrid%level(0)%mesh
2181 mesh1 => mgrid%level(1)%mesh
2183 safe_allocate(guess0(1:mesh0%np_part))
2184 safe_allocate(res0(1:mesh0%np_part))
2185 safe_allocate(guess1(1:mesh1%np_part))
2187 alpha = m_four*mesh0%spacing(1)
2188 beta = m_one / (alpha**space%dim *
sqrt(m_pi)**space%dim)
2203 call mesh_r(mesh0, ip, rr, origin = xx(:, nn))
2204 guess0(ip) = guess0(ip) + (-1)**nn * beta*
exp(-(rr/alpha)**2)
2208 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_target", global_namespace, &
2209 space, mesh0, guess0, unit_one, ierr)
2210 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_target", global_namespace, &
2211 space, mesh0, guess0, unit_one, ierr)
2212 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_target", global_namespace, &
2213 space, mesh0, guess0, unit_one, ierr)
2220 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, injection)
2222 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2224 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_result", global_namespace, &
2225 space, mesh0, res0, unit_one, ierr)
2226 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_result", global_namespace, &
2227 space, mesh0, res0, unit_one, ierr)
2228 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_result", global_namespace, &
2229 space, mesh0, res0, unit_one, ierr)
2231 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2232 write(message(1),
'(a,e13.6)')
'Interpolation test (abs.) = ', delta
2238 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, fullweight)
2240 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2242 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"restriction_result", global_namespace, &
2243 space, mesh0, res0, unit_one, ierr)
2244 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"restriction_result", global_namespace, &
2245 space, mesh0, res0, unit_one, ierr)
2246 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"restriction_result", global_namespace, &
2247 space, mesh0, res0, unit_one, ierr)
2249 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2250 write(message(2),
'(a,e13.6)')
'Restriction test (abs.) = ', delta
2251 call messages_info(2)
2253 safe_deallocate_a(guess0)
2254 safe_deallocate_a(res0)
2255 safe_deallocate_a(guess1)
2263 type(namespace_t),
intent(in) :: namespace
2264 type(electrons_t),
pointer :: sys
2266 type(current_t) :: current
2267 character(len=MAX_PATH_LEN) :: fname
2268 integer :: ierr, ip, idir
2269 integer(int64) :: out_how
2270 real(real64),
allocatable :: current_para_ref(:,:), current_dia_ref(:,:), current_mag_ref(:,:), delta(:)
2271 real(real64) :: xx(3), rr, a0, mag_curr, sin_thet, sin_phi, cos_phi, vec_pot_slope
2272 complex(real64) :: alpha
2274 sys => electrons_t(namespace, int(option__calculationmode__dummy, int32))
2275 call sys%init_parallelization(mpi_world)
2277 alpha = (0.0_real64, 0.5_real64)
2279 vec_pot_slope = 0.4_real64
2281 call states_elec_allocate_wfns(sys%st, sys%gr, wfs_type = type_cmplx)
2284 call current_init(current, namespace)
2286 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st)
2288 safe_allocate(sys%hm%hm_base%vector_potential(1:3, 1:sys%gr%np))
2290 sys%hm%hm_base%vector_potential = m_zero
2291 do ip = 1, sys%gr%np
2292 xx = sys%gr%x(1:3, ip)
2293 sys%hm%hm_base%vector_potential(2, ip) = vec_pot_slope * xx(1) / p_c
2296 call states_elec_allocate_current(sys%st, sys%space, sys%gr)
2297 call density_calc(sys%st, sys%gr, sys%st%rho)
2299 call current_calculate(current, namespace, sys%gr, sys%hm, sys%space, sys%st)
2301 safe_allocate(current_para_ref(1:sys%gr%np,1:3))
2302 safe_allocate(current_dia_ref(1:sys%gr%np,1:3))
2303 safe_allocate(current_mag_ref(1:sys%gr%np,1:3))
2304 safe_allocate(delta(1:sys%gr%np))
2307 current_para_ref(:,:) = m_zero
2308 do ip = 1, sys%gr%np
2309 call mesh_r(sys%gr, ip, rr)
2310 xx = sys%gr%x(1:3, ip)
2311 if (rr > r_small)
then
2313 psi_1s(rr, a0) *
dr_psi_2s(rr, a0) ) * aimag(alpha) / (1 + abs(alpha)**2) * xx(1:3) / rr
2317 write(fname,
'(a)')
'current_para'
2318 out_how = io_function_fill_how(
"PlaneZ")
2319 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2320 sys%st%current_para(:,:,1), unit_one, ierr)
2322 write(fname,
'(a)')
'current_para-ref'
2323 out_how = io_function_fill_how(
"PlaneZ")
2324 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2325 current_para_ref(:,:), unit_one, ierr)
2329 delta(:) = current_para_ref(1:sys%gr%np, idir) - sys%st%current_para(1:sys%gr%np, idir, 1)
2330 write(message(idir),*)
'idir =',idir,
', norm2(delta paramagnetic)',norm2(delta)
2332 call messages_info(3)
2335 current_dia_ref(:,:) = m_zero
2336 do ip = 1, sys%gr%np
2337 call mesh_r(sys%gr, ip, rr)
2338 current_dia_ref(ip,1:3) = - sys%hm%hm_base%vector_potential(1:3,ip) *&
2342 write(fname,
'(a)')
'current_dia'
2343 out_how = io_function_fill_how(
"PlaneZ")
2344 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2345 sys%st%current_dia(:,:,1), unit_one, ierr)
2347 write(fname,
'(a)')
'current_dia-ref'
2348 out_how = io_function_fill_how(
"PlaneZ")
2349 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2350 current_dia_ref(:,:), unit_one, ierr)
2354 delta(:) = current_dia_ref(1:sys%gr%np, idir) - sys%st%current_dia(1:sys%gr%np, idir, 1)
2355 write(message(idir),*)
'idir =',idir,
', norm2(delta diamagnetic)',norm2(delta)
2357 call messages_info(3)
2360 call current_calculate_mag(sys%gr%der, sys%st)
2363 current_mag_ref(:,:) = m_zero
2364 do ip = 1, sys%gr%np
2365 call mesh_r(sys%gr, ip, rr)
2366 xx = sys%gr%x(1:3, ip)
2367 if (norm2(xx(1:2)) > r_small .and. rr > r_small)
then
2368 sin_thet = norm2(xx(1:2)) / rr
2369 sin_phi = xx(2) / norm2(xx(1:2))
2370 cos_phi = xx(1) / norm2(xx(1:2))
2374 current_mag_ref(ip,1) = m_half * mag_curr * sin_thet * sin_phi / (1+abs(alpha)**2)
2375 current_mag_ref(ip,2) = -m_half * mag_curr * sin_thet * cos_phi / (1+abs(alpha)**2)
2379 write(fname,
'(a)')
'current_mag'
2380 out_how = io_function_fill_how(
"PlaneZ")
2381 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2382 sys%st%current_mag(:,:,1), unit_one, ierr)
2384 write(fname,
'(a)')
'current_mag-ref'
2385 out_how = io_function_fill_how(
"PlaneZ")
2386 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2387 current_mag_ref(:,:), unit_one, ierr)
2391 delta(:) = current_mag_ref(1:sys%gr%np, idir) - sys%st%current_mag(1:sys%gr%np, idir, 1)
2392 write(message(idir),*)
'idir =',idir,
', norm2(delta magnetization)',norm2(delta)
2394 call messages_info(3)
2396 safe_deallocate_a(current_para_ref)
2397 safe_deallocate_a(current_dia_ref)
2398 safe_deallocate_a(current_mag_ref)
2399 safe_deallocate_a(delta)
2400 safe_deallocate_p(sys)
2406 class(batch_t),
intent(inout) :: psib
2407 class(mesh_t),
intent(in) :: mesh
2408 type(namespace_t),
intent(in) :: namespace
2409 complex(real64),
intent(in) :: alpha
2410 real(real64),
intent(in) :: a0
2412 complex(real64),
allocatable :: zff(:)
2419 safe_allocate(zff(1:mesh%np))
2420 if (type_is_complex(psib%type()))
then
2422 call mesh_r(mesh, ip, rr)
2424 call batch_set_state(psib, 1, mesh%np, zff)
2426 safe_deallocate_a(zff)
2428 write(message(1),*)
"States should be complex for the linear combination of hydrogenic states to work"
2429 call messages_info(1, namespace=namespace)
2436 real(real64),
intent(in) :: a0, rr
2437 complex(real64),
intent(in) :: alpha
2443 real(real64) function psi_1s(rr, a0)
2444 real(real64),
intent(in) :: a0, rr
2450 real(real64) function psi_2s(rr, a0)
2451 real(real64),
intent(in) :: a0, rr
2453 psi_2s =
sqrt(m_two) * a0**(-m_three/m_two) * (m_one - rr/(m_two * a0)) *
exp(-rr/(m_two * a0)) &
2454 / (m_two *
sqrt(m_pi))
2457 real(real64) function dr_psi_1s(rr, a0)
2458 real(real64),
intent(in) :: a0, rr
2463 real(real64) function dr_psi_2s(rr, a0)
2464 real(real64),
intent(in) :: a0, rr
2467 a0**(-m_five/m_two) *
exp(-rr/(m_two * a0)) / (
sqrt(m_two) * m_two *
sqrt(m_pi))
2472 type(namespace_t),
intent(in) :: namespace
2475 integer(int64) :: i, j, k
2476 integer(int64) :: dims(3)
2477 character(len=MAX_PATH_LEN) :: fname
2479 real(real64),
allocatable :: ff(:)
2489 call parse_variable(namespace,
'TestCSVFileName',
"", fname)
2491 message(1) =
"Attempting to probe "//trim(fname)
2492 call messages_info(1, namespace=namespace)
2494 call io_csv_get_info(fname, dims, ierr)
2496 message(1) =
"Probing successful."
2497 write(message(2),
'("found dimensions: ",3I20)') dims
2498 call messages_info(2, namespace=namespace)
2500 write(message(1),
'("Probing failed. ierr = ",I5)') ierr
2501 call messages_fatal(1, namespace=namespace)
2504 safe_allocate(ff(1:dims(1)*dims(2)*dims(3)))
2506 message(1) =
"Attempting to read "//trim(fname)
2507 call messages_info(1, namespace=namespace)
2509 call dread_csv(fname, dims(1)*dims(2)*dims(3), ff, ierr)
2511 message(1) =
"Reading successful."
2512 call messages_info(1, namespace=namespace)
2514 do k=1, min(4_int64, dims(3))
2515 do j=1, min(4_int64, dims(2))
2516 write(message(j),
'("data ",2I5, 1X, 4F8.2)') k, j, &
2517 (ff(i + dims(1)*(j-1) + dims(1)* dims(2)*(k-1)), i=1, min(4_int64, dims(1)))
2519 write(message(int(j, int32)),
'("")')
2520 call messages_info(int(j, int32), namespace=namespace)
2524 message(1) =
"Reading failed."
2525 call messages_fatal(1, namespace=namespace)
2528 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)
calculate the vector of dot-products of mesh functions between two batches
subroutine, public zmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public zmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public zmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public dmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public dmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
This module defines various routines, operating on mesh functions.
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()
type(mpi_grp_t), public mpi_world
subroutine, public test_mpiwrappers
This module handles the communicators for the various parallelization strategies.
subroutine, public multigrid_end(mgrid)
subroutine, public multigrid_init(mgrid, namespace, space, mesh, der, stencil, mc, nlevels)
type(namespace_t), public global_namespace
subroutine, public orbitalbasis_end(this)
subroutine, public zorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public dorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public orbitalbasis_init(this, namespace, periodic_dim)
subroutine, public dorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public zorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public orbitalset_update_phase(os, dim, kpt, kpoints, spin_polarized, vec_pot, vec_pot_var, kpt_max)
Build the phase correction to the global phase in case the orbital crosses the border of the simulato...
subroutine, public dorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public zorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public poisson_test(this, space, mesh, latt, namespace, repetitions)
This routine checks the Hartree solver selected in the input file by calculating numerically and anal...
subroutine, public preconditioner_end(this)
subroutine, public preconditioner_init(this, namespace, gr, mc, space)
subroutine, public zproject_psi_batch(mesh, bnd, pj, npj, dim, psib, ppsib)
To optimize the application of the non-local operator in parallel, the projectors are applied in step...
Implementation details for regridding.
This module implements a simple hash table for string valued keys and integer values using the C++ ST...
subroutine, public sihash_insert(h, key, val)
Insert a (key, val) pair into the hash table h.
subroutine, public sihash_init(h)
Initialize a hash table h with size entries. Since we use separate chaining, the number of entries in...
integer function, public sihash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
subroutine, public sihash_end(h)
Free a hash table.
This module is intended to contain "only mathematical" functions and procedures.
This module implements a simple hash table for string valued keys and integer values using the C++ ST...
subroutine, public sphash_init(h)
Initialize a hash table h with size entries. Since we use separate chaining, the number of entries in...
subroutine, public sphash_insert(h, key, val, clone)
Insert a (key, val) pair into the hash table h. If clone=.true., the object will be copied.
subroutine, public sphash_end(h)
Free a hash table.
class(*) function, pointer, public sphash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
pure logical function, public states_are_real(st)
subroutine, public zstates_elec_calc_orth_test(st, namespace, mesh, kpoints)
subroutine, public dstates_elec_calc_orth_test(st, namespace, mesh, kpoints)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public states_elec_deallocate_wfns(st)
Deallocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
Allocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public dsubspace_diag(this, namespace, mesh, st, hm, ik, eigenval, diff, nonortho)
Diagonalises the Hamiltonian in the subspace defined by the states.
subroutine, public zsubspace_diag(this, namespace, mesh, st, hm, ik, eigenval, diff, nonortho)
Diagonalises the Hamiltonian in the subspace defined by the states.
Integration tests for ISDF.
subroutine, public test_isdf(namespace, serial)
Set up an electron system, compute some optimal centroid positions, and use these to build a set of I...
subroutine, public test_weighted_kmeans(namespace)
Test weighted kmeans algorithm for a finite system.
This module implements a unit-test like runmode for Octopus.
real(real64) function psi_2s(rr, a0)
subroutine test_helmholtz_decomposition(namespace)
subroutine test_hartree(param, namespace)
subroutine test_derivatives(param, namespace)
subroutine test_subspace_diagonalization(param, namespace)
subroutine, public test_run(namespace)
Components and integration test runner.
subroutine test_density_calc(param, namespace)
real(real64) function psi_1s(rr, a0)
subroutine test_current_density(namespace)
Here we test the different contributions to the total electronic current density.
subroutine test_batch_set_gaussian(psib, mesh)
subroutine test_regridding(namespace)
subroutine test_sphash(namespace)
subroutine test_hamiltonian(param, namespace)
subroutine test_dense_eigensolver()
subroutine test_interpolation(param, namespace)
subroutine multigrid_test_interpolation(mgrid, space)
subroutine test_ion_interaction(namespace)
subroutine test_boundaries(param, namespace)
subroutine test_orthogonalization(param, namespace)
real(real64) function dr_psi_2s(rr, a0)
subroutine test_batch_ops(param, namespace)
complex(real64) function lc_hydrogen_state(rr, alpha, a0)
subroutine test_projector(param, namespace)
subroutine test_dft_u(param, namespace)
subroutine test_prints_info_batch(st, gr, psib, string)
subroutine test_composition_chebyshev(namespace)
Test the composition rule for Chebyshev polynomials.
real(real64) function dr_psi_1s(rr, a0)
subroutine test_linear_solver(namespace)
subroutine test_grid_interpolation()
subroutine set_hydrogen_states(psib, mesh, namespace, alpha, a0)
subroutine test_exponential(param, namespace)
subroutine test_csv_input(namespace)
subroutine test_vecpot_analytical(namespace)
Here, analytical formulation for vector potential and B field are used. Ref: Sangita Sen and Erik I....
type(type_t), public type_cmplx
logical pure function, public type_is_complex(this)
This module defines the unit system, used for input and output.
type(unit_t), public unit_one
some special units required for particular quantities
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
Class defining batches of mesh functions.
Overload default constructor.
Class describing the electron system.
Description of the grid, containing information on derivatives, stencil, and symmetries.
This class implements the iteration counter used by the multisystem algorithms. As any iteration coun...
Describes mesh distribution to nodes.
contains the information of the meshes and provides the transfer functions
The states_elec_t class contains all electronic wave functions.
batches of electronic states
subroutine write_clock(operation)
subroutine write_condition_result(condition, result)
real(real64) function values(xx)