54 use,
intrinsic :: iso_fortran_env
104 real(real64) :: shift_aux
105 type(derivatives_t),
pointer :: der_aux => null()
106 type(preconditioner_t) :: prec_aux
116 type(namespace_t),
intent(in) :: namespace
118 type(test_parameters_t) :: param
125 call param%init_from_file(namespace)
208 select case (test_mode)
209 case (option__testmode__hartree)
211 case (option__testmode__derivatives)
213 case (option__testmode__orthogonalization)
215 case (option__testmode__interpolation)
217 case (option__testmode__ion_interaction)
219 case (option__testmode__projector)
221 case (option__testmode__dft_u)
223 case (option__testmode__hamiltonian_apply)
225 case (option__testmode__density_calc)
227 case (option__testmode__exp_apply)
229 case (option__testmode__boundaries)
231 case (option__testmode__subspace_diag)
233 case (option__testmode__batch_ops)
235 case (option__testmode__clock)
237 case (option__testmode__linear_solver)
239 case (option__testmode__cgal)
241 case (option__testmode__dense_eigensolver)
243 case (option__testmode__grid_interpolation)
245 case (option__testmode__iihash)
247 case (option__testmode__sihash)
249 case (option__testmode__sphash)
251 case (option__testmode__mpiwrappers)
253 case (option__testmode__regridding)
255 case (option__testmode__helmholtz_decomposition)
257 case (option__testmode__vecpot_analytical)
259 case (option__testmode__current_density)
261 case (option__testmode__mixing_tests)
263 case (option__testmode__optimizers)
265 case (option__testmode__weighted_kmeans)
267 case (option__testmode__csv_input)
269 case (option__testmode__composition_chebyshev)
287 sys =>
electrons_t(namespace, generate_epot=.false.)
289 call poisson_test(sys%hm%psolver, sys%space, sys%gr, sys%ions%latt, namespace, param%repetitions)
290 safe_deallocate_p(sys)
307 sys =>
electrons_t(namespace, generate_epot=.false.)
310 call helmholtz%init(namespace, sys%gr, sys%mc, sys%space)
313 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Hertzian dipole test"
317 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Gaussian test"
319 call gaussian_test(helmholtz, sys%gr, sys%namespace, sys%space)
321 safe_deallocate_p(sys)
331 real(real64),
allocatable :: rho(:), x(:),
center(:)
332 real(real64) :: rr, alpha, beta, res
335 real(real64),
parameter :: threshold = 1.e-7_real64
341 sys =>
electrons_t(namespace, generate_epot=.false.)
347 shift_aux = 0.25_real64
355 alpha =
m_four * sys%gr%spacing(1)
356 beta =
m_one / (alpha**sys%space%dim *
sqrt(
m_pi)**sys%space%dim)
358 safe_allocate(
center(1:sys%space%dim))
361 safe_allocate(rho(1:sys%gr%np))
365 rho(ip) = beta*
exp(-(rr/alpha)**2)
368 safe_allocate(x(1:sys%gr%np))
374 write(
message(1),
'(a,i6,a)')
"Info: CG converged with ", iter,
" iterations."
375 write(
message(2),
'(a,e14.6)')
"Info: The residue is ", res
376 write(
message(3),
'(a,e14.6)')
"Info: Norm solution CG ",
dmf_nrm2(sys%gr, x)
381 safe_deallocate_a(rho)
382 safe_deallocate_p(sys)
397 real(real64),
contiguous,
intent(in) :: x(:)
398 real(real64),
contiguous,
intent(out) :: Hx(:)
400 real(real64),
allocatable :: tmpx(:)
404 safe_allocate(tmpx(1:
mesh_aux%np_part))
409 safe_deallocate_a(tmpx)
424 complex(real64),
allocatable :: psi(:, :)
430 call messages_write(
'Info: Testing the nonlocal part of the pseudopotential with SOC')
435 sys =>
electrons_t(namespace, generate_epot=.false.)
444 call sys%st%group%psib(1, 1)%copy_to(epsib)
448 do itime = 1, param%repetitions
450 sys%hm%ep%natoms, 2, sys%st%group%psib(1, 1), epsib)
453 safe_allocate(psi(1:sys%gr%np, 1:sys%st%d%dim))
454 do itime = 1, epsib%nst
456 write(
message(1),
'(a,i1,3x, f12.6)')
"Norm state ", itime,
zmf_nrm2(sys%gr, 2, psi)
459 safe_deallocate_a(psi)
463 safe_deallocate_p(sys)
475 integer :: itime, ist
477 real(real64),
allocatable :: ddot(:,:,:), dweight(:,:)
478 complex(real64),
allocatable :: zdot(:,:,:), zweight(:,:)
491 sys =>
electrons_t(namespace, generate_epot=.false.)
496 if (sys%st%pack_states)
call sys%st%pack()
498 call sys%st%group%psib(1, 1)%copy_to(epsib2, copy_data = .
true.)
501 if (.not. sys%hm%phase%is_allocated())
then
502 call sys%st%group%psib(1, 1)%copy_to(epsib, copy_data = .
true.)
504 call sys%st%group%psib(1, 1)%copy_to(epsib)
505 call sys%hm%phase%apply_to(sys%gr, sys%gr%np, &
506 .false., epsib, src=sys%st%group%psib(1, 1))
507 epsib2%has_phase = .
true.
513 call dorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
514 sys%hm%phase%is_allocated(), .false., .false.)
515 safe_allocate(dweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
516 safe_allocate(ddot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
518 call zorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
519 sys%hm%phase%is_allocated(), .false., .false.)
521 safe_allocate(zweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
522 safe_allocate(zdot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
525 if (sys%hm%phase%is_allocated())
then
531 do itime = 1, param%repetitions
546 if (epsib%is_packed())
then
547 call epsib%do_unpack(force = .
true.)
550 do ist = 1, epsib%nst
552 write(
message(1),
'(a,i2,3x,e13.6)')
"Dotp state ", ist, ddot(1,1,ist)
554 write(
message(1),
'(a,i2,2(3x,e13.6))')
"Dotp state ", ist, zdot(1,1,ist)
562 safe_deallocate_a(dweight)
563 safe_deallocate_a(zweight)
564 safe_deallocate_a(ddot)
565 safe_deallocate_a(zdot)
571 safe_deallocate_p(sys)
583 integer :: itime, terms
602 call parse_variable(namespace,
'TestHamiltonianApply', option__testhamiltonianapply__term_all, terms)
603 if (terms == 0) terms = huge(1)
608 call messages_write(
'Info: Testing the application of the Hamiltonian')
613 sys =>
electrons_t(namespace, generate_epot=.false.)
620 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
623 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
625 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
627 call sys%st%group%psib(1, 1)%copy_to(hpsib)
629 if (sys%hm%apply_packed())
then
630 call sys%st%group%psib(1, 1)%do_pack()
631 call hpsib%do_pack(copy = .false.)
634 do itime = 1, param%repetitions
644 if (hpsib%is_packed())
then
645 call hpsib%do_unpack(force = .
true.)
650 call hpsib%end(copy = .false.)
652 safe_deallocate_p(sys)
675 sys =>
electrons_t(namespace, generate_epot=.false.)
680 if (sys%st%pack_states)
call sys%st%pack()
682 do itime = 1, param%repetitions
686 write(
message(1),
'(a,3x, f12.6)')
"Norm density ",
dmf_nrm2(sys%gr, sys%st%rho(:,1))
690 safe_deallocate_p(sys)
713 sys =>
electrons_t(namespace, generate_epot=.false.)
718 if (sys%st%pack_states)
call sys%st%pack()
720 do itime = 1, param%repetitions
721 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
727 safe_deallocate_p(sys)
741 integer,
allocatable :: degree(:)
749 call messages_write(
'Info: Testing Chebyshev filtering and its composition rule')
754 sys =>
electrons_t(namespace, generate_epot=.false.)
759 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
762 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
765 safe_allocate(degree(1:sys%st%group%nblocks))
775 call parse_variable(namespace,
'TestCompositionOrder', 2, degree_n)
787 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
789 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
793 call messages_write(
'Info: Result after calling 2n-th order filtering')
799 call sys%st%group%psib(1, 1)%copy_to(psib, copy_data=.
true.)
802 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
803 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
805 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
806 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
817 safe_deallocate_a(degree)
818 safe_deallocate_p(bounds)
822 safe_deallocate_p(sys)
847 sys =>
electrons_t(namespace, generate_epot=.false.)
854 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
857 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
861 if (sys%hm%apply_packed())
then
862 call sys%st%group%psib(1, 1)%do_pack()
865 do itime = 1, param%repetitions
866 call te%apply_batch(sys%namespace, sys%gr, sys%hm, sys%st%group%psib(1, 1), 1e-3_real64)
872 safe_deallocate_p(sys)
886 real(real64),
allocatable :: diff(:)
897 sys =>
electrons_t(namespace, generate_epot=.false.)
903 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
906 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
908 call sdiag%init(sys%namespace, sys%st)
910 safe_allocate(diff(1:sys%st%nst))
912 do itime = 1, param%repetitions
914 call dsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
916 call zsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
920 safe_deallocate_a(diff)
925 safe_deallocate_p(sys)
937 integer :: itime, ops, ops_default, ist, jst, nst
939 real(real64),
allocatable :: tmp(:)
940 real(real64),
allocatable :: ddotv(:)
941 complex(real64),
allocatable :: zdotv(:)
942 real(real64),
allocatable :: ddot(:,:), df(:,:), dweight(:), dpoints(:,:,:)
943 complex(real64),
allocatable :: zdot(:,:), zf(:,:), zweight(:), zpoints(:,:,:)
944 integer :: sp, block_size, size
973 option__testbatchops__ops_axpy + &
974 option__testbatchops__ops_scal + &
975 option__testbatchops__ops_nrm2 + &
976 option__testbatchops__ops_dotp_matrix + &
977 option__testbatchops__ops_dotp_self + &
978 option__testbatchops__ops_dotp_vector
989 sys =>
electrons_t(namespace, generate_epot=.false.)
994 if (sys%st%pack_states)
call sys%st%pack()
996 if (
bitand(ops, option__testbatchops__ops_axpy) /= 0)
then
997 message(1) =
'Info: Testing axpy'
1000 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1001 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1003 do itime = 1, param%repetitions
1004 call batch_axpy(sys%gr%np, 0.1_real64, xx, yy)
1012 if (
bitand(ops, option__testbatchops__ops_scal) /= 0)
then
1013 message(1) =
'Info: Testing scal'
1016 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1017 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1019 do itime = 1, param%repetitions
1028 if (
bitand(ops, option__testbatchops__ops_nrm2) /= 0)
then
1029 message(1) =
'Info: Testing nrm2'
1032 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1033 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1035 safe_allocate(tmp(1:xx%nst))
1037 do itime = 1, param%repetitions
1040 do itime = 1, xx%nst
1041 write(
message(1),
'(a,i1,3x,e23.16)')
"Nrm2 norm state ", itime, tmp(itime)
1045 safe_deallocate_a(tmp)
1051 if (
bitand(ops, option__testbatchops__ops_dotp_matrix) /= 0)
then
1053 message(1) =
'Info: Testing dotp_matrix'
1056 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1057 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1059 nst = sys%st%group%psib(1, 1)%nst
1062 safe_allocate(ddot(1:nst, 1:nst))
1063 do itime = 1, param%repetitions
1069 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_matrix states', ist, jst, ddot(ist,jst)
1073 safe_deallocate_a(ddot)
1075 safe_allocate(zdot(1:nst, 1:nst))
1076 do itime = 1, param%repetitions
1082 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_matrix states', ist, jst, zdot(ist,jst)
1086 safe_deallocate_a(zdot)
1093 if (
bitand(ops, option__testbatchops__ops_dotp_vector) /= 0)
then
1095 message(1) =
'Info: Testing dotp_vector'
1098 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1099 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1101 nst = sys%st%group%psib(1, 1)%nst
1104 safe_allocate(ddotv(1:nst))
1105 do itime = 1, param%repetitions
1110 write(
message(ist),
'(a,i3,3x,e23.16)')
'Dotp_vector state', ist, ddotv(ist)
1113 safe_deallocate_a(ddotv)
1115 safe_allocate(zdotv(1:nst))
1116 do itime = 1, param%repetitions
1121 write(
message(ist),
'(a,i3,3x,2(e23.16,1x))')
'Dotp_vector state', ist, zdotv(ist)
1124 safe_deallocate_a(zdotv)
1131 if (
bitand(ops, option__testbatchops__ops_dotp_self) /= 0)
then
1133 message(1) =
'Info: Testing dotp_self'
1136 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1138 nst = sys%st%group%psib(1, 1)%nst
1141 safe_allocate(ddot(1:nst, 1:nst))
1142 do itime = 1, param%repetitions
1148 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_self states', ist, jst, ddot(ist,jst)
1152 safe_deallocate_a(ddot)
1154 safe_allocate(zdot(1:nst, 1:nst))
1155 do itime = 1, param%repetitions
1161 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_self states', ist, jst, zdot(ist,jst)
1165 safe_deallocate_a(zdot)
1171 if (
bitand(ops, option__testbatchops__ops_ax_function_py) /= 0)
then
1172 message(1) =
'Info: Testing ax_function_py'
1175 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1178 safe_allocate(df(sys%gr%np, sys%st%d%dim))
1179 safe_allocate(dweight(1:sys%st%group%psib(1, 1)%nst_linear))
1180 dweight = 0.1_real64
1183 do itime = 1, param%repetitions
1186 safe_deallocate_a(df)
1187 safe_deallocate_a(dweight)
1189 safe_allocate(zf(sys%gr%np, sys%st%d%dim))
1190 safe_allocate(zweight(1:sys%st%group%psib(1, 1)%nst_linear))
1191 zweight = cmplx(0.1_real64,
m_zero, real64)
1194 do itime = 1, param%repetitions
1197 safe_deallocate_a(zf)
1198 safe_deallocate_a(zweight)
1205 if (
bitand(ops, option__testbatchops__ops_get_points) /= 0)
then
1210 call sys%st%group%psib(1, 1)%copy_to(yy)
1216 safe_allocate(dpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1218 do itime = 1, param%repetitions
1219 do sp = 1, sys%gr%np, block_size
1220 size = min(block_size, sys%gr%np - sp + 1)
1225 safe_deallocate_a(dpoints)
1231 safe_allocate(zpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1233 do itime = 1, param%repetitions
1234 do sp = 1, sys%gr%np, block_size
1235 size = min(block_size, sys%gr%np - sp + 1)
1240 safe_deallocate_a(zpoints)
1251 safe_deallocate_p(sys)
1265 sys =>
electrons_t(namespace, generate_epot=.false.)
1266 call sys%init_parallelization(
mpi_world)
1268 message(1) =
'Info: Testing the finite-differences derivatives.'
1272 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1273 call dderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1276 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1277 call zderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1280 safe_deallocate_p(sys)
1299 sys =>
electrons_t(namespace, generate_epot=.false.)
1300 call sys%init_parallelization(
mpi_world)
1302 message(1) =
'Info: Testing orthogonalization.'
1306 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1307 message(1) =
'Info: Real wave-functions.'
1309 do itime = 1, param%repetitions
1314 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1315 message(1) =
'Info: Complex wave-functions.'
1317 do itime = 1, param%repetitions
1322 safe_deallocate_p(sys)
1337 sys =>
electrons_t(namespace, generate_epot=.false.)
1338 call sys%init_parallelization(
mpi_world)
1340 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1349 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1351 call messages_write(
'Info: Testing complex interpolation routines')
1359 safe_deallocate_p(sys)
1374 sys =>
electrons_t(namespace, generate_epot=.false.)
1375 call sys%init_parallelization(
mpi_world)
1377 call ion_interaction_test(sys%space, sys%ions%latt, sys%ions%atom, sys%ions%natoms, sys%ions%pos, &
1378 sys%gr%box%bounding_box_l, namespace, sys%mc)
1380 safe_deallocate_p(sys)
1389 type(
grid_t),
intent(in) :: gr
1390 class(
batch_t),
intent(inout) :: psib
1391 character(*),
optional,
intent(in) :: string
1394 complex(real64),
allocatable :: zpsi(:, :)
1395 real(real64),
allocatable :: dpsi(:, :)
1397 character(80) :: string_
1404 safe_allocate(dpsi(1:gr%np, 1:st%d%dim))
1406 safe_allocate(zpsi(1:gr%np, 1:st%d%dim))
1409 do itime = 1, psib%nst
1412 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
dmf_nrm2(gr, st%d%dim, dpsi)
1415 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
zmf_nrm2(gr, st%d%dim, zpsi)
1421 safe_deallocate_a(dpsi)
1423 safe_deallocate_a(zpsi)
1439 write(
message(1),
'(a)')
" Operation Counter Time Global step"
1454 call clock%set(
clock_t(time_step=
m_four, initial_iteration=1))
1458 write(
message(1),
'(a)')
" Clock comparisons:"
1461 other_clock =
clock_t(time_step=
m_one, initial_iteration=5)
1473 character(len=*),
intent(in) :: operation
1475 write(
message(1),
'(a17,1x,i6,1x,f10.1,1x,i16)') operation, clock%counter(), clock%value(), clock%global_step()
1480 character(len=*),
intent(in) :: condition
1481 logical,
intent(in) :: result
1483 write(
message(1),
'(a10," = ",i1," (",l1,")")') condition, abs(transfer(result, 0)), result
1500 message(1) =
"cgal_polyhedron_point_inside"
1512 integer :: N, ii, jj, N_list(4), i_N
1513 real(real64),
allocatable :: matrix(:, :), eigenvectors(:, :), eigenvalues(:), test(:)
1514 real(real64),
allocatable :: differences(:)
1518 n_list = [15, 32, 100, 500]
1522 safe_allocate(matrix(1:n, 1:n))
1523 safe_allocate(eigenvectors(1:n, 1:n))
1524 safe_allocate(eigenvalues(1:n))
1525 safe_allocate(test(1:n))
1526 safe_allocate(differences(1:n))
1532 matrix(ii, jj) = ii * jj
1537 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1541 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1542 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1544 write(
message(1),
"(A, I3, A, E13.6)")
"Parallel solver - N: ", n, &
1545 ", average difference: ", sum(differences)/n
1549 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1553 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1554 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1556 write(
message(1),
"(A, I3, A, E13.6)")
"Serial solver - N: ", n, &
1557 ", average difference: ", sum(differences)/n
1560 safe_deallocate_a(matrix)
1561 safe_deallocate_a(eigenvectors)
1562 safe_deallocate_a(eigenvalues)
1563 safe_deallocate_a(test)
1564 safe_deallocate_a(differences)
1571 class(
batch_t),
intent(inout) :: psib
1574 real(real64),
allocatable :: dff(:)
1575 complex(real64),
allocatable :: zff(:)
1577 real(real64) :: da, db, dc
1578 complex(real64) :: za, zb, zc
1583 da =
m_one/mesh%box%bounding_box_l(1)
1589 za = da +
m_zi*0.01_real64
1590 zb = db*
exp(
m_zi*0.345_real64)
1591 zc = dc -
m_zi*50.0_real64
1593 safe_allocate(zff(1:mesh%np))
1594 do ist = 1, psib%nst_linear
1598 zff(ip) = zb*
exp(-za*sum(mesh%x(ip, :)**2)) + zc
1603 safe_deallocate_a(zff)
1605 safe_allocate(dff(1:mesh%np))
1606 do ist = 1, psib%nst_linear
1610 dff(ip) = db*
exp(-da*sum(mesh%x(ip, :)**2)) + dc
1615 safe_deallocate_a(dff)
1629 call sys%init_parallelization(
mpi_world)
1632 sys%gr%stencil, sys%mc, nlevels=3)
1638 safe_deallocate_p(sys)
1654 write(
message(1),*)
'hash[1] :', found,
value
1658 write(
message(1),*)
'hash[2] :', found,
value
1662 write(
message(1),*)
'hash[3] :', found,
value
1674 integer ::
value, sum
1683 write(
message(1),*)
'hash["one"]: ', found,
value
1687 write(
message(1),*)
'hash["two"]: ', found,
value
1691 write(
message(1),*)
'hash["three"]: ', found,
value
1698 do while (it%has_next())
1699 value = it%get_next()
1701 write(
message(1),
'(I3,A,I5)') counter,
': hash[...] = ',
value
1703 counter = counter + 1
1705 write(
message(1),*)
'counter = ', counter
1706 write(
message(2),*)
'sum = ', sum
1728 class(*),
pointer :: value
1730 integer :: count_clock, count_space
1732 safe_allocate(clock_2)
1746 write(
message(1),*)
'hash["one"]: ', found,
value%counter()
1749 write(
message(1),*)
'hash["one"]: ', found,
value%short_info()
1752 write(
message(1),*)
'wrong type. found = ', found
1759 write(
message(1),*)
'hash["two"]: ', found,
value%counter()
1762 write(
message(1),*)
'hash["two"]: ', found,
value%short_info()
1765 write(
message(1),*)
'wrong type. found = ',found
1769 safe_deallocate_a(clock_2)
1774 write(
message(1),*)
'hash["three"]: ', found,
value%counter()
1777 write(
message(1),*)
'hash["three"]: ', found,
value%short_info()
1780 write(
message(1),*)
'wrong type. found = ',found
1789 do while (it%has_next())
1790 value => it%get_next()
1793 count_clock = count_clock + 1
1795 count_space = count_space + 1
1799 write(
message(1), *)
'Count_clock = ', count_clock
1800 write(
message(2), *)
'Count_space = ', count_space
1813 real(real64),
allocatable :: ff_A(:), ff_A_reference(:), ff_B(:), ff_B_reference(:), diff_A(:), diff_B(:)
1814 real(real64) :: norm_ff, norm_diff
1823 call sysa%init_parallelization(
mpi_world)
1824 call sysb%init_parallelization(
mpi_world)
1827 safe_allocate(ff_a(1:sysa%gr%np))
1828 safe_allocate(ff_a_reference(1:sysa%gr%np))
1829 safe_allocate(diff_a(1:sysa%gr%np))
1830 safe_allocate(ff_b(1:sysb%gr%np))
1831 safe_allocate(ff_b_reference(1:sysb%gr%np))
1832 safe_allocate(diff_b(1:sysb%gr%np))
1834 do ip = 1, sysa%gr%np
1835 ff_a_reference(ip) =
values(sysa%gr%x(ip, :))
1837 do ip = 1, sysb%gr%np
1838 ff_b_reference(ip) =
values(sysb%gr%x(ip, :))
1842 regridding =>
regridding_t(sysb%gr, sysa%gr, sysa%space, sysa%namespace)
1843 call regridding%do_transfer(ff_b, ff_a_reference)
1844 safe_deallocate_p(regridding)
1847 do ip = 1, sysb%gr%np
1849 ff_b_reference(ip) =
m_zero
1852 diff_b(ip) = abs(ff_b_reference(ip) - ff_b(ip))
1855 norm_ff =
dmf_nrm2(sysb%gr, ff_b_reference)
1856 norm_diff =
dmf_nrm2(sysb%gr, diff_b)
1858 write(
message(1),
'(a, E14.6)')
"Forward: difference of reference to mapped function (rel.): ", &
1863 sysb%gr, ff_b_reference,
unit_one, ierr)
1867 sysa%gr, ff_a_reference,
unit_one, ierr)
1870 regridding =>
regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
1871 call regridding%do_transfer(ff_a, ff_b_reference)
1872 safe_deallocate_p(regridding)
1874 do ip = 1, sysa%gr%np
1876 ff_a_reference(ip) =
m_zero
1879 diff_a(ip) = abs(ff_a_reference(ip) - ff_a(ip))
1882 norm_ff =
dmf_nrm2(sysa%gr, ff_a_reference)
1883 norm_diff =
dmf_nrm2(sysa%gr, diff_a)
1885 write(
message(1),
'(a, E14.6)')
"Backward: difference of reference to mapped function (rel.): ", &
1890 sysa%gr, ff_a_reference,
unit_one, ierr)
1894 sysb%gr, ff_b_reference,
unit_one, ierr)
1896 safe_deallocate_a(ff_a)
1897 safe_deallocate_a(ff_a_reference)
1898 safe_deallocate_a(ff_b)
1899 safe_deallocate_a(ff_b_reference)
1900 safe_deallocate_a(diff_a)
1901 safe_deallocate_a(diff_b)
1902 safe_deallocate_p(sysa)
1903 safe_deallocate_p(sysb)
1909 real(real64) function values(xx)
1910 real(real64),
intent(in) :: xx(:)
1911 real(real64) :: xx0(1:size(xx, dim=1))
1912 real(real64),
parameter :: aa =
m_half
1913 real(real64),
parameter :: bb =
m_four
1917 values = bb *
exp(-aa*sum((xx-xx0)**2))
1927 type(namespace_t),
intent(in) :: namespace
1929 class(maxwell_t),
pointer :: maxwell_system
1931 real(real64),
allocatable :: magnetic_field(:,:)
1932 real(real64),
allocatable :: vector_potential_mag(:,:)
1933 real(real64),
allocatable :: vector_potential_analytical(:,:)
1934 real(real64),
allocatable :: delta(:,:)
1935 real(real64) :: exp_factor
1939 real(real64) :: sigma
1940 integer :: ip, j, ierr, nn
1941 integer(int64) :: out_how
1942 character(len=MAX_PATH_LEN) :: fname, fname2, fname3
1945 maxwell_system => maxwell_t(namespace)
1946 sigma = maxwell_system%gr%box%bounding_box_l(1)/10_real64
1947 call maxwell_system%init_parallelization(mpi_world)
1949 safe_allocate(magnetic_field(1:maxwell_system%gr%np_part, 1:3))
1950 safe_allocate(vector_potential_mag(1:maxwell_system%gr%np_part, 1:3))
1951 safe_allocate(vector_potential_analytical(1:maxwell_system%gr%np_part, 1:3))
1952 safe_allocate(delta(1:maxwell_system%gr%np, 1:3))
1965 call parse_variable(namespace,
'TestVectorPotentialType', option__testvectorpotentialtype__bounded, nn)
1968 case (option__testvectorpotentialtype__bounded)
1969 do ip = 1, maxwell_system%gr%np_part
1970 xx = maxwell_system%gr%x(ip, 1)
1971 yy = maxwell_system%gr%x(ip, 2)
1972 zz = maxwell_system%gr%x(ip, 3)
1973 exp_factor =
exp((-xx**2 - yy**2 - zz**2)*1/(2*sigma**2))
1974 magnetic_field(ip, 1) = exp_factor*yy*(1 - (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
1975 magnetic_field(ip, 2) = exp_factor * xx * (1 + (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
1976 magnetic_field(ip, 3) = exp_factor * 2 * xx * yy * zz * 1/(3*sigma**2)
1978 vector_potential_analytical(ip, 1) = m_third * xx * zz * exp_factor
1979 vector_potential_analytical(ip, 2) = - m_third * yy * zz * exp_factor
1980 vector_potential_analytical(ip, 3) = m_third * (-xx**2 + yy**2) * exp_factor
1982 case (option__testvectorpotentialtype__unbounded)
1983 do ip = 1, maxwell_system%gr%np_part
1984 magnetic_field(ip, 1) = maxwell_system%gr%x(ip, 2)
1985 magnetic_field(ip, 2) = maxwell_system%gr%x(ip, 1)
1986 magnetic_field(ip, 3) = m_zero
1988 vector_potential_analytical(ip, 1) = m_third * maxwell_system%gr%x(ip, 1) * maxwell_system%gr%x(ip, 3)
1989 vector_potential_analytical(ip, 2) = - m_third * maxwell_system%gr%x(ip, 2) * maxwell_system%gr%x(ip, 3)
1990 vector_potential_analytical(ip, 3) = - m_third * (maxwell_system%gr%x(ip, 1)**2 - maxwell_system%gr%x(ip, 2)**2)
1993 call maxwell_system%helmholtz%get_vector_potential(namespace, vector_potential_mag, magnetic_field)
1997 do ip = 1, maxwell_system%gr%np
1998 delta(ip,j) = vector_potential_analytical(ip, j) - vector_potential_mag(ip, j)
2003 write(message(j),*)
'j, norm2(delta)', j, norm2(delta(:,j))
2005 call messages_info(3)
2007 write(fname,
'(a)')
'deviation_from_analytical_formulation'
2008 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, maxwell_system%space, maxwell_system%gr, &
2009 delta, unit_one, ierr)
2010 write(fname2,
'(a)')
'vector_potential_analytical'
2011 call io_function_output_vector(out_how ,
'./' , trim(fname2), namespace, maxwell_system%space, maxwell_system%gr, &
2012 vector_potential_analytical, unit_one, ierr)
2013 write(fname3,
'(a)')
'vector_potential_mag'
2014 call io_function_output_vector(out_how ,
'./' , trim(fname3), namespace, maxwell_system%space, maxwell_system%gr, &
2015 vector_potential_mag, unit_one, ierr)
2017 safe_deallocate_a(magnetic_field)
2018 safe_deallocate_a(vector_potential_mag)
2019 safe_deallocate_a(vector_potential_analytical)
2020 safe_deallocate_a(delta)
2021 safe_deallocate_p(maxwell_system)
2027 type(multigrid_t),
intent(in) :: mgrid
2028 class(space_t),
intent(in) :: space
2030 real(real64),
allocatable :: guess0(:), res0(:), guess1(:)
2031 type(mesh_t),
pointer :: mesh0, mesh1
2032 real(real64) :: delta, xx(3,2), alpha, beta, rr
2033 integer :: nn, ip, ierr
2037 message(1) =
'Info: Testing the grid interpolation.'
2039 call messages_info(2)
2041 mesh0 => mgrid%level(0)%mesh
2042 mesh1 => mgrid%level(1)%mesh
2044 safe_allocate(guess0(1:mesh0%np_part))
2045 safe_allocate(res0(1:mesh0%np_part))
2046 safe_allocate(guess1(1:mesh1%np_part))
2048 alpha = m_four*mesh0%spacing(1)
2049 beta = m_one / (alpha**space%dim *
sqrt(m_pi)**space%dim)
2064 call mesh_r(mesh0, ip, rr, origin = xx(:, nn))
2065 guess0(ip) = guess0(ip) + (-1)**nn * beta*
exp(-(rr/alpha)**2)
2069 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_target", global_namespace, &
2070 space, mesh0, guess0, unit_one, ierr)
2071 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_target", global_namespace, &
2072 space, mesh0, guess0, unit_one, ierr)
2073 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_target", global_namespace, &
2074 space, mesh0, guess0, unit_one, ierr)
2081 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, injection)
2083 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2085 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_result", global_namespace, &
2086 space, mesh0, res0, unit_one, ierr)
2087 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_result", global_namespace, &
2088 space, mesh0, res0, unit_one, ierr)
2089 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_result", global_namespace, &
2090 space, mesh0, res0, unit_one, ierr)
2092 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2093 write(message(1),
'(a,e13.6)')
'Interpolation test (abs.) = ', delta
2099 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, fullweight)
2101 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2103 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"restriction_result", global_namespace, &
2104 space, mesh0, res0, unit_one, ierr)
2105 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"restriction_result", global_namespace, &
2106 space, mesh0, res0, unit_one, ierr)
2107 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"restriction_result", global_namespace, &
2108 space, mesh0, res0, unit_one, ierr)
2110 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2111 write(message(2),
'(a,e13.6)')
'Restriction test (abs.) = ', delta
2112 call messages_info(2)
2114 safe_deallocate_a(guess0)
2115 safe_deallocate_a(res0)
2116 safe_deallocate_a(guess1)
2124 type(namespace_t),
intent(in) :: namespace
2125 type(electrons_t),
pointer :: sys
2127 type(current_t) :: current
2128 character(len=MAX_PATH_LEN) :: fname
2129 integer :: ierr, ip, idir
2130 integer(int64) :: out_how
2131 real(real64),
allocatable :: current_para_ref(:,:), current_dia_ref(:,:), current_mag_ref(:,:), delta(:)
2132 real(real64) :: xx(3), rr, a0, mag_curr, sin_thet, sin_phi, cos_phi, vec_pot_slope
2133 complex(real64) :: alpha
2135 sys => electrons_t(namespace, generate_epot=.false.)
2136 call sys%init_parallelization(mpi_world)
2138 alpha = (0.0_real64, 0.5_real64)
2140 vec_pot_slope = 0.4_real64
2142 call states_elec_allocate_wfns(sys%st, sys%gr, wfs_type = type_cmplx)
2145 call current_init(current, namespace)
2147 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st)
2149 safe_allocate(sys%hm%hm_base%vector_potential(1:3, 1:sys%gr%np))
2151 sys%hm%hm_base%vector_potential = m_zero
2152 do ip = 1, sys%gr%np
2153 xx = sys%gr%x(ip, 1:3)
2154 sys%hm%hm_base%vector_potential(2, ip) = vec_pot_slope * xx(1) / p_c
2157 call states_elec_allocate_current(sys%st, sys%space, sys%gr)
2158 call density_calc(sys%st, sys%gr, sys%st%rho)
2160 call current_calculate(current, namespace, sys%gr, sys%hm, sys%space, sys%st)
2162 safe_allocate(current_para_ref(1:sys%gr%np,1:3))
2163 safe_allocate(current_dia_ref(1:sys%gr%np,1:3))
2164 safe_allocate(current_mag_ref(1:sys%gr%np,1:3))
2165 safe_allocate(delta(1:sys%gr%np))
2168 current_para_ref(:,:) = m_zero
2169 do ip = 1, sys%gr%np
2170 call mesh_r(sys%gr, ip, rr)
2171 xx = sys%gr%x(ip, 1:3)
2172 if (rr > r_small)
then
2174 psi_1s(rr, a0) *
dr_psi_2s(rr, a0) ) * aimag(alpha) / (1 + abs(alpha)**2) * xx(1:3) / rr
2178 write(fname,
'(a)')
'current_para'
2179 out_how = io_function_fill_how(
"PlaneZ")
2180 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2181 sys%st%current_para(:,:,1), unit_one, ierr)
2183 write(fname,
'(a)')
'current_para-ref'
2184 out_how = io_function_fill_how(
"PlaneZ")
2185 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2186 current_para_ref(:,:), unit_one, ierr)
2190 delta(:) = current_para_ref(1:sys%gr%np, idir) - sys%st%current_para(1:sys%gr%np, idir, 1)
2191 write(message(idir),*)
'idir =',idir,
', norm2(delta paramagnetic)',norm2(delta)
2193 call messages_info(3)
2196 current_dia_ref(:,:) = m_zero
2197 do ip = 1, sys%gr%np
2198 call mesh_r(sys%gr, ip, rr)
2199 current_dia_ref(ip,1:3) = - sys%hm%hm_base%vector_potential(1:3,ip) *&
2203 write(fname,
'(a)')
'current_dia'
2204 out_how = io_function_fill_how(
"PlaneZ")
2205 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2206 sys%st%current_dia(:,:,1), unit_one, ierr)
2208 write(fname,
'(a)')
'current_dia-ref'
2209 out_how = io_function_fill_how(
"PlaneZ")
2210 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2211 current_dia_ref(:,:), unit_one, ierr)
2215 delta(:) = current_dia_ref(1:sys%gr%np, idir) - sys%st%current_dia(1:sys%gr%np, idir, 1)
2216 write(message(idir),*)
'idir =',idir,
', norm2(delta diamagnetic)',norm2(delta)
2218 call messages_info(3)
2221 call current_calculate_mag(sys%gr%der, sys%st)
2224 current_mag_ref(:,:) = m_zero
2225 do ip = 1, sys%gr%np
2226 call mesh_r(sys%gr, ip, rr)
2227 xx = sys%gr%x(ip, 1:3)
2228 if (norm2(xx(1:2)) > r_small .and. rr > r_small)
then
2229 sin_thet = norm2(xx(1:2)) / rr
2230 sin_phi = xx(2) / norm2(xx(1:2))
2231 cos_phi = xx(1) / norm2(xx(1:2))
2235 current_mag_ref(ip,1) = m_half * mag_curr * sin_thet * sin_phi / (1+abs(alpha)**2)
2236 current_mag_ref(ip,2) = -m_half * mag_curr * sin_thet * cos_phi / (1+abs(alpha)**2)
2240 write(fname,
'(a)')
'current_mag'
2241 out_how = io_function_fill_how(
"PlaneZ")
2242 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2243 sys%st%current_mag(:,:,1), unit_one, ierr)
2245 write(fname,
'(a)')
'current_mag-ref'
2246 out_how = io_function_fill_how(
"PlaneZ")
2247 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2248 current_mag_ref(:,:), unit_one, ierr)
2252 delta(:) = current_mag_ref(1:sys%gr%np, idir) - sys%st%current_mag(1:sys%gr%np, idir, 1)
2253 write(message(idir),*)
'idir =',idir,
', norm2(delta magnetization)',norm2(delta)
2255 call messages_info(3)
2257 safe_deallocate_a(current_para_ref)
2258 safe_deallocate_a(current_dia_ref)
2259 safe_deallocate_a(current_mag_ref)
2260 safe_deallocate_a(delta)
2261 safe_deallocate_p(sys)
2267 class(batch_t),
intent(inout) :: psib
2268 class(mesh_t),
intent(in) :: mesh
2269 type(namespace_t),
intent(in) :: namespace
2270 complex(real64),
intent(in) :: alpha
2271 real(real64),
intent(in) :: a0
2273 complex(real64),
allocatable :: zff(:)
2280 safe_allocate(zff(1:mesh%np))
2281 if (type_is_complex(psib%type()))
then
2283 call mesh_r(mesh, ip, rr)
2286 call batch_set_state(psib, 1, mesh%np, zff)
2288 write(message(1),*)
"States should be complex for the linear combination of hydrogenic states to work"
2289 call messages_info(1, namespace=namespace)
2291 safe_deallocate_a(zff)
2297 real(real64),
intent(in) :: a0, rr
2298 complex(real64),
intent(in) :: alpha
2304 real(real64) function psi_1s(rr, a0)
2305 real(real64),
intent(in) :: a0, rr
2311 real(real64) function psi_2s(rr, a0)
2312 real(real64),
intent(in) :: a0, rr
2314 psi_2s =
sqrt(m_two) * a0**(-m_three/m_two) * (m_one - rr/(m_two * a0)) *
exp(-rr/(m_two * a0)) &
2315 / (m_two *
sqrt(m_pi))
2318 real(real64) function dr_psi_1s(rr, a0)
2319 real(real64),
intent(in) :: a0, rr
2324 real(real64) function dr_psi_2s(rr, a0)
2325 real(real64),
intent(in) :: a0, rr
2328 a0**(-m_five/m_two) *
exp(-rr/(m_two * a0)) / (
sqrt(m_two) * m_two *
sqrt(m_pi))
2335 type(namespace_t),
intent(in) :: namespace
2338 integer(int64) :: i, j, k
2339 integer(int64) :: dims(3)
2340 character(len=MAX_PATH_LEN) :: fname
2342 real(real64),
allocatable :: ff(:)
2352 call parse_variable(namespace,
'TestCSVFileName',
"", fname)
2354 message(1) =
"Attempting to probe "//trim(fname)
2355 call messages_info(1, namespace=namespace)
2357 call io_csv_get_info(fname, dims, ierr)
2359 message(1) =
"Probing successful."
2360 write(message(2),
'("found dimensions: ",3I20)') dims
2361 call messages_info(2, namespace=namespace)
2363 write(message(1),
'("Probing failed. ierr = ",I5)') ierr
2364 call messages_fatal(1, namespace=namespace)
2367 safe_allocate(ff(1:dims(1)*dims(2)*dims(3)))
2369 message(1) =
"Attempting to read "//trim(fname)
2370 call messages_info(1, namespace=namespace)
2372 call dread_csv(fname, dims(1)*dims(2)*dims(3), ff, ierr)
2374 message(1) =
"Reading successful."
2375 call messages_info(1, namespace=namespace)
2377 do k=1, min(4_int64, dims(3))
2378 do j=1, min(4_int64, dims(2))
2379 write(message(j),
'("data ",2I5, 1X, 4F8.2)') k, j, &
2380 (ff(i + dims(1)*(j-1) + dims(1)* dims(2)*(k-1)), i=1, min(4_int64, dims(1)))
2382 write(message(int(j, int32)),
'("")')
2383 call messages_info(int(j, int32), namespace=namespace)
2387 message(1) =
"Reading failed."
2388 call messages_fatal(1, namespace=namespace)
2391 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 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.
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), parameter, public type_cmplx
logical pure function, public type_is_complex(this)
This module defines the unit system, used for input and output.
type(unit_t), public unit_one
some special units required for particular quantities
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
Class defining batches of mesh functions.
Overload default constructor.
class 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)