54 use,
intrinsic :: iso_fortran_env
106 real(real64) :: shift_aux
107 type(derivatives_t),
pointer :: der_aux => null()
108 type(preconditioner_t) :: prec_aux
118 type(namespace_t),
intent(in) :: namespace
120 type(test_parameters_t) :: param
127 call param%init_from_file(namespace)
204 call parse_variable(namespace,
'TestMode', option__testmode__hartree, test_mode)
214 select case (test_mode)
215 case (option__testmode__hartree)
217 case (option__testmode__derivatives)
219 case (option__testmode__orthogonalization)
221 case (option__testmode__interpolation)
223 case (option__testmode__ion_interaction)
225 case (option__testmode__projector)
227 case (option__testmode__dft_u)
229 case (option__testmode__hamiltonian_apply)
231 case (option__testmode__density_calc)
233 case (option__testmode__exp_apply)
235 case (option__testmode__boundaries)
237 case (option__testmode__subspace_diag)
239 case (option__testmode__batch_ops)
241 case (option__testmode__clock)
243 case (option__testmode__linear_solver)
245 case (option__testmode__cgal)
247 case (option__testmode__dense_eigensolver)
249 case (option__testmode__grid_interpolation)
251 case (option__testmode__iihash)
253 case (option__testmode__sihash)
255 case (option__testmode__sphash)
257 case (option__testmode__mpiwrappers)
259 case (option__testmode__regridding)
261 case (option__testmode__helmholtz_decomposition)
263 case (option__testmode__vecpot_analytical)
265 case (option__testmode__current_density)
267 case (option__testmode__mixing_tests)
269 case (option__testmode__optimizers)
271 case (option__testmode__weighted_kmeans)
273 case (option__testmode__csv_input)
275 case (option__testmode__composition_chebyshev)
277 case (option__testmode__lalg_adv)
279 case (option__testmode__isdf)
297 sys =>
electrons_t(namespace, generate_epot=.false.)
299 call poisson_test(sys%hm%psolver, sys%space, sys%gr, sys%ions%latt, namespace, param%repetitions)
300 safe_deallocate_p(sys)
317 sys =>
electrons_t(namespace, generate_epot=.false.)
320 call helmholtz%init(namespace, sys%gr, sys%mc, sys%space)
323 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Hertzian dipole test"
327 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Gaussian test"
329 call gaussian_test(helmholtz, sys%gr, sys%namespace, sys%space)
331 safe_deallocate_p(sys)
341 real(real64),
allocatable :: rho(:), x(:),
center(:)
342 real(real64) :: rr, alpha, beta, res
345 real(real64),
parameter :: threshold = 1.e-7_real64
351 sys =>
electrons_t(namespace, generate_epot=.false.)
357 shift_aux = 0.25_real64
365 alpha =
m_four * sys%gr%spacing(1)
366 beta =
m_one / (alpha**sys%space%dim *
sqrt(
m_pi)**sys%space%dim)
368 safe_allocate(
center(1:sys%space%dim))
371 safe_allocate(rho(1:sys%gr%np))
375 rho(ip) = beta*
exp(-(rr/alpha)**2)
378 safe_allocate(x(1:sys%gr%np))
384 write(
message(1),
'(a,i6,a)')
"Info: CG converged with ", iter,
" iterations."
385 write(
message(2),
'(a,e14.6)')
"Info: The residue is ", res
386 write(
message(3),
'(a,e14.6)')
"Info: Norm solution CG ",
dmf_nrm2(sys%gr, x)
391 safe_deallocate_a(rho)
392 safe_deallocate_p(sys)
407 real(real64),
contiguous,
intent(in) :: x(:)
408 real(real64),
contiguous,
intent(out) :: Hx(:)
410 real(real64),
allocatable :: tmpx(:)
414 safe_allocate(tmpx(1:
mesh_aux%np_part))
419 safe_deallocate_a(tmpx)
434 complex(real64),
allocatable :: psi(:, :)
440 call messages_write(
'Info: Testing the nonlocal part of the pseudopotential with SOC')
445 sys =>
electrons_t(namespace, generate_epot=.false.)
454 call sys%st%group%psib(1, 1)%copy_to(epsib)
458 do itime = 1, param%repetitions
460 sys%hm%ep%natoms, 2, sys%st%group%psib(1, 1), epsib)
463 safe_allocate(psi(1:sys%gr%np, 1:sys%st%d%dim))
464 do itime = 1, epsib%nst
466 write(
message(1),
'(a,i1,3x, f12.6)')
"Norm state ", itime,
zmf_nrm2(sys%gr, 2, psi)
469 safe_deallocate_a(psi)
473 safe_deallocate_p(sys)
485 integer :: itime, ist
487 real(real64),
allocatable :: ddot(:,:,:), dweight(:,:)
488 complex(real64),
allocatable :: zdot(:,:,:), zweight(:,:)
501 sys =>
electrons_t(namespace, generate_epot=.false.)
506 if (sys%st%pack_states)
call sys%st%pack()
508 call sys%st%group%psib(1, 1)%copy_to(epsib2, copy_data = .
true.)
511 if (.not. sys%hm%phase%is_allocated())
then
512 call sys%st%group%psib(1, 1)%copy_to(epsib, copy_data = .
true.)
514 call sys%st%group%psib(1, 1)%copy_to(epsib)
515 call sys%hm%phase%apply_to(sys%gr, sys%gr%np, &
516 .false., epsib, src=sys%st%group%psib(1, 1))
517 epsib2%has_phase = .
true.
523 call dorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
524 sys%hm%phase%is_allocated(), .false., .false.)
525 safe_allocate(dweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
526 safe_allocate(ddot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
528 call zorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
529 sys%hm%phase%is_allocated(), .false., .false.)
531 safe_allocate(zweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
532 safe_allocate(zdot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
535 if (sys%hm%phase%is_allocated())
then
541 do itime = 1, param%repetitions
556 if (epsib%is_packed())
then
557 call epsib%do_unpack(force = .
true.)
560 do ist = 1, epsib%nst
562 write(
message(1),
'(a,i2,3x,e13.6)')
"Dotp state ", ist, ddot(1,1,ist)
564 write(
message(1),
'(a,i2,2(3x,e13.6))')
"Dotp state ", ist, zdot(1,1,ist)
572 safe_deallocate_a(dweight)
573 safe_deallocate_a(zweight)
574 safe_deallocate_a(ddot)
575 safe_deallocate_a(zdot)
581 safe_deallocate_p(sys)
593 integer :: itime, terms
612 call parse_variable(namespace,
'TestHamiltonianApply', option__testhamiltonianapply__term_all, terms)
613 if (terms == 0) terms = huge(1)
618 call messages_write(
'Info: Testing the application of the Hamiltonian')
623 sys =>
electrons_t(namespace, generate_epot=.false.)
630 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
633 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
635 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
637 call sys%st%group%psib(1, 1)%copy_to(hpsib)
639 if (sys%hm%apply_packed())
then
640 call sys%st%group%psib(1, 1)%do_pack()
641 call hpsib%do_pack(copy = .false.)
644 do itime = 1, param%repetitions
654 if (hpsib%is_packed())
then
655 call hpsib%do_unpack(force = .
true.)
660 call hpsib%end(copy = .false.)
662 safe_deallocate_p(sys)
685 sys =>
electrons_t(namespace, generate_epot=.false.)
690 if (sys%st%pack_states)
call sys%st%pack()
692 do itime = 1, param%repetitions
696 write(
message(1),
'(a,3x, f12.6)')
"Norm density ",
dmf_nrm2(sys%gr, sys%st%rho(:,1))
700 safe_deallocate_p(sys)
723 sys =>
electrons_t(namespace, generate_epot=.false.)
728 if (sys%st%pack_states)
call sys%st%pack()
730 do itime = 1, param%repetitions
731 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
737 safe_deallocate_p(sys)
751 integer,
allocatable :: degree(:)
759 call messages_write(
'Info: Testing Chebyshev filtering and its composition rule')
764 sys =>
electrons_t(namespace, generate_epot=.false.)
769 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
772 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
775 safe_allocate(degree(1:sys%st%group%nblocks))
785 call parse_variable(namespace,
'TestCompositionOrder', 2, degree_n)
797 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
799 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
803 call messages_write(
'Info: Result after calling 2n-th order filtering')
809 call sys%st%group%psib(1, 1)%copy_to(psib, copy_data=.
true.)
812 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
813 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
815 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
816 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
827 safe_deallocate_a(degree)
828 safe_deallocate_p(bounds)
832 safe_deallocate_p(sys)
857 sys =>
electrons_t(namespace, generate_epot=.false.)
864 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
867 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
871 if (sys%hm%apply_packed())
then
872 call sys%st%group%psib(1, 1)%do_pack()
875 do itime = 1, param%repetitions
876 call te%apply_batch(sys%namespace, sys%gr, sys%hm, sys%st%group%psib(1, 1), 1e-3_real64)
882 safe_deallocate_p(sys)
896 real(real64),
allocatable :: diff(:)
907 sys =>
electrons_t(namespace, generate_epot=.false.)
913 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
916 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
918 call sdiag%init(sys%namespace, sys%st)
920 safe_allocate(diff(1:sys%st%nst))
922 do itime = 1, param%repetitions
924 call dsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
926 call zsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
930 safe_deallocate_a(diff)
935 safe_deallocate_p(sys)
947 integer :: itime, ops, ops_default, ist, jst, nst
949 real(real64),
allocatable :: tmp(:)
950 real(real64),
allocatable :: ddotv(:)
951 complex(real64),
allocatable :: zdotv(:)
952 real(real64),
allocatable :: ddot(:,:), df(:,:), dweight(:), dpoints(:,:,:)
953 complex(real64),
allocatable :: zdot(:,:), zf(:,:), zweight(:), zpoints(:,:,:)
954 integer :: sp, block_size, size
983 option__testbatchops__ops_axpy + &
984 option__testbatchops__ops_scal + &
985 option__testbatchops__ops_nrm2 + &
986 option__testbatchops__ops_dotp_matrix + &
987 option__testbatchops__ops_dotp_self + &
988 option__testbatchops__ops_dotp_vector + &
989 option__testbatchops__ops_ax_function_py + &
990 option__testbatchops__ops_get_points
1001 sys =>
electrons_t(namespace, generate_epot=.false.)
1002 call sys%init_parallelization(
mpi_world)
1006 if (sys%st%pack_states)
call sys%st%pack()
1008 if (
bitand(ops, option__testbatchops__ops_axpy) /= 0)
then
1009 message(1) =
'Info: Testing axpy'
1012 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1013 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1015 do itime = 1, param%repetitions
1016 call batch_axpy(sys%gr%np, 0.1_real64, xx, yy)
1024 if (
bitand(ops, option__testbatchops__ops_scal) /= 0)
then
1025 message(1) =
'Info: Testing scal'
1028 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1029 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1031 do itime = 1, param%repetitions
1040 if (
bitand(ops, option__testbatchops__ops_nrm2) /= 0)
then
1041 message(1) =
'Info: Testing nrm2'
1044 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1045 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1047 safe_allocate(tmp(1:xx%nst))
1049 do itime = 1, param%repetitions
1052 do itime = 1, xx%nst
1053 write(
message(1),
'(a,i1,3x,e23.16)')
"Nrm2 norm state ", itime, tmp(itime)
1057 safe_deallocate_a(tmp)
1063 if (
bitand(ops, option__testbatchops__ops_dotp_matrix) /= 0)
then
1065 message(1) =
'Info: Testing dotp_matrix'
1068 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1069 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1071 nst = sys%st%group%psib(1, 1)%nst
1074 safe_allocate(ddot(1:nst, 1:nst))
1075 do itime = 1, param%repetitions
1081 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_matrix states', ist, jst, ddot(ist,jst)
1085 safe_deallocate_a(ddot)
1087 safe_allocate(zdot(1:nst, 1:nst))
1088 do itime = 1, param%repetitions
1094 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_matrix states', ist, jst, zdot(ist,jst)
1098 safe_deallocate_a(zdot)
1105 if (
bitand(ops, option__testbatchops__ops_dotp_vector) /= 0)
then
1107 message(1) =
'Info: Testing dotp_vector'
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 = .
true.)
1113 nst = sys%st%group%psib(1, 1)%nst
1116 safe_allocate(ddotv(1:nst))
1117 do itime = 1, param%repetitions
1122 write(
message(ist),
'(a,i3,3x,e23.16)')
'Dotp_vector state', ist, ddotv(ist)
1125 safe_deallocate_a(ddotv)
1127 safe_allocate(zdotv(1:nst))
1128 do itime = 1, param%repetitions
1133 write(
message(ist),
'(a,i3,3x,2(e23.16,1x))')
'Dotp_vector state', ist, zdotv(ist)
1136 safe_deallocate_a(zdotv)
1143 if (
bitand(ops, option__testbatchops__ops_dotp_self) /= 0)
then
1145 message(1) =
'Info: Testing dotp_self'
1148 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1150 nst = sys%st%group%psib(1, 1)%nst
1153 safe_allocate(ddot(1:nst, 1:nst))
1154 do itime = 1, param%repetitions
1160 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_self states', ist, jst, ddot(ist,jst)
1164 safe_deallocate_a(ddot)
1166 safe_allocate(zdot(1:nst, 1:nst))
1167 do itime = 1, param%repetitions
1173 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_self states', ist, jst, zdot(ist,jst)
1177 safe_deallocate_a(zdot)
1183 if (
bitand(ops, option__testbatchops__ops_ax_function_py) /= 0)
then
1184 message(1) =
'Info: Testing ax_function_py'
1187 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1190 safe_allocate(df(sys%gr%np, sys%st%d%dim))
1191 safe_allocate(dweight(1:sys%st%group%psib(1, 1)%nst_linear))
1192 dweight = 0.1_real64
1195 do itime = 1, param%repetitions
1198 safe_deallocate_a(df)
1199 safe_deallocate_a(dweight)
1201 safe_allocate(zf(sys%gr%np, sys%st%d%dim))
1202 safe_allocate(zweight(1:sys%st%group%psib(1, 1)%nst_linear))
1203 zweight = cmplx(0.1_real64,
m_zero, real64)
1206 do itime = 1, param%repetitions
1209 safe_deallocate_a(zf)
1216 if (
bitand(ops, option__testbatchops__ops_get_points) /= 0)
then
1221 call sys%st%group%psib(1, 1)%copy_to(yy)
1227 safe_allocate(dpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1229 do itime = 1, param%repetitions
1230 do sp = 1, sys%gr%np, block_size
1231 size = min(block_size, sys%gr%np - sp + 1)
1236 safe_deallocate_a(dpoints)
1242 safe_allocate(zpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1244 do itime = 1, param%repetitions
1245 do sp = 1, sys%gr%np, block_size
1246 size = min(block_size, sys%gr%np - sp + 1)
1251 safe_deallocate_a(dpoints)
1262 safe_deallocate_p(sys)
1276 sys =>
electrons_t(namespace, generate_epot=.false.)
1277 call sys%init_parallelization(
mpi_world)
1279 message(1) =
'Info: Testing the finite-differences derivatives.'
1283 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1284 call dderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1287 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1288 call zderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1291 safe_deallocate_p(sys)
1310 sys =>
electrons_t(namespace, generate_epot=.false.)
1311 call sys%init_parallelization(
mpi_world)
1313 message(1) =
'Info: Testing orthogonalization.'
1317 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1318 message(1) =
'Info: Real wave-functions.'
1320 do itime = 1, param%repetitions
1325 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1326 message(1) =
'Info: Complex wave-functions.'
1328 do itime = 1, param%repetitions
1333 safe_deallocate_p(sys)
1348 sys =>
electrons_t(namespace, generate_epot=.false.)
1349 call sys%init_parallelization(
mpi_world)
1351 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1360 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1362 call messages_write(
'Info: Testing complex interpolation routines')
1370 safe_deallocate_p(sys)
1385 sys =>
electrons_t(namespace, generate_epot=.false.)
1386 call sys%init_parallelization(
mpi_world)
1388 call ion_interaction_test(sys%space, sys%ions%latt, sys%ions%atom, sys%ions%natoms, sys%ions%pos, &
1389 sys%gr%box%bounding_box_l, namespace, sys%mc)
1391 safe_deallocate_p(sys)
1400 type(
grid_t),
intent(in) :: gr
1401 class(
batch_t),
intent(inout) :: psib
1402 character(*),
optional,
intent(in) :: string
1405 complex(real64),
allocatable :: zpsi(:, :)
1406 real(real64),
allocatable :: dpsi(:, :)
1408 character(80) :: string_
1415 safe_allocate(dpsi(1:gr%np, 1:st%d%dim))
1417 safe_allocate(zpsi(1:gr%np, 1:st%d%dim))
1420 do itime = 1, psib%nst
1423 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
dmf_nrm2(gr, st%d%dim, dpsi)
1426 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
zmf_nrm2(gr, st%d%dim, zpsi)
1432 safe_deallocate_a(dpsi)
1434 safe_deallocate_a(zpsi)
1450 write(
message(1),
'(a)')
" Operation Counter Time Global step"
1465 call clock%set(
clock_t(time_step=
m_four, initial_iteration=1))
1469 write(
message(1),
'(a)')
" Clock comparisons:"
1472 other_clock =
clock_t(time_step=
m_one, initial_iteration=5)
1484 character(len=*),
intent(in) :: operation
1486 write(
message(1),
'(a17,1x,i6,1x,f10.1,1x,i16)') operation, clock%counter(), clock%value(), clock%global_step()
1491 character(len=*),
intent(in) :: condition
1492 logical,
intent(in) :: result
1494 write(
message(1),
'(a10," = ",i1," (",l1,")")') condition, abs(transfer(result, 0)), result
1511 message(1) =
"cgal_polyhedron_point_inside"
1523 integer :: N, ii, jj, N_list(4), i_N
1524 real(real64),
allocatable :: matrix(:, :), eigenvectors(:, :), eigenvalues(:), test(:)
1525 real(real64),
allocatable :: differences(:)
1529 n_list = [15, 32, 100, 500]
1533 safe_allocate(matrix(1:n, 1:n))
1534 safe_allocate(eigenvectors(1:n, 1:n))
1535 safe_allocate(eigenvalues(1:n))
1536 safe_allocate(test(1:n))
1537 safe_allocate(differences(1:n))
1543 matrix(ii, jj) = ii * jj
1548 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1552 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1553 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1555 write(
message(1),
"(A, I3, A, E13.6)")
"Parallel solver - N: ", n, &
1556 ", average difference: ", sum(differences)/n
1560 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1564 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1565 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1567 write(
message(1),
"(A, I3, A, E13.6)")
"Serial solver - N: ", n, &
1568 ", average difference: ", sum(differences)/n
1571 safe_deallocate_a(matrix)
1572 safe_deallocate_a(eigenvectors)
1573 safe_deallocate_a(eigenvalues)
1574 safe_deallocate_a(test)
1575 safe_deallocate_a(differences)
1582 class(
batch_t),
intent(inout) :: psib
1585 real(real64),
allocatable :: dff(:)
1586 complex(real64),
allocatable :: zff(:)
1588 real(real64) :: da, db, dc
1589 complex(real64) :: za, zb, zc
1594 da =
m_one/mesh%box%bounding_box_l(1)
1600 za = da +
m_zi*0.01_real64
1601 zb = db*
exp(
m_zi*0.345_real64)
1602 zc = dc -
m_zi*50.0_real64
1604 safe_allocate(zff(1:mesh%np))
1605 do ist = 1, psib%nst_linear
1609 zff(ip) = zb*
exp(-za*sum(mesh%x(ip, :)**2)) + zc
1614 safe_deallocate_a(zff)
1616 safe_allocate(dff(1:mesh%np))
1617 do ist = 1, psib%nst_linear
1621 dff(ip) = db*
exp(-da*sum(mesh%x(ip, :)**2)) + dc
1626 safe_deallocate_a(dff)
1640 call sys%init_parallelization(
mpi_world)
1643 sys%gr%stencil, sys%mc, nlevels=3)
1649 safe_deallocate_p(sys)
1665 write(
message(1),*)
'hash[1] :', found,
value
1669 write(
message(1),*)
'hash[2] :', found,
value
1673 write(
message(1),*)
'hash[3] :', found,
value
1685 integer ::
value, sum
1694 write(
message(1),*)
'hash["one"]: ', found,
value
1698 write(
message(1),*)
'hash["two"]: ', found,
value
1702 write(
message(1),*)
'hash["three"]: ', found,
value
1709 do while (it%has_next())
1710 value = it%get_next()
1712 write(
message(1),
'(I3,A,I5)') counter,
': hash[...] = ',
value
1714 counter = counter + 1
1716 write(
message(1),*)
'counter = ', counter
1717 write(
message(2),*)
'sum = ', sum
1739 class(*),
pointer :: value
1741 integer :: count_clock, count_space
1743 safe_allocate(clock_2)
1757 write(
message(1),*)
'hash["one"]: ', found,
value%counter()
1760 write(
message(1),*)
'hash["one"]: ', found,
value%short_info()
1763 write(
message(1),*)
'wrong type. found = ', found
1770 write(
message(1),*)
'hash["two"]: ', found,
value%counter()
1773 write(
message(1),*)
'hash["two"]: ', found,
value%short_info()
1776 write(
message(1),*)
'wrong type. found = ',found
1780 safe_deallocate_a(clock_2)
1785 write(
message(1),*)
'hash["three"]: ', found,
value%counter()
1788 write(
message(1),*)
'hash["three"]: ', found,
value%short_info()
1791 write(
message(1),*)
'wrong type. found = ',found
1800 do while (it%has_next())
1801 value => it%get_next()
1804 count_clock = count_clock + 1
1806 count_space = count_space + 1
1810 write(
message(1), *)
'Count_clock = ', count_clock
1811 write(
message(2), *)
'Count_space = ', count_space
1824 real(real64),
allocatable :: ff_A(:), ff_A_reference(:), ff_B(:), ff_B_reference(:), diff_A(:), diff_B(:)
1825 real(real64) :: norm_ff, norm_diff
1834 call sysa%init_parallelization(
mpi_world)
1835 call sysb%init_parallelization(
mpi_world)
1838 safe_allocate(ff_a(1:sysa%gr%np))
1839 safe_allocate(ff_a_reference(1:sysa%gr%np))
1840 safe_allocate(diff_a(1:sysa%gr%np))
1841 safe_allocate(ff_b(1:sysb%gr%np))
1842 safe_allocate(ff_b_reference(1:sysb%gr%np))
1843 safe_allocate(diff_b(1:sysb%gr%np))
1845 do ip = 1, sysa%gr%np
1846 ff_a_reference(ip) =
values(sysa%gr%x(ip, :))
1848 do ip = 1, sysb%gr%np
1849 ff_b_reference(ip) =
values(sysb%gr%x(ip, :))
1853 regridding =>
regridding_t(sysb%gr, sysa%gr, sysa%space, sysa%namespace)
1854 call regridding%do_transfer(ff_b, ff_a_reference)
1855 safe_deallocate_p(regridding)
1858 do ip = 1, sysb%gr%np
1860 ff_b_reference(ip) =
m_zero
1863 diff_b(ip) = abs(ff_b_reference(ip) - ff_b(ip))
1866 norm_ff =
dmf_nrm2(sysb%gr, ff_b_reference)
1867 norm_diff =
dmf_nrm2(sysb%gr, diff_b)
1869 write(
message(1),
'(a, E14.6)')
"Forward: difference of reference to mapped function (rel.): ", &
1874 sysb%gr, ff_b_reference,
unit_one, ierr)
1878 sysa%gr, ff_a_reference,
unit_one, ierr)
1881 regridding =>
regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
1882 call regridding%do_transfer(ff_a, ff_b_reference)
1883 safe_deallocate_p(regridding)
1885 do ip = 1, sysa%gr%np
1887 ff_a_reference(ip) =
m_zero
1890 diff_a(ip) = abs(ff_a_reference(ip) - ff_a(ip))
1893 norm_ff =
dmf_nrm2(sysa%gr, ff_a_reference)
1894 norm_diff =
dmf_nrm2(sysa%gr, diff_a)
1896 write(
message(1),
'(a, E14.6)')
"Backward: difference of reference to mapped function (rel.): ", &
1901 sysa%gr, ff_a_reference,
unit_one, ierr)
1905 sysb%gr, ff_b_reference,
unit_one, ierr)
1907 safe_deallocate_a(ff_a)
1908 safe_deallocate_a(ff_a_reference)
1909 safe_deallocate_a(ff_b)
1910 safe_deallocate_a(ff_b_reference)
1911 safe_deallocate_a(diff_a)
1912 safe_deallocate_a(diff_b)
1913 safe_deallocate_p(sysa)
1914 safe_deallocate_p(sysb)
1920 real(real64) function values(xx)
1921 real(real64),
intent(in) :: xx(:)
1922 real(real64) :: xx0(1:size(xx, dim=1))
1923 real(real64),
parameter :: aa =
m_half
1924 real(real64),
parameter :: bb =
m_four
1928 values = bb *
exp(-aa*sum((xx-xx0)**2))
1938 type(namespace_t),
intent(in) :: namespace
1940 class(maxwell_t),
pointer :: maxwell_system
1942 real(real64),
allocatable :: magnetic_field(:,:)
1943 real(real64),
allocatable :: vector_potential_mag(:,:)
1944 real(real64),
allocatable :: vector_potential_analytical(:,:)
1945 real(real64),
allocatable :: delta(:,:)
1946 real(real64) :: exp_factor
1950 real(real64) :: sigma
1951 integer :: ip, j, ierr, nn
1952 integer(int64) :: out_how
1953 character(len=MAX_PATH_LEN) :: fname, fname2, fname3
1956 maxwell_system => maxwell_t(namespace)
1957 sigma = maxwell_system%gr%box%bounding_box_l(1)/10_real64
1958 call maxwell_system%init_parallelization(mpi_world)
1960 safe_allocate(magnetic_field(1:maxwell_system%gr%np_part, 1:3))
1961 safe_allocate(vector_potential_mag(1:maxwell_system%gr%np_part, 1:3))
1962 safe_allocate(vector_potential_analytical(1:maxwell_system%gr%np_part, 1:3))
1963 safe_allocate(delta(1:maxwell_system%gr%np, 1:3))
1976 call parse_variable(namespace,
'TestVectorPotentialType', option__testvectorpotentialtype__bounded, nn)
1979 case (option__testvectorpotentialtype__bounded)
1980 do ip = 1, maxwell_system%gr%np_part
1981 xx = maxwell_system%gr%x(ip, 1)
1982 yy = maxwell_system%gr%x(ip, 2)
1983 zz = maxwell_system%gr%x(ip, 3)
1984 exp_factor =
exp((-xx**2 - yy**2 - zz**2)*1/(2*sigma**2))
1985 magnetic_field(ip, 1) = exp_factor*yy*(1 - (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
1986 magnetic_field(ip, 2) = exp_factor * xx * (1 + (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
1987 magnetic_field(ip, 3) = exp_factor * 2 * xx * yy * zz * 1/(3*sigma**2)
1989 vector_potential_analytical(ip, 1) = m_third * xx * zz * exp_factor
1990 vector_potential_analytical(ip, 2) = - m_third * yy * zz * exp_factor
1991 vector_potential_analytical(ip, 3) = m_third * (-xx**2 + yy**2) * exp_factor
1993 case (option__testvectorpotentialtype__unbounded)
1995 do ip = 1, maxwell_system%gr%np_part
1996 magnetic_field(ip, 1) = maxwell_system%gr%x(ip, 2)
1997 magnetic_field(ip, 2) = maxwell_system%gr%x(ip, 1)
1998 magnetic_field(ip, 3) = m_zero
2000 vector_potential_analytical(ip, 1) = m_third * maxwell_system%gr%x(ip, 1) * maxwell_system%gr%x(ip, 3)
2001 vector_potential_analytical(ip, 2) = - m_third * maxwell_system%gr%x(ip, 2) * maxwell_system%gr%x(ip, 3)
2002 vector_potential_analytical(ip, 3) = - m_third * (maxwell_system%gr%x(ip, 1)**2 - maxwell_system%gr%x(ip, 2)**2)
2005 call maxwell_system%helmholtz%get_vector_potential(namespace, vector_potential_mag, magnetic_field)
2009 do ip = 1, maxwell_system%gr%np
2010 delta(ip,j) = vector_potential_analytical(ip, j) - vector_potential_mag(ip, j)
2015 write(message(j),*)
'j, norm2(delta)', j, norm2(delta(:,j))
2017 call messages_info(3)
2019 write(fname,
'(a)')
'deviation_from_analytical_formulation'
2020 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, maxwell_system%space, maxwell_system%gr, &
2021 delta, unit_one, ierr)
2022 write(fname2,
'(a)')
'vector_potential_analytical'
2023 call io_function_output_vector(out_how ,
'./' , trim(fname2), namespace, maxwell_system%space, maxwell_system%gr, &
2024 vector_potential_analytical, unit_one, ierr)
2025 write(fname3,
'(a)')
'vector_potential_mag'
2026 call io_function_output_vector(out_how ,
'./' , trim(fname3), namespace, maxwell_system%space, maxwell_system%gr, &
2027 vector_potential_mag, unit_one, ierr)
2029 safe_deallocate_a(magnetic_field)
2030 safe_deallocate_a(vector_potential_mag)
2031 safe_deallocate_a(vector_potential_analytical)
2032 safe_deallocate_a(delta)
2033 safe_deallocate_p(maxwell_system)
2039 type(multigrid_t),
intent(in) :: mgrid
2040 class(space_t),
intent(in) :: space
2042 real(real64),
allocatable :: guess0(:), res0(:), guess1(:)
2043 type(mesh_t),
pointer :: mesh0, mesh1
2044 real(real64) :: delta, xx(3,2), alpha, beta, rr
2045 integer :: nn, ip, ierr
2049 message(1) =
'Info: Testing the grid interpolation.'
2051 call messages_info(2)
2053 mesh0 => mgrid%level(0)%mesh
2054 mesh1 => mgrid%level(1)%mesh
2056 safe_allocate(guess0(1:mesh0%np_part))
2057 safe_allocate(res0(1:mesh0%np_part))
2058 safe_allocate(guess1(1:mesh1%np_part))
2060 alpha = m_four*mesh0%spacing(1)
2061 beta = m_one / (alpha**space%dim *
sqrt(m_pi)**space%dim)
2076 call mesh_r(mesh0, ip, rr, origin = xx(:, nn))
2077 guess0(ip) = guess0(ip) + (-1)**nn * beta*
exp(-(rr/alpha)**2)
2081 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_target", global_namespace, &
2082 space, mesh0, guess0, unit_one, ierr)
2083 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_target", global_namespace, &
2084 space, mesh0, guess0, unit_one, ierr)
2085 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_target", global_namespace, &
2086 space, mesh0, guess0, unit_one, ierr)
2093 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, injection)
2095 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2097 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_result", global_namespace, &
2098 space, mesh0, res0, unit_one, ierr)
2099 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_result", global_namespace, &
2100 space, mesh0, res0, unit_one, ierr)
2101 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_result", global_namespace, &
2102 space, mesh0, res0, unit_one, ierr)
2104 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2105 write(message(1),
'(a,e13.6)')
'Interpolation test (abs.) = ', delta
2111 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, fullweight)
2113 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2115 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"restriction_result", global_namespace, &
2116 space, mesh0, res0, unit_one, ierr)
2117 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"restriction_result", global_namespace, &
2118 space, mesh0, res0, unit_one, ierr)
2119 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"restriction_result", global_namespace, &
2120 space, mesh0, res0, unit_one, ierr)
2122 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2123 write(message(2),
'(a,e13.6)')
'Restriction test (abs.) = ', delta
2124 call messages_info(2)
2126 safe_deallocate_a(guess0)
2127 safe_deallocate_a(res0)
2128 safe_deallocate_a(guess1)
2136 type(namespace_t),
intent(in) :: namespace
2137 type(electrons_t),
pointer :: sys
2139 type(current_t) :: current
2140 character(len=MAX_PATH_LEN) :: fname
2141 integer :: ierr, ip, idir
2142 integer(int64) :: out_how
2143 real(real64),
allocatable :: current_para_ref(:,:), current_dia_ref(:,:), current_mag_ref(:,:), delta(:)
2144 real(real64) :: xx(3), rr, a0, mag_curr, sin_thet, sin_phi, cos_phi, vec_pot_slope
2145 complex(real64) :: alpha
2147 sys => electrons_t(namespace, generate_epot=.false.)
2148 call sys%init_parallelization(mpi_world)
2150 alpha = (0.0_real64, 0.5_real64)
2152 vec_pot_slope = 0.4_real64
2154 call states_elec_allocate_wfns(sys%st, sys%gr, wfs_type = type_cmplx)
2157 call current_init(current, namespace)
2159 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st)
2161 safe_allocate(sys%hm%hm_base%vector_potential(1:3, 1:sys%gr%np))
2163 sys%hm%hm_base%vector_potential = m_zero
2164 do ip = 1, sys%gr%np
2165 xx = sys%gr%x(ip, 1:3)
2166 sys%hm%hm_base%vector_potential(2, ip) = vec_pot_slope * xx(1) / p_c
2169 call states_elec_allocate_current(sys%st, sys%space, sys%gr)
2170 call density_calc(sys%st, sys%gr, sys%st%rho)
2172 call current_calculate(current, namespace, sys%gr, sys%hm, sys%space, sys%st)
2174 safe_allocate(current_para_ref(1:sys%gr%np,1:3))
2175 safe_allocate(current_dia_ref(1:sys%gr%np,1:3))
2176 safe_allocate(current_mag_ref(1:sys%gr%np,1:3))
2177 safe_allocate(delta(1:sys%gr%np))
2180 current_para_ref(:,:) = m_zero
2181 do ip = 1, sys%gr%np
2182 call mesh_r(sys%gr, ip, rr)
2183 xx = sys%gr%x(ip, 1:3)
2184 if (rr > r_small)
then
2186 psi_1s(rr, a0) *
dr_psi_2s(rr, a0) ) * aimag(alpha) / (1 + abs(alpha)**2) * xx(1:3) / rr
2190 write(fname,
'(a)')
'current_para'
2191 out_how = io_function_fill_how(
"PlaneZ")
2192 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2193 sys%st%current_para(:,:,1), unit_one, ierr)
2195 write(fname,
'(a)')
'current_para-ref'
2196 out_how = io_function_fill_how(
"PlaneZ")
2197 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2198 current_para_ref(:,:), unit_one, ierr)
2202 delta(:) = current_para_ref(1:sys%gr%np, idir) - sys%st%current_para(1:sys%gr%np, idir, 1)
2203 write(message(idir),*)
'idir =',idir,
', norm2(delta paramagnetic)',norm2(delta)
2205 call messages_info(3)
2208 current_dia_ref(:,:) = m_zero
2209 do ip = 1, sys%gr%np
2210 call mesh_r(sys%gr, ip, rr)
2211 current_dia_ref(ip,1:3) = - sys%hm%hm_base%vector_potential(1:3,ip) *&
2215 write(fname,
'(a)')
'current_dia'
2216 out_how = io_function_fill_how(
"PlaneZ")
2217 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2218 sys%st%current_dia(:,:,1), unit_one, ierr)
2220 write(fname,
'(a)')
'current_dia-ref'
2221 out_how = io_function_fill_how(
"PlaneZ")
2222 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2223 current_dia_ref(:,:), unit_one, ierr)
2227 delta(:) = current_dia_ref(1:sys%gr%np, idir) - sys%st%current_dia(1:sys%gr%np, idir, 1)
2228 write(message(idir),*)
'idir =',idir,
', norm2(delta diamagnetic)',norm2(delta)
2230 call messages_info(3)
2233 call current_calculate_mag(sys%gr%der, sys%st)
2236 current_mag_ref(:,:) = m_zero
2237 do ip = 1, sys%gr%np
2238 call mesh_r(sys%gr, ip, rr)
2239 xx = sys%gr%x(ip, 1:3)
2240 if (norm2(xx(1:2)) > r_small .and. rr > r_small)
then
2241 sin_thet = norm2(xx(1:2)) / rr
2242 sin_phi = xx(2) / norm2(xx(1:2))
2243 cos_phi = xx(1) / norm2(xx(1:2))
2247 current_mag_ref(ip,1) = m_half * mag_curr * sin_thet * sin_phi / (1+abs(alpha)**2)
2248 current_mag_ref(ip,2) = -m_half * mag_curr * sin_thet * cos_phi / (1+abs(alpha)**2)
2252 write(fname,
'(a)')
'current_mag'
2253 out_how = io_function_fill_how(
"PlaneZ")
2254 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2255 sys%st%current_mag(:,:,1), unit_one, ierr)
2257 write(fname,
'(a)')
'current_mag-ref'
2258 out_how = io_function_fill_how(
"PlaneZ")
2259 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2260 current_mag_ref(:,:), unit_one, ierr)
2264 delta(:) = current_mag_ref(1:sys%gr%np, idir) - sys%st%current_mag(1:sys%gr%np, idir, 1)
2265 write(message(idir),*)
'idir =',idir,
', norm2(delta magnetization)',norm2(delta)
2267 call messages_info(3)
2269 safe_deallocate_a(current_para_ref)
2270 safe_deallocate_a(current_dia_ref)
2271 safe_deallocate_a(current_mag_ref)
2272 safe_deallocate_a(delta)
2273 safe_deallocate_p(sys)
2279 class(batch_t),
intent(inout) :: psib
2280 class(mesh_t),
intent(in) :: mesh
2281 type(namespace_t),
intent(in) :: namespace
2282 complex(real64),
intent(in) :: alpha
2283 real(real64),
intent(in) :: a0
2285 complex(real64),
allocatable :: zff(:)
2292 safe_allocate(zff(1:mesh%np))
2293 if (type_is_complex(psib%type()))
then
2295 call mesh_r(mesh, ip, rr)
2297 call batch_set_state(psib, 1, mesh%np, zff)
2299 safe_deallocate_a(zff)
2301 write(message(1),*)
"States should be complex for the linear combination of hydrogenic states to work"
2302 call messages_info(1, namespace=namespace)
2309 real(real64),
intent(in) :: a0, rr
2310 complex(real64),
intent(in) :: alpha
2316 real(real64) function psi_1s(rr, a0)
2317 real(real64),
intent(in) :: a0, rr
2323 real(real64) function psi_2s(rr, a0)
2324 real(real64),
intent(in) :: a0, rr
2326 psi_2s =
sqrt(m_two) * a0**(-m_three/m_two) * (m_one - rr/(m_two * a0)) *
exp(-rr/(m_two * a0)) &
2327 / (m_two *
sqrt(m_pi))
2330 real(real64) function dr_psi_1s(rr, a0)
2331 real(real64),
intent(in) :: a0, rr
2336 real(real64) function dr_psi_2s(rr, a0)
2337 real(real64),
intent(in) :: a0, rr
2340 a0**(-m_five/m_two) *
exp(-rr/(m_two * a0)) / (
sqrt(m_two) * m_two *
sqrt(m_pi))
2347 type(namespace_t),
intent(in) :: namespace
2350 integer(int64) :: i, j, k
2351 integer(int64) :: dims(3)
2352 character(len=MAX_PATH_LEN) :: fname
2354 real(real64),
allocatable :: ff(:)
2364 call parse_variable(namespace,
'TestCSVFileName',
"", fname)
2366 message(1) =
"Attempting to probe "//trim(fname)
2367 call messages_info(1, namespace=namespace)
2369 call io_csv_get_info(fname, dims, ierr)
2371 message(1) =
"Probing successful."
2372 write(message(2),
'("found dimensions: ",3I20)') dims
2373 call messages_info(2, namespace=namespace)
2375 write(message(1),
'("Probing failed. ierr = ",I5)') ierr
2376 call messages_fatal(1, namespace=namespace)
2379 safe_allocate(ff(1:dims(1)*dims(2)*dims(3)))
2381 message(1) =
"Attempting to read "//trim(fname)
2382 call messages_info(1, namespace=namespace)
2384 call dread_csv(fname, dims(1)*dims(2)*dims(3), ff, ierr)
2386 message(1) =
"Reading successful."
2387 call messages_info(1, namespace=namespace)
2389 do k=1, min(4_int64, dims(3))
2390 do j=1, min(4_int64, dims(2))
2391 write(message(j),
'("data ",2I5, 1X, 4F8.2)') k, j, &
2392 (ff(i + dims(1)*(j-1) + dims(1)* dims(2)*(k-1)), i=1, min(4_int64, dims(1)))
2394 write(message(int(j, int32)),
'("")')
2395 call messages_info(int(j, int32), namespace=namespace)
2399 message(1) =
"Reading failed."
2400 call messages_fatal(1, namespace=namespace)
2403 safe_deallocate_a(ff)
batchified version of the BLAS axpy routine:
scale a batch by a constant or vector
There are several ways how to call batch_set_state and batch_get_state:
constant times a vector plus a vector
Copies a vector x, to a vector y.
scales a vector by a constant
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
double exp(double __x) __attribute__((__nothrow__
double sqrt(double __x) __attribute__((__nothrow__
pure logical function, public accel_is_enabled()
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
subroutine, public dbatch_ax_function_py(np, aa, psi, yy)
This routine performs a set of axpy operations adding the same function psi to all functions of a bat...
subroutine, public batch_set_zero(this, np, async)
fill all mesh functions of the batch with zero
subroutine, public zbatch_ax_function_py(np, aa, psi, yy)
This routine performs a set of axpy operations adding the same function psi to all functions of a bat...
Module implementing boundary conditions in Octopus.
Module, implementing a factory for boxes.
This module handles the calculation mode.
integer, parameter, public p_strategy_kpoints
parallelization in k-points
integer, parameter, public p_strategy_domains
parallelization in domains
type(calc_mode_par_t), public calc_mode_par
Singleton instance of parallel calculation mode.
integer, parameter, public p_strategy_states
parallelization in states
subroutine, public cgal_polyhedron_init(cgal_poly, fname, verbose)
logical function, public cgal_polyhedron_point_inside(cgal_poly, xq, yq, zq)
subroutine, public cgal_polyhedron_end(cgal_poly)
pure real(real64) function center(this)
Center of the filter interval.
This module implements a calculator for the density and defines related functions.
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public dderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public dderivatives_lapl(der, ff, op_ff, ghost_update, set_bc, factor)
apply the Laplacian to a mesh function
subroutine, public zderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public zchebyshev_filter(namespace, mesh, st, hm, degree, bounds, ik, normalize)
Chebyshev Filter.
subroutine, public dchebyshev_filter(namespace, mesh, st, hm, degree, bounds, ik, normalize)
Chebyshev Filter.
integer, parameter, public spin_polarized
subroutine, public exponential_init(te, namespace, full_batch)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_pi
some mathematical constants
complex(real64), parameter, public m_zi
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public zhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
subroutine, public dhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
type(hardware_t), public cpu_hardware
Global instance of CPU hardware specification.
integer, parameter, public sizeof_real64
Number of bytes to store a variable of type real(real64)
integer, parameter, public sizeof_complex64
Number of bytes to store a variable of type complex(real64)
The Helmholtz decomposition is intended to contain "only mathematical" functions and procedures to co...
Test suit for the Helmholtz decomposition module.
subroutine, public gaussian_test(helmholtz, sys_grid, namespace, space)
subroutine, public hertzian_dipole_test(helmholtz, sys_grid, namespace, space)
This module implements a simple hash table for non-negative integer keys and integer values.
subroutine, public iihash_end(h)
Free a hash table.
subroutine, public iihash_insert(h, key, val)
Insert a (key, val) pair into the hash table h.
integer function, public iihash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
subroutine, public iihash_init(h)
Initialize a hash table h.
subroutine, public dio_function_output(how, dir, fname, namespace, space, mesh, ff, unit, ierr, pos, atoms, grp, root)
Top-level IO routine for functions defined on the mesh.
integer(int64) function, public io_function_fill_how(where)
Use this function to quickly plot functions for debugging purposes: call dio_function_output(io_funct...
subroutine, public ion_interaction_test(space, latt, atom, natoms, pos, lsize, namespace, mc)
This modules takes care of testing some linear algebra routines.
subroutine, public test_exponential_matrix(namespace)
Unit tests for the exponential of a matrix.
This module defines functions over batches of mesh functions.
subroutine, public dmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public dmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public mesh_batch_nrm2(mesh, aa, nrm2, reduce)
Calculate the norms (norm2, not the square!) of a batch of mesh functions.
subroutine, public zmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
subroutine, public zmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public zmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public zmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public dmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public dmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
This module defines various routines, operating on mesh functions.
class(mesh_t), pointer, public mesh_aux
Globally-scoped pointer to the mesh instance.
real(real64) function, public dmf_dotp_aux(f1, f2)
dot product between two vectors (mesh functions)
subroutine, public mesh_init_mesh_aux(mesh)
Initialise a pointer to the grid/mesh, that is globally exposed, such that low level mesh operations ...
subroutine, public zmesh_interpolation_test(mesh)
subroutine, public dmesh_interpolation_test(mesh)
This module defines the meshes, which are used in Octopus.
pure subroutine, public mesh_r(mesh, ip, rr, origin, coords)
return the distance to the origin for a given grid point
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
character(len=512), private msg
subroutine, public messages_obsolete_variable(namespace, name, rep)
subroutine, public messages_new_line()
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This modules takes care of testing optimizers using standard test functions.
subroutine, public test_optimizers(namespace)
Unit tests for different optimizers.
This module implements unit tests for the mixing methods.
subroutine, public mix_tests_run()
type(mpi_grp_t), public mpi_world
subroutine, public test_mpiwrappers
This module handles the communicators for the various parallelization strategies.
subroutine, public multigrid_end(mgrid)
subroutine, public multigrid_init(mgrid, namespace, space, mesh, der, stencil, mc, nlevels)
type(namespace_t), public global_namespace
subroutine, public orbitalbasis_end(this)
subroutine, public zorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public dorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public orbitalbasis_init(this, namespace, periodic_dim)
subroutine, public dorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public zorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public orbitalset_update_phase(os, dim, kpt, kpoints, spin_polarized, vec_pot, vec_pot_var, kpt_max)
Build the phase correction to the global phase in case the orbital crosses the border of the simulato...
subroutine, public dorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public zorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public poisson_test(this, space, mesh, latt, namespace, repetitions)
This routine checks the Hartree solver selected in the input file by calculating numerically and anal...
subroutine, public preconditioner_end(this)
subroutine, public preconditioner_init(this, namespace, gr, mc, space)
subroutine, public zproject_psi_batch(mesh, bnd, pj, npj, dim, psib, ppsib)
To optimize the application of the non-local operator in parallel, the projectors are applied in step...
Implementation details for regridding.
This module implements a simple hash table for string valued keys and integer values using the C++ ST...
subroutine, public sihash_insert(h, key, val)
Insert a (key, val) pair into the hash table h.
subroutine, public sihash_init(h)
Initialize a hash table h with size entries. Since we use separate chaining, the number of entries in...
integer function, public sihash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
subroutine, public sihash_end(h)
Free a hash table.
This module is intended to contain "only mathematical" functions and procedures.
This module implements a simple hash table for string valued keys and integer values using the C++ ST...
subroutine, public sphash_init(h)
Initialize a hash table h with size entries. Since we use separate chaining, the number of entries in...
subroutine, public sphash_insert(h, key, val, clone)
Insert a (key, val) pair into the hash table h. If clone=.true., the object will be copied.
subroutine, public sphash_end(h)
Free a hash table.
class(*) function, pointer, public sphash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
pure logical function, public states_are_real(st)
subroutine, public zstates_elec_calc_orth_test(st, namespace, mesh, kpoints)
subroutine, public dstates_elec_calc_orth_test(st, namespace, mesh, kpoints)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public states_elec_deallocate_wfns(st)
Deallocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
Allocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public dsubspace_diag(this, namespace, mesh, st, hm, ik, eigenval, diff, nonortho)
Diagonalises the Hamiltonian in the subspace defined by the states.
subroutine, public zsubspace_diag(this, namespace, mesh, st, hm, ik, eigenval, diff, nonortho)
Diagonalises the Hamiltonian in the subspace defined by the states.
Integration tests for ISDF.
subroutine, public test_isdf(namespace)
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 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)