49 use,
intrinsic :: iso_fortran_env
97 integer :: repetitions
98 integer :: min_blocksize
99 integer :: max_blocksize
103 real(real64) :: shift_aux
104 type(derivatives_t),
pointer :: der_aux => null()
105 type(preconditioner_t) :: prec_aux
113 type(namespace_t),
intent(in) :: namespace
115 type(test_parameters_t) :: param
186 call parse_variable(namespace,
'TestMode', option__testmode__hartree, test_mode)
203 call parse_variable(namespace,
'TestType', option__testtype__all, param%type)
204 if (param%type < 1 .or. param%type > 5)
then
222 call parse_variable(namespace,
'TestRepetitions', 1, param%repetitions)
235 call parse_variable(namespace,
'TestMinBlockSize', 1, param%min_blocksize)
248 call parse_variable(namespace,
'TestMaxBlockSize', 128, param%max_blocksize)
258 select case (test_mode)
259 case (option__testmode__hartree)
261 case (option__testmode__derivatives)
263 case (option__testmode__orthogonalization)
265 case (option__testmode__interpolation)
267 case (option__testmode__ion_interaction)
269 case (option__testmode__projector)
271 case (option__testmode__dft_u)
273 case (option__testmode__hamiltonian_apply)
275 case (option__testmode__density_calc)
277 case (option__testmode__exp_apply)
279 case (option__testmode__boundaries)
281 case (option__testmode__subspace_diag)
283 case (option__testmode__batch_ops)
285 case (option__testmode__clock)
287 case (option__testmode__linear_solver)
289 case (option__testmode__cgal)
291 case (option__testmode__dense_eigensolver)
293 case (option__testmode__grid_interpolation)
295 case (option__testmode__iihash)
297 case (option__testmode__sihash)
299 case (option__testmode__sphash)
301 case (option__testmode__mpiwrappers)
303 case (option__testmode__regridding)
305 case (option__testmode__helmholtz_decomposition)
307 case (option__testmode__vecpot_analytical)
309 case (option__testmode__current_density)
311 case (option__testmode__mixing_tests)
313 case (option__testmode__optimizers)
331 sys =>
electrons_t(namespace, generate_epot=.false.)
333 call poisson_test(sys%hm%psolver, sys%space, sys%gr, sys%ions%latt, namespace, param%repetitions)
334 safe_deallocate_p(sys)
351 sys =>
electrons_t(namespace, generate_epot=.false.)
354 call helmholtz%init(namespace, sys%gr, sys%mc, sys%space)
357 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Hertzian dipole test"
361 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Gaussian test"
363 call gaussian_test(helmholtz, sys%gr, sys%namespace, sys%space)
365 safe_deallocate_p(sys)
375 real(real64),
allocatable :: rho(:), x(:), center(:)
376 real(real64) :: rr, alpha, beta, res
379 real(real64),
parameter :: threshold = 1.e-7_real64
385 sys =>
electrons_t(namespace, generate_epot=.false.)
391 shift_aux = 0.25_real64
399 alpha =
m_four * sys%gr%spacing(1)
400 beta =
m_one / (alpha**sys%space%dim *
sqrt(
m_pi)**sys%space%dim)
402 safe_allocate(center(1:sys%space%dim))
405 safe_allocate(rho(1:sys%gr%np))
408 call mesh_r(sys%gr, ip, rr, origin = center(:))
409 rho(ip) = beta*
exp(-(rr/alpha)**2)
412 safe_allocate(x(1:sys%gr%np))
418 write(
message(1),
'(a,i6,a)')
"Info: CG converged with ", iter,
" iterations."
419 write(
message(2),
'(a,e14.6)')
"Info: The residue is ", res
420 write(
message(3),
'(a,e14.6)')
"Info: Norm solution CG ",
dmf_nrm2(sys%gr, x)
425 safe_deallocate_a(rho)
426 safe_deallocate_p(sys)
441 real(real64),
contiguous,
intent(in) :: x(:)
442 real(real64),
contiguous,
intent(out) :: Hx(:)
444 real(real64),
allocatable :: tmpx(:)
448 safe_allocate(tmpx(1:
mesh_aux%np_part))
453 safe_deallocate_a(tmpx)
468 complex(real64),
allocatable :: psi(:, :)
474 call messages_write(
'Info: Testing the nonlocal part of the pseudopotential with SOC')
479 sys =>
electrons_t(namespace, generate_epot=.false.)
488 call sys%st%group%psib(1, 1)%copy_to(epsib)
492 do itime = 1, param%repetitions
494 sys%hm%ep%natoms, 2, sys%st%group%psib(1, 1), epsib)
497 safe_allocate(psi(1:sys%gr%np, 1:sys%st%d%dim))
498 do itime = 1, epsib%nst
500 write(
message(1),
'(a,i1,3x, f12.6)')
"Norm state ", itime,
zmf_nrm2(sys%gr, 2, psi)
503 safe_deallocate_a(psi)
507 safe_deallocate_p(sys)
519 integer :: itime, ist
521 real(real64),
allocatable :: ddot(:,:,:), dweight(:,:)
522 complex(real64),
allocatable :: zdot(:,:,:), zweight(:,:)
535 sys =>
electrons_t(namespace, generate_epot=.false.)
540 if (sys%st%pack_states)
call sys%st%pack()
542 call sys%st%group%psib(1, 1)%copy_to(epsib2, copy_data = .
true.)
545 if (.not. sys%hm%phase%is_allocated())
then
546 call sys%st%group%psib(1, 1)%copy_to(epsib, copy_data = .
true.)
548 call sys%st%group%psib(1, 1)%copy_to(epsib)
549 call sys%hm%phase%apply_to(sys%gr, sys%gr%np, &
550 .false., epsib, src=sys%st%group%psib(1, 1))
551 epsib2%has_phase = .
true.
557 call dorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
558 sys%hm%phase%is_allocated(), .false., .false.)
559 safe_allocate(dweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
560 safe_allocate(ddot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
562 call zorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
563 sys%hm%phase%is_allocated(), .false., .false.)
565 safe_allocate(zweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
566 safe_allocate(zdot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
569 if (sys%hm%phase%is_allocated())
then
575 do itime = 1, param%repetitions
590 if (epsib%is_packed())
then
591 call epsib%do_unpack(force = .
true.)
594 do ist = 1, epsib%nst
596 write(
message(1),
'(a,i2,3x,e13.6)')
"Dotp state ", ist, ddot(1,1,ist)
598 write(
message(1),
'(a,i2,2(3x,e13.6))')
"Dotp state ", ist, zdot(1,1,ist)
606 safe_deallocate_a(dweight)
607 safe_deallocate_a(zweight)
608 safe_deallocate_a(ddot)
609 safe_deallocate_a(zdot)
615 safe_deallocate_p(sys)
627 integer :: itime, terms
646 call parse_variable(namespace,
'TestHamiltonianApply', option__testhamiltonianapply__term_all, terms)
647 if (terms == 0) terms = huge(1)
652 call messages_write(
'Info: Testing the application of the Hamiltonian')
657 sys =>
electrons_t(namespace, generate_epot=.false.)
664 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
667 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
669 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
671 call sys%st%group%psib(1, 1)%copy_to(hpsib)
673 if (sys%hm%apply_packed())
then
674 call sys%st%group%psib(1, 1)%do_pack()
675 call hpsib%do_pack(copy = .false.)
678 do itime = 1, param%repetitions
688 if (hpsib%is_packed())
then
689 call hpsib%do_unpack(force = .
true.)
694 call hpsib%end(copy = .false.)
696 safe_deallocate_p(sys)
719 sys =>
electrons_t(namespace, generate_epot=.false.)
724 if (sys%st%pack_states)
call sys%st%pack()
726 do itime = 1, param%repetitions
730 write(
message(1),
'(a,3x, f12.6)')
"Norm density ",
dmf_nrm2(sys%gr, sys%st%rho(:,1))
734 safe_deallocate_p(sys)
757 sys =>
electrons_t(namespace, generate_epot=.false.)
762 if (sys%st%pack_states)
call sys%st%pack()
764 do itime = 1, param%repetitions
765 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
771 safe_deallocate_p(sys)
795 sys =>
electrons_t(namespace, generate_epot=.false.)
802 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
805 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
809 if (sys%hm%apply_packed())
then
810 call sys%st%group%psib(1, 1)%do_pack()
813 do itime = 1, param%repetitions
814 call te%apply_batch(sys%namespace, sys%gr, sys%hm, sys%st%group%psib(1, 1), 1e-3_real64)
820 safe_deallocate_p(sys)
834 real(real64),
allocatable :: diff(:)
845 sys =>
electrons_t(namespace, generate_epot=.false.)
851 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
854 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
856 call sdiag%init(sys%namespace, sys%st)
858 safe_allocate(diff(1:sys%st%nst))
860 do itime = 1, param%repetitions
862 call dsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
864 call zsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
868 safe_deallocate_a(diff)
873 safe_deallocate_p(sys)
885 integer :: itime, ops, ops_default, ist, jst, nst
887 real(real64),
allocatable :: tmp(:)
888 real(real64),
allocatable :: ddotv(:)
889 complex(real64),
allocatable :: zdotv(:)
890 real(real64),
allocatable :: ddot(:,:)
891 complex(real64),
allocatable :: zdot(:,:)
916 option__testbatchops__ops_axpy + &
917 option__testbatchops__ops_scal + &
918 option__testbatchops__ops_nrm2 + &
919 option__testbatchops__ops_dotp_matrix + &
920 option__testbatchops__ops_dotp_self + &
921 option__testbatchops__ops_dotp_vector
932 sys =>
electrons_t(namespace, generate_epot=.false.)
937 if (sys%st%pack_states)
call sys%st%pack()
939 if (
bitand(ops, option__testbatchops__ops_axpy) /= 0)
then
940 message(1) =
'Info: Testing axpy'
943 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
944 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
946 do itime = 1, param%repetitions
947 call batch_axpy(sys%gr%np, 0.1_real64, xx, yy)
955 if (
bitand(ops, option__testbatchops__ops_scal) /= 0)
then
956 message(1) =
'Info: Testing scal'
959 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
960 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
962 do itime = 1, param%repetitions
971 if (
bitand(ops, option__testbatchops__ops_nrm2) /= 0)
then
972 message(1) =
'Info: Testing nrm2'
975 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
976 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
978 safe_allocate(tmp(1:xx%nst))
980 do itime = 1, param%repetitions
984 write(
message(1),
'(a,i1,3x,e23.16)')
"Nrm2 norm state ", itime, tmp(itime)
988 safe_deallocate_a(tmp)
994 if (
bitand(ops, option__testbatchops__ops_dotp_matrix) /= 0)
then
996 message(1) =
'Info: Testing dotp_matrix'
999 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1000 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1002 nst = sys%st%group%psib(1, 1)%nst
1005 safe_allocate(ddot(1:nst, 1:nst))
1006 do itime = 1, param%repetitions
1012 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_matrix states', ist, jst, ddot(ist,jst)
1016 safe_deallocate_a(ddot)
1018 safe_allocate(zdot(1:nst, 1:nst))
1019 do itime = 1, param%repetitions
1025 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_matrix states', ist, jst, zdot(ist,jst)
1029 safe_deallocate_a(zdot)
1036 if (
bitand(ops, option__testbatchops__ops_dotp_vector) /= 0)
then
1038 message(1) =
'Info: Testing dotp_vector'
1041 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1042 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1044 nst = sys%st%group%psib(1, 1)%nst
1047 safe_allocate(ddotv(1:nst))
1048 do itime = 1, param%repetitions
1053 write(
message(ist),
'(a,i3,3x,e23.16)')
'Dotp_vector state', ist, ddotv(ist)
1056 safe_deallocate_a(ddotv)
1058 safe_allocate(zdotv(1:nst))
1059 do itime = 1, param%repetitions
1064 write(
message(ist),
'(a,i3,3x,2(e23.16,1x))')
'Dotp_vector state', ist, zdotv(ist)
1067 safe_deallocate_a(zdotv)
1074 if (
bitand(ops, option__testbatchops__ops_dotp_self) /= 0)
then
1076 message(1) =
'Info: Testing dotp_self'
1079 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1081 nst = sys%st%group%psib(1, 1)%nst
1084 safe_allocate(ddot(1:nst, 1:nst))
1085 do itime = 1, param%repetitions
1091 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_self states', ist, jst, ddot(ist,jst)
1095 safe_deallocate_a(ddot)
1097 safe_allocate(zdot(1:nst, 1:nst))
1098 do itime = 1, param%repetitions
1104 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_self states', ist, jst, zdot(ist,jst)
1108 safe_deallocate_a(zdot)
1115 safe_deallocate_p(sys)
1129 sys =>
electrons_t(namespace, generate_epot=.false.)
1130 call sys%init_parallelization(
mpi_world)
1132 message(1) =
'Info: Testing the finite-differences derivatives.'
1136 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1137 call dderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1140 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1141 call zderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1144 safe_deallocate_p(sys)
1163 sys =>
electrons_t(namespace, generate_epot=.false.)
1164 call sys%init_parallelization(
mpi_world)
1166 message(1) =
'Info: Testing orthogonalization.'
1170 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1171 message(1) =
'Info: Real wave-functions.'
1173 do itime = 1, param%repetitions
1178 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1179 message(1) =
'Info: Complex wave-functions.'
1181 do itime = 1, param%repetitions
1186 safe_deallocate_p(sys)
1201 sys =>
electrons_t(namespace, generate_epot=.false.)
1202 call sys%init_parallelization(
mpi_world)
1204 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1213 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1215 call messages_write(
'Info: Testing complex interpolation routines')
1223 safe_deallocate_p(sys)
1238 sys =>
electrons_t(namespace, generate_epot=.false.)
1239 call sys%init_parallelization(
mpi_world)
1241 call ion_interaction_test(sys%space, sys%ions%latt, sys%ions%atom, sys%ions%natoms, sys%ions%pos, &
1242 sys%gr%box%bounding_box_l, namespace, sys%mc)
1244 safe_deallocate_p(sys)
1253 type(
grid_t),
intent(in) :: gr
1254 class(
batch_t),
intent(inout) :: psib
1255 character(*),
optional,
intent(in) :: string
1258 complex(real64),
allocatable :: zpsi(:, :)
1259 real(real64),
allocatable :: dpsi(:, :)
1261 character(80) :: string_
1268 safe_allocate(dpsi(1:gr%np, 1:st%d%dim))
1270 safe_allocate(zpsi(1:gr%np, 1:st%d%dim))
1273 do itime = 1, psib%nst
1276 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
dmf_nrm2(gr, st%d%dim, dpsi)
1279 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
zmf_nrm2(gr, st%d%dim, zpsi)
1285 safe_deallocate_a(dpsi)
1287 safe_deallocate_a(zpsi)
1303 write(
message(1),
'(a)')
" Operation Counter Time Global step"
1318 call clock%set(
clock_t(time_step=
m_four, initial_iteration=1))
1322 write(
message(1),
'(a)')
" Clock comparisons:"
1325 other_clock =
clock_t(time_step=
m_one, initial_iteration=5)
1337 character(len=*),
intent(in) :: operation
1339 write(
message(1),
'(a17,x,i6,x,f10.1,x,i16)') operation, clock%counter(), clock%value(), clock%global_step()
1344 character(len=*),
intent(in) :: condition
1345 logical,
intent(in) :: result
1347 write(
message(1),
'(a10," = ",i1," (",l1,")")') condition, abs(transfer(result, 0)), result
1364 message(1) =
"cgal_polyhedron_point_inside"
1376 integer :: N, ii, jj, N_list(4), i_N
1377 real(real64),
allocatable :: matrix(:, :), eigenvectors(:, :), eigenvalues(:), test(:)
1378 real(real64),
allocatable :: differences(:)
1382 n_list = [15, 32, 100, 500]
1386 safe_allocate(matrix(1:n, 1:n))
1387 safe_allocate(eigenvectors(1:n, 1:n))
1388 safe_allocate(eigenvalues(1:n))
1389 safe_allocate(test(1:n))
1390 safe_allocate(differences(1:n))
1396 matrix(ii, jj) = ii * jj
1401 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1405 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1406 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1408 write(
message(1),
"(A, I3, A, E13.6)")
"Parallel solver - N: ", n, &
1409 ", average difference: ", sum(differences)/n
1413 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1417 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1418 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1420 write(
message(1),
"(A, I3, A, E13.6)")
"Serial solver - N: ", n, &
1421 ", average difference: ", sum(differences)/n
1424 safe_deallocate_a(matrix)
1425 safe_deallocate_a(eigenvectors)
1426 safe_deallocate_a(eigenvalues)
1427 safe_deallocate_a(test)
1428 safe_deallocate_a(differences)
1435 class(
batch_t),
intent(inout) :: psib
1438 real(real64),
allocatable :: dff(:)
1439 complex(real64),
allocatable :: zff(:)
1441 real(real64) :: da, db, dc
1442 complex(real64) :: za, zb, zc
1447 da =
m_one/mesh%box%bounding_box_l(1)
1453 za = da +
m_zi*0.01_real64
1454 zb = db*
exp(
m_zi*0.345_real64)
1455 zc = dc -
m_zi*50.0_real64
1457 safe_allocate(zff(1:mesh%np))
1458 do ist = 1, psib%nst_linear
1462 zff(ip) = zb*
exp(-za*sum(mesh%x(ip, :)**2)) + zc
1467 safe_deallocate_a(zff)
1469 safe_allocate(dff(1:mesh%np))
1470 do ist = 1, psib%nst_linear
1474 dff(ip) = db*
exp(-da*sum(mesh%x(ip, :)**2)) + dc
1479 safe_deallocate_a(dff)
1493 call sys%init_parallelization(
mpi_world)
1496 sys%gr%stencil, sys%mc, nlevels=3)
1502 safe_deallocate_p(sys)
1518 write(
message(1),*)
'hash[1] :', found,
value
1522 write(
message(1),*)
'hash[2] :', found,
value
1526 write(
message(1),*)
'hash[3] :', found,
value
1538 integer ::
value, sum
1547 write(
message(1),*)
'hash["one"]: ', found,
value
1551 write(
message(1),*)
'hash["two"]: ', found,
value
1555 write(
message(1),*)
'hash["three"]: ', found,
value
1562 do while (it%has_next())
1563 value = it%get_next()
1565 write(
message(1),
'(I3,A,I5)') counter,
': hash[...] = ',
value
1567 counter = counter + 1
1569 write(
message(1),*)
'counter = ', counter
1570 write(
message(2),*)
'sum = ', sum
1592 class(*),
pointer :: value
1594 integer :: count_clock, count_space
1596 safe_allocate(clock_2)
1610 write(
message(1),*)
'hash["one"]: ', found,
value%counter()
1613 write(
message(1),*)
'hash["one"]: ', found,
value%short_info()
1616 write(
message(1),*)
'wrong type. found = ', found
1623 write(
message(1),*)
'hash["two"]: ', found,
value%counter()
1626 write(
message(1),*)
'hash["two"]: ', found,
value%short_info()
1629 write(
message(1),*)
'wrong type. found = ',found
1633 safe_deallocate_a(clock_2)
1638 write(
message(1),*)
'hash["three"]: ', found,
value%counter()
1641 write(
message(1),*)
'hash["three"]: ', found,
value%short_info()
1644 write(
message(1),*)
'wrong type. found = ',found
1653 do while (it%has_next())
1654 value => it%get_next()
1657 count_clock = count_clock + 1
1659 count_space = count_space + 1
1663 write(
message(1), *)
'Count_clock = ', count_clock
1664 write(
message(2), *)
'Count_space = ', count_space
1677 real(real64),
allocatable :: ff_A(:), ff_A_reference(:), ff_B(:), ff_B_reference(:), diff_A(:), diff_B(:)
1678 real(real64) :: norm_ff, norm_diff
1687 call sysa%init_parallelization(
mpi_world)
1688 call sysb%init_parallelization(
mpi_world)
1691 safe_allocate(ff_a(1:sysa%gr%np))
1692 safe_allocate(ff_a_reference(1:sysa%gr%np))
1693 safe_allocate(diff_a(1:sysa%gr%np))
1694 safe_allocate(ff_b(1:sysb%gr%np))
1695 safe_allocate(ff_b_reference(1:sysb%gr%np))
1696 safe_allocate(diff_b(1:sysb%gr%np))
1698 do ip = 1, sysa%gr%np
1699 ff_a_reference(ip) =
values(sysa%gr%x(ip, :))
1701 do ip = 1, sysb%gr%np
1702 ff_b_reference(ip) =
values(sysb%gr%x(ip, :))
1706 regridding =>
regridding_t(sysb%gr, sysa%gr, sysa%space, sysa%namespace)
1707 call regridding%do_transfer(ff_b, ff_a_reference)
1708 safe_deallocate_p(regridding)
1711 do ip = 1, sysb%gr%np
1713 ff_b_reference(ip) =
m_zero
1716 diff_b(ip) = abs(ff_b_reference(ip) - ff_b(ip))
1719 norm_ff =
dmf_nrm2(sysb%gr, ff_b_reference)
1720 norm_diff =
dmf_nrm2(sysb%gr, diff_b)
1722 write(
message(1),
'(a, E14.6)')
"Forward: difference of reference to mapped function (rel.): ", &
1727 sysb%gr, ff_b_reference,
unit_one, ierr)
1731 sysa%gr, ff_a_reference,
unit_one, ierr)
1734 regridding =>
regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
1735 call regridding%do_transfer(ff_a, ff_b_reference)
1736 safe_deallocate_p(regridding)
1738 do ip = 1, sysa%gr%np
1740 ff_a_reference(ip) =
m_zero
1743 diff_a(ip) = abs(ff_a_reference(ip) - ff_a(ip))
1746 norm_ff =
dmf_nrm2(sysa%gr, ff_a_reference)
1747 norm_diff =
dmf_nrm2(sysa%gr, diff_a)
1749 write(
message(1),
'(a, E14.6)')
"Backward: difference of reference to mapped function (rel.): ", &
1754 sysa%gr, ff_a_reference,
unit_one, ierr)
1758 sysb%gr, ff_b_reference,
unit_one, ierr)
1760 safe_deallocate_a(ff_a)
1761 safe_deallocate_a(ff_a_reference)
1762 safe_deallocate_a(ff_b)
1763 safe_deallocate_a(ff_b_reference)
1764 safe_deallocate_a(diff_a)
1765 safe_deallocate_a(diff_b)
1766 safe_deallocate_p(sysa)
1767 safe_deallocate_p(sysb)
1773 real(real64) function values(xx)
1774 real(real64),
intent(in) :: xx(:)
1775 real(real64) :: xx0(1:size(xx, dim=1))
1776 real(real64),
parameter :: aa =
m_half
1777 real(real64),
parameter :: bb =
m_four
1781 values = bb *
exp(-aa*sum((xx-xx0)**2))
1791 type(namespace_t),
intent(in) :: namespace
1793 class(maxwell_t),
pointer :: maxwell_system
1795 real(real64),
allocatable :: magnetic_field(:,:)
1796 real(real64),
allocatable :: vector_potential_mag(:,:)
1797 real(real64),
allocatable :: vector_potential_analytical(:,:)
1798 real(real64),
allocatable :: delta(:,:)
1799 real(real64) :: exp_factor
1803 real(real64) :: sigma
1804 integer :: ip, j, ierr, nn
1805 integer(int64) :: out_how
1806 character(len=MAX_PATH_LEN) :: fname, fname2, fname3
1809 maxwell_system => maxwell_t(namespace)
1810 sigma = maxwell_system%gr%box%bounding_box_l(1)/10_real64
1811 call maxwell_system%init_parallelization(mpi_world)
1813 safe_allocate(magnetic_field(1:maxwell_system%gr%np_part, 1:3))
1814 safe_allocate(vector_potential_mag(1:maxwell_system%gr%np_part, 1:3))
1815 safe_allocate(vector_potential_analytical(1:maxwell_system%gr%np_part, 1:3))
1816 safe_allocate(delta(1:maxwell_system%gr%np, 1:3))
1829 call parse_variable(namespace,
'TestVectorPotentialType', option__testvectorpotentialtype__bounded, nn)
1832 case (option__testvectorpotentialtype__bounded)
1833 do ip = 1, maxwell_system%gr%np_part
1834 xx = maxwell_system%gr%x(ip, 1)
1835 yy = maxwell_system%gr%x(ip, 2)
1836 zz = maxwell_system%gr%x(ip, 3)
1837 exp_factor =
exp((-xx**2 - yy**2 - zz**2)*1/(2*sigma**2))
1838 magnetic_field(ip, 1) = exp_factor*yy*(1 - (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
1839 magnetic_field(ip, 2) = exp_factor * xx * (1 + (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
1840 magnetic_field(ip, 3) = exp_factor * 2 * xx * yy * zz * 1/(3*sigma**2)
1842 vector_potential_analytical(ip, 1) = m_third * xx * zz * exp_factor
1843 vector_potential_analytical(ip, 2) = - m_third * yy * zz * exp_factor
1844 vector_potential_analytical(ip, 3) = m_third * (-xx**2 + yy**2) * exp_factor
1846 case (option__testvectorpotentialtype__unbounded)
1847 do ip = 1, maxwell_system%gr%np_part
1848 magnetic_field(ip, 1) = maxwell_system%gr%x(ip, 2)
1849 magnetic_field(ip, 2) = maxwell_system%gr%x(ip, 1)
1850 magnetic_field(ip, 3) = m_zero
1852 vector_potential_analytical(ip, 1) = m_third * maxwell_system%gr%x(ip, 1) * maxwell_system%gr%x(ip, 3)
1853 vector_potential_analytical(ip, 2) = - m_third * maxwell_system%gr%x(ip, 2) * maxwell_system%gr%x(ip, 3)
1854 vector_potential_analytical(ip, 3) = - m_third * (maxwell_system%gr%x(ip, 1)**2 - maxwell_system%gr%x(ip, 2)**2)
1857 call maxwell_system%helmholtz%get_vector_potential(namespace, vector_potential_mag, magnetic_field)
1861 do ip = 1, maxwell_system%gr%np
1862 delta(ip,j) = vector_potential_analytical(ip, j) - vector_potential_mag(ip, j)
1867 write(message(j),*)
'j, norm2(delta)', j, norm2(delta(:,j))
1869 call messages_info(3)
1871 write(fname,
'(a)')
'deviation_from_analytical_formulation'
1872 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, maxwell_system%space, maxwell_system%gr, &
1873 delta, unit_one, ierr)
1874 write(fname2,
'(a)')
'vector_potential_analytical'
1875 call io_function_output_vector(out_how ,
'./' , trim(fname2), namespace, maxwell_system%space, maxwell_system%gr, &
1876 vector_potential_analytical, unit_one, ierr)
1877 write(fname3,
'(a)')
'vector_potential_mag'
1878 call io_function_output_vector(out_how ,
'./' , trim(fname3), namespace, maxwell_system%space, maxwell_system%gr, &
1879 vector_potential_mag, unit_one, ierr)
1881 safe_deallocate_a(magnetic_field)
1882 safe_deallocate_a(vector_potential_mag)
1883 safe_deallocate_a(vector_potential_analytical)
1884 safe_deallocate_a(delta)
1885 safe_deallocate_p(maxwell_system)
1891 type(multigrid_t),
intent(in) :: mgrid
1892 class(space_t),
intent(in) :: space
1894 real(real64),
allocatable :: guess0(:), res0(:), guess1(:)
1895 type(mesh_t),
pointer :: mesh0, mesh1
1896 real(real64) :: delta, xx(3,2), alpha, beta, rr
1897 integer :: nn, ip, ierr
1901 message(1) =
'Info: Testing the grid interpolation.'
1903 call messages_info(2)
1905 mesh0 => mgrid%level(0)%mesh
1906 mesh1 => mgrid%level(1)%mesh
1908 safe_allocate(guess0(1:mesh0%np_part))
1909 safe_allocate(res0(1:mesh0%np_part))
1910 safe_allocate(guess1(1:mesh1%np_part))
1912 alpha = m_four*mesh0%spacing(1)
1913 beta = m_one / (alpha**space%dim *
sqrt(m_pi)**space%dim)
1928 call mesh_r(mesh0, ip, rr, origin = xx(:, nn))
1929 guess0(ip) = guess0(ip) + (-1)**nn * beta*
exp(-(rr/alpha)**2)
1933 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_target", global_namespace, &
1934 space, mesh0, guess0, unit_one, ierr)
1935 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_target", global_namespace, &
1936 space, mesh0, guess0, unit_one, ierr)
1937 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_target", global_namespace, &
1938 space, mesh0, guess0, unit_one, ierr)
1945 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, injection)
1947 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
1949 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_result", global_namespace, &
1950 space, mesh0, res0, unit_one, ierr)
1951 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_result", global_namespace, &
1952 space, mesh0, res0, unit_one, ierr)
1953 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_result", global_namespace, &
1954 space, mesh0, res0, unit_one, ierr)
1956 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
1957 write(message(1),
'(a,e13.6)')
'Interpolation test (abs.) = ', delta
1963 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, fullweight)
1965 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
1967 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"restriction_result", global_namespace, &
1968 space, mesh0, res0, unit_one, ierr)
1969 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"restriction_result", global_namespace, &
1970 space, mesh0, res0, unit_one, ierr)
1971 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"restriction_result", global_namespace, &
1972 space, mesh0, res0, unit_one, ierr)
1974 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
1975 write(message(2),
'(a,e13.6)')
'Restriction test (abs.) = ', delta
1976 call messages_info(2)
1978 safe_deallocate_a(guess0)
1979 safe_deallocate_a(res0)
1980 safe_deallocate_a(guess1)
1988 type(namespace_t),
intent(in) :: namespace
1989 type(electrons_t),
pointer :: sys
1991 type(current_t) :: current
1992 character(len=MAX_PATH_LEN) :: fname
1993 integer :: ierr, ip, idir
1994 integer(int64) :: out_how
1995 real(real64),
allocatable :: current_para_ref(:,:), current_dia_ref(:,:), current_mag_ref(:,:), delta(:)
1996 real(real64) :: xx(3), rr, a0, mag_curr, sin_thet, sin_phi, cos_phi, vec_pot_slope
1997 complex(real64) :: alpha
1999 sys => electrons_t(namespace, generate_epot=.false.)
2000 call sys%init_parallelization(mpi_world)
2002 alpha = (0.0_real64, 0.5_real64)
2004 vec_pot_slope = 0.4_real64
2006 call states_elec_allocate_wfns(sys%st, sys%gr, wfs_type = type_cmplx)
2009 call current_init(current, namespace)
2011 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st)
2013 safe_allocate(sys%hm%hm_base%vector_potential(1:3, 1:sys%gr%np))
2015 sys%hm%hm_base%vector_potential = m_zero
2016 do ip = 1, sys%gr%np
2017 xx = sys%gr%x(ip, 1:3)
2018 sys%hm%hm_base%vector_potential(2, ip) = vec_pot_slope * xx(1) / p_c
2021 call states_elec_allocate_current(sys%st, sys%space, sys%gr)
2022 call density_calc(sys%st, sys%gr, sys%st%rho)
2024 call current_calculate(current, namespace, sys%gr, sys%hm, sys%space, sys%st)
2026 safe_allocate(current_para_ref(1:sys%gr%np,1:3))
2027 safe_allocate(current_dia_ref(1:sys%gr%np,1:3))
2028 safe_allocate(current_mag_ref(1:sys%gr%np,1:3))
2029 safe_allocate(delta(1:sys%gr%np))
2032 current_para_ref(:,:) = m_zero
2033 do ip = 1, sys%gr%np
2034 call mesh_r(sys%gr, ip, rr)
2035 xx = sys%gr%x(ip, 1:3)
2036 if (rr > r_small)
then
2038 psi_1s(rr, a0) *
dr_psi_2s(rr, a0) ) * imag(alpha) / (1 + abs(alpha)**2) * xx(1:3) / rr
2042 write(fname,
'(a)')
'current_para'
2043 out_how = io_function_fill_how(
"PlaneZ")
2044 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2045 sys%st%current_para(:,:,1), unit_one, ierr)
2047 write(fname,
'(a)')
'current_para-ref'
2048 out_how = io_function_fill_how(
"PlaneZ")
2049 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2050 current_para_ref(:,:), unit_one, ierr)
2054 delta(:) = current_para_ref(1:sys%gr%np, idir) - sys%st%current_para(1:sys%gr%np, idir, 1)
2055 write(message(idir),*)
'idir =',idir,
', norm2(delta paramagnetic)',norm2(delta)
2057 call messages_info(3)
2060 current_dia_ref(:,:) = m_zero
2061 do ip = 1, sys%gr%np
2062 call mesh_r(sys%gr, ip, rr)
2063 current_dia_ref(ip,1:3) = - sys%hm%hm_base%vector_potential(1:3,ip) *&
2067 write(fname,
'(a)')
'current_dia'
2068 out_how = io_function_fill_how(
"PlaneZ")
2069 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2070 sys%st%current_dia(:,:,1), unit_one, ierr)
2072 write(fname,
'(a)')
'current_dia-ref'
2073 out_how = io_function_fill_how(
"PlaneZ")
2074 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2075 current_dia_ref(:,:), unit_one, ierr)
2079 delta(:) = current_dia_ref(1:sys%gr%np, idir) - sys%st%current_dia(1:sys%gr%np, idir, 1)
2080 write(message(idir),*)
'idir =',idir,
', norm2(delta diamagnetic)',norm2(delta)
2082 call messages_info(3)
2085 call current_calculate_mag(sys%gr%der, sys%st)
2088 current_mag_ref(:,:) = m_zero
2089 do ip = 1, sys%gr%np
2090 call mesh_r(sys%gr, ip, rr)
2091 xx = sys%gr%x(ip, 1:3)
2092 if (norm2(xx(1:2)) > r_small .and. rr > r_small)
then
2093 sin_thet = norm2(xx(1:2)) / rr
2094 sin_phi = xx(2) / norm2(xx(1:2))
2095 cos_phi = xx(1) / norm2(xx(1:2))
2099 current_mag_ref(ip,1) = m_half * mag_curr * sin_thet * sin_phi / (1+abs(alpha)**2)
2100 current_mag_ref(ip,2) = -m_half * mag_curr * sin_thet * cos_phi / (1+abs(alpha)**2)
2104 write(fname,
'(a)')
'current_mag'
2105 out_how = io_function_fill_how(
"PlaneZ")
2106 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2107 sys%st%current_mag(:,:,1), unit_one, ierr)
2109 write(fname,
'(a)')
'current_mag-ref'
2110 out_how = io_function_fill_how(
"PlaneZ")
2111 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2112 current_mag_ref(:,:), unit_one, ierr)
2116 delta(:) = current_mag_ref(1:sys%gr%np, idir) - sys%st%current_mag(1:sys%gr%np, idir, 1)
2117 write(message(idir),*)
'idir =',idir,
', norm2(delta magnetization)',norm2(delta)
2119 call messages_info(3)
2121 safe_deallocate_a(current_para_ref)
2122 safe_deallocate_a(current_dia_ref)
2123 safe_deallocate_a(current_mag_ref)
2124 safe_deallocate_a(delta)
2125 safe_deallocate_p(sys)
2131 class(batch_t),
intent(inout) :: psib
2132 class(mesh_t),
intent(in) :: mesh
2133 type(namespace_t),
intent(in) :: namespace
2134 complex(real64),
intent(in) :: alpha
2135 real(real64),
intent(in) :: a0
2137 complex(real64),
allocatable :: zff(:)
2144 safe_allocate(zff(1:mesh%np))
2145 if (type_is_complex(psib%type()))
then
2147 call mesh_r(mesh, ip, rr)
2149 call batch_set_state(psib, 1, mesh%np, zff)
2151 safe_deallocate_a(zff)
2153 write(message(1),*)
"States should be complex for the linear combination of hydrogenic states to work"
2154 call messages_info(1, namespace=namespace)
2161 real(real64),
intent(in) :: a0, rr
2162 complex(real64),
intent(in) :: alpha
2168 real(real64) function psi_1s(rr, a0)
2169 real(real64),
intent(in) :: a0, rr
2175 real(real64) function psi_2s(rr, a0)
2176 real(real64),
intent(in) :: a0, rr
2178 psi_2s =
sqrt(m_two) * a0**(-m_three/m_two) * (m_one - rr/(m_two * a0)) *
exp(-rr/(m_two * a0)) &
2179 / (m_two *
sqrt(m_pi))
2182 real(real64) function dr_psi_1s(rr, a0)
2183 real(real64),
intent(in) :: a0, rr
2188 real(real64) function dr_psi_2s(rr, a0)
2189 real(real64),
intent(in) :: a0, rr
2192 a0**(-m_five/m_two) *
exp(-rr/(m_two * a0)) / (
sqrt(m_two) * m_two *
sqrt(m_pi))
batchified version of the BLAS axpy routine:
scale a batch by a constant or vector
There are several ways how to call batch_set_state and batch_get_state:
constant times a vector plus a vector
Copies a vector x, to a vector y.
scales a vector by a constant
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
double exp(double __x) __attribute__((__nothrow__
double sqrt(double __x) __attribute__((__nothrow__
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
subroutine, public batch_set_zero(this, np, async)
fill all mesh functions of the batch with zero
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)
This module implements a calculator for the density and defines related functions.
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public dderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public dderivatives_lapl(der, ff, op_ff, ghost_update, set_bc, factor)
apply the Laplacian to a mesh function
subroutine, public zderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
integer, parameter, public spin_polarized
subroutine, public exponential_init(te, namespace, full_batch)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_pi
some mathematical constants
complex(real64), parameter, public m_zi
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public zhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
subroutine, public dhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
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 module defines functions over batches of mesh functions.
subroutine, public dmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public dmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public mesh_batch_nrm2(mesh, aa, nrm2, reduce)
Calculate the norms (norm2, not the square!) of a batch of mesh functions.
subroutine, public zmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
subroutine, public zmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public zmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public zmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public dmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public dmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
This module defines various routines, operating on mesh functions.
class(mesh_t), pointer, public mesh_aux
Globally-scoped pointer to the mesh instance.
real(real64) function, public dmf_dotp_aux(f1, f2)
dot product between two vectors (mesh functions)
subroutine, public mesh_init_mesh_aux(mesh)
Initialise a pointer to the grid/mesh, that is globally exposed, such that low level mesh operations ...
subroutine, public zmesh_interpolation_test(mesh)
subroutine, public dmesh_interpolation_test(mesh)
This module defines the meshes, which are used in Octopus.
pure subroutine, public mesh_r(mesh, ip, rr, origin, coords)
return the distance to the origin for a given grid point
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
character(len=512), private msg
subroutine, public messages_obsolete_variable(namespace, name, rep)
subroutine, public messages_new_line()
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_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_get_coeff_batch(os, ndim, psib, dot)
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 zorbitalset_get_coeff_batch(os, ndim, psib, dot)
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.
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)
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)
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_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.
class representing derivatives
Class describing the electron system.
Description of the grid, containing information on derivatives, stencil, and symmetries.
This class implements the iteration counter used by the multisystem algorithms. As any iteration coun...
Describes mesh distribution to nodes.
contains the information of the meshes and provides the transfer functions
The states_elec_t class contains all electronic wave functions.
batches of electronic states
subroutine write_clock(operation)
subroutine laplacian_op(x, hx)
Computes .
subroutine set_der_aux(der)
subroutine write_condition_result(condition, result)
real(real64) function values(xx)