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)
1204 if (
bitand(ops, option__testbatchops__ops_get_points) /= 0)
then
1209 call sys%st%group%psib(1, 1)%copy_to(yy)
1215 safe_allocate(dpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1217 do itime = 1, param%repetitions
1218 do sp = 1, sys%gr%np, block_size
1219 size = min(block_size, sys%gr%np - sp + 1)
1224 safe_deallocate_a(dpoints)
1230 safe_allocate(zpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1232 do itime = 1, param%repetitions
1233 do sp = 1, sys%gr%np, block_size
1234 size = min(block_size, sys%gr%np - sp + 1)
1239 safe_deallocate_a(dpoints)
1250 safe_deallocate_p(sys)
1264 sys =>
electrons_t(namespace, generate_epot=.false.)
1265 call sys%init_parallelization(
mpi_world)
1267 message(1) =
'Info: Testing the finite-differences derivatives.'
1271 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1272 call dderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1275 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1276 call zderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1279 safe_deallocate_p(sys)
1298 sys =>
electrons_t(namespace, generate_epot=.false.)
1299 call sys%init_parallelization(
mpi_world)
1301 message(1) =
'Info: Testing orthogonalization.'
1305 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1306 message(1) =
'Info: Real wave-functions.'
1308 do itime = 1, param%repetitions
1313 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1314 message(1) =
'Info: Complex wave-functions.'
1316 do itime = 1, param%repetitions
1321 safe_deallocate_p(sys)
1336 sys =>
electrons_t(namespace, generate_epot=.false.)
1337 call sys%init_parallelization(
mpi_world)
1339 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1348 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1350 call messages_write(
'Info: Testing complex interpolation routines')
1358 safe_deallocate_p(sys)
1373 sys =>
electrons_t(namespace, generate_epot=.false.)
1374 call sys%init_parallelization(
mpi_world)
1376 call ion_interaction_test(sys%space, sys%ions%latt, sys%ions%atom, sys%ions%natoms, sys%ions%pos, &
1377 sys%gr%box%bounding_box_l, namespace, sys%mc)
1379 safe_deallocate_p(sys)
1388 type(
grid_t),
intent(in) :: gr
1389 class(
batch_t),
intent(inout) :: psib
1390 character(*),
optional,
intent(in) :: string
1393 complex(real64),
allocatable :: zpsi(:, :)
1394 real(real64),
allocatable :: dpsi(:, :)
1396 character(80) :: string_
1403 safe_allocate(dpsi(1:gr%np, 1:st%d%dim))
1405 safe_allocate(zpsi(1:gr%np, 1:st%d%dim))
1408 do itime = 1, psib%nst
1411 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
dmf_nrm2(gr, st%d%dim, dpsi)
1414 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
zmf_nrm2(gr, st%d%dim, zpsi)
1420 safe_deallocate_a(dpsi)
1422 safe_deallocate_a(zpsi)
1438 write(
message(1),
'(a)')
" Operation Counter Time Global step"
1453 call clock%set(
clock_t(time_step=
m_four, initial_iteration=1))
1457 write(
message(1),
'(a)')
" Clock comparisons:"
1460 other_clock =
clock_t(time_step=
m_one, initial_iteration=5)
1472 character(len=*),
intent(in) :: operation
1474 write(
message(1),
'(a17,1x,i6,1x,f10.1,1x,i16)') operation, clock%counter(), clock%value(), clock%global_step()
1479 character(len=*),
intent(in) :: condition
1480 logical,
intent(in) :: result
1482 write(
message(1),
'(a10," = ",i1," (",l1,")")') condition, abs(transfer(result, 0)), result
1499 message(1) =
"cgal_polyhedron_point_inside"
1511 integer :: N, ii, jj, N_list(4), i_N
1512 real(real64),
allocatable :: matrix(:, :), eigenvectors(:, :), eigenvalues(:), test(:)
1513 real(real64),
allocatable :: differences(:)
1517 n_list = [15, 32, 100, 500]
1521 safe_allocate(matrix(1:n, 1:n))
1522 safe_allocate(eigenvectors(1:n, 1:n))
1523 safe_allocate(eigenvalues(1:n))
1524 safe_allocate(test(1:n))
1525 safe_allocate(differences(1:n))
1531 matrix(ii, jj) = ii * jj
1536 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1540 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1541 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1543 write(
message(1),
"(A, I3, A, E13.6)")
"Parallel solver - N: ", n, &
1544 ", average difference: ", sum(differences)/n
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)")
"Serial solver - N: ", n, &
1556 ", average difference: ", sum(differences)/n
1559 safe_deallocate_a(matrix)
1560 safe_deallocate_a(eigenvectors)
1561 safe_deallocate_a(eigenvalues)
1562 safe_deallocate_a(test)
1563 safe_deallocate_a(differences)
1570 class(
batch_t),
intent(inout) :: psib
1573 real(real64),
allocatable :: dff(:)
1574 complex(real64),
allocatable :: zff(:)
1576 real(real64) :: da, db, dc
1577 complex(real64) :: za, zb, zc
1582 da =
m_one/mesh%box%bounding_box_l(1)
1588 za = da +
m_zi*0.01_real64
1589 zb = db*
exp(
m_zi*0.345_real64)
1590 zc = dc -
m_zi*50.0_real64
1592 safe_allocate(zff(1:mesh%np))
1593 do ist = 1, psib%nst_linear
1597 zff(ip) = zb*
exp(-za*sum(mesh%x(ip, :)**2)) + zc
1602 safe_deallocate_a(zff)
1604 safe_allocate(dff(1:mesh%np))
1605 do ist = 1, psib%nst_linear
1609 dff(ip) = db*
exp(-da*sum(mesh%x(ip, :)**2)) + dc
1614 safe_deallocate_a(dff)
1628 call sys%init_parallelization(
mpi_world)
1631 sys%gr%stencil, sys%mc, nlevels=3)
1637 safe_deallocate_p(sys)
1653 write(
message(1),*)
'hash[1] :', found,
value
1657 write(
message(1),*)
'hash[2] :', found,
value
1661 write(
message(1),*)
'hash[3] :', found,
value
1673 integer ::
value, sum
1682 write(
message(1),*)
'hash["one"]: ', found,
value
1686 write(
message(1),*)
'hash["two"]: ', found,
value
1690 write(
message(1),*)
'hash["three"]: ', found,
value
1697 do while (it%has_next())
1698 value = it%get_next()
1700 write(
message(1),
'(I3,A,I5)') counter,
': hash[...] = ',
value
1702 counter = counter + 1
1704 write(
message(1),*)
'counter = ', counter
1705 write(
message(2),*)
'sum = ', sum
1727 class(*),
pointer :: value
1729 integer :: count_clock, count_space
1731 safe_allocate(clock_2)
1745 write(
message(1),*)
'hash["one"]: ', found,
value%counter()
1748 write(
message(1),*)
'hash["one"]: ', found,
value%short_info()
1751 write(
message(1),*)
'wrong type. found = ', found
1758 write(
message(1),*)
'hash["two"]: ', found,
value%counter()
1761 write(
message(1),*)
'hash["two"]: ', found,
value%short_info()
1764 write(
message(1),*)
'wrong type. found = ',found
1768 safe_deallocate_a(clock_2)
1773 write(
message(1),*)
'hash["three"]: ', found,
value%counter()
1776 write(
message(1),*)
'hash["three"]: ', found,
value%short_info()
1779 write(
message(1),*)
'wrong type. found = ',found
1788 do while (it%has_next())
1789 value => it%get_next()
1792 count_clock = count_clock + 1
1794 count_space = count_space + 1
1798 write(
message(1), *)
'Count_clock = ', count_clock
1799 write(
message(2), *)
'Count_space = ', count_space
1812 real(real64),
allocatable :: ff_A(:), ff_A_reference(:), ff_B(:), ff_B_reference(:), diff_A(:), diff_B(:)
1813 real(real64) :: norm_ff, norm_diff
1822 call sysa%init_parallelization(
mpi_world)
1823 call sysb%init_parallelization(
mpi_world)
1826 safe_allocate(ff_a(1:sysa%gr%np))
1827 safe_allocate(ff_a_reference(1:sysa%gr%np))
1828 safe_allocate(diff_a(1:sysa%gr%np))
1829 safe_allocate(ff_b(1:sysb%gr%np))
1830 safe_allocate(ff_b_reference(1:sysb%gr%np))
1831 safe_allocate(diff_b(1:sysb%gr%np))
1833 do ip = 1, sysa%gr%np
1834 ff_a_reference(ip) =
values(sysa%gr%x(ip, :))
1836 do ip = 1, sysb%gr%np
1837 ff_b_reference(ip) =
values(sysb%gr%x(ip, :))
1841 regridding =>
regridding_t(sysb%gr, sysa%gr, sysa%space, sysa%namespace)
1842 call regridding%do_transfer(ff_b, ff_a_reference)
1843 safe_deallocate_p(regridding)
1846 do ip = 1, sysb%gr%np
1848 ff_b_reference(ip) =
m_zero
1851 diff_b(ip) = abs(ff_b_reference(ip) - ff_b(ip))
1854 norm_ff =
dmf_nrm2(sysb%gr, ff_b_reference)
1855 norm_diff =
dmf_nrm2(sysb%gr, diff_b)
1857 write(
message(1),
'(a, E14.6)')
"Forward: difference of reference to mapped function (rel.): ", &
1862 sysb%gr, ff_b_reference,
unit_one, ierr)
1866 sysa%gr, ff_a_reference,
unit_one, ierr)
1869 regridding =>
regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
1870 call regridding%do_transfer(ff_a, ff_b_reference)
1871 safe_deallocate_p(regridding)
1873 do ip = 1, sysa%gr%np
1875 ff_a_reference(ip) =
m_zero
1878 diff_a(ip) = abs(ff_a_reference(ip) - ff_a(ip))
1881 norm_ff =
dmf_nrm2(sysa%gr, ff_a_reference)
1882 norm_diff =
dmf_nrm2(sysa%gr, diff_a)
1884 write(
message(1),
'(a, E14.6)')
"Backward: difference of reference to mapped function (rel.): ", &
1889 sysa%gr, ff_a_reference,
unit_one, ierr)
1893 sysb%gr, ff_b_reference,
unit_one, ierr)
1895 safe_deallocate_a(ff_a)
1896 safe_deallocate_a(ff_a_reference)
1897 safe_deallocate_a(ff_b)
1898 safe_deallocate_a(ff_b_reference)
1899 safe_deallocate_a(diff_a)
1900 safe_deallocate_a(diff_b)
1901 safe_deallocate_p(sysa)
1902 safe_deallocate_p(sysb)
1908 real(real64) function values(xx)
1909 real(real64),
intent(in) :: xx(:)
1910 real(real64) :: xx0(1:size(xx, dim=1))
1911 real(real64),
parameter :: aa =
m_half
1912 real(real64),
parameter :: bb =
m_four
1916 values = bb *
exp(-aa*sum((xx-xx0)**2))
1926 type(namespace_t),
intent(in) :: namespace
1928 class(maxwell_t),
pointer :: maxwell_system
1930 real(real64),
allocatable :: magnetic_field(:,:)
1931 real(real64),
allocatable :: vector_potential_mag(:,:)
1932 real(real64),
allocatable :: vector_potential_analytical(:,:)
1933 real(real64),
allocatable :: delta(:,:)
1934 real(real64) :: exp_factor
1938 real(real64) :: sigma
1939 integer :: ip, j, ierr, nn
1940 integer(int64) :: out_how
1941 character(len=MAX_PATH_LEN) :: fname, fname2, fname3
1944 maxwell_system => maxwell_t(namespace)
1945 sigma = maxwell_system%gr%box%bounding_box_l(1)/10_real64
1946 call maxwell_system%init_parallelization(mpi_world)
1948 safe_allocate(magnetic_field(1:maxwell_system%gr%np_part, 1:3))
1949 safe_allocate(vector_potential_mag(1:maxwell_system%gr%np_part, 1:3))
1950 safe_allocate(vector_potential_analytical(1:maxwell_system%gr%np_part, 1:3))
1951 safe_allocate(delta(1:maxwell_system%gr%np, 1:3))
1964 call parse_variable(namespace,
'TestVectorPotentialType', option__testvectorpotentialtype__bounded, nn)
1967 case (option__testvectorpotentialtype__bounded)
1968 do ip = 1, maxwell_system%gr%np_part
1969 xx = maxwell_system%gr%x(ip, 1)
1970 yy = maxwell_system%gr%x(ip, 2)
1971 zz = maxwell_system%gr%x(ip, 3)
1972 exp_factor =
exp((-xx**2 - yy**2 - zz**2)*1/(2*sigma**2))
1973 magnetic_field(ip, 1) = exp_factor*yy*(1 - (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
1974 magnetic_field(ip, 2) = exp_factor * xx * (1 + (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
1975 magnetic_field(ip, 3) = exp_factor * 2 * xx * yy * zz * 1/(3*sigma**2)
1977 vector_potential_analytical(ip, 1) = m_third * xx * zz * exp_factor
1978 vector_potential_analytical(ip, 2) = - m_third * yy * zz * exp_factor
1979 vector_potential_analytical(ip, 3) = m_third * (-xx**2 + yy**2) * exp_factor
1981 case (option__testvectorpotentialtype__unbounded)
1982 do ip = 1, maxwell_system%gr%np_part
1983 magnetic_field(ip, 1) = maxwell_system%gr%x(ip, 2)
1984 magnetic_field(ip, 2) = maxwell_system%gr%x(ip, 1)
1985 magnetic_field(ip, 3) = m_zero
1987 vector_potential_analytical(ip, 1) = m_third * maxwell_system%gr%x(ip, 1) * maxwell_system%gr%x(ip, 3)
1988 vector_potential_analytical(ip, 2) = - m_third * maxwell_system%gr%x(ip, 2) * maxwell_system%gr%x(ip, 3)
1989 vector_potential_analytical(ip, 3) = - m_third * (maxwell_system%gr%x(ip, 1)**2 - maxwell_system%gr%x(ip, 2)**2)
1992 call maxwell_system%helmholtz%get_vector_potential(namespace, vector_potential_mag, magnetic_field)
1996 do ip = 1, maxwell_system%gr%np
1997 delta(ip,j) = vector_potential_analytical(ip, j) - vector_potential_mag(ip, j)
2002 write(message(j),*)
'j, norm2(delta)', j, norm2(delta(:,j))
2004 call messages_info(3)
2006 write(fname,
'(a)')
'deviation_from_analytical_formulation'
2007 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, maxwell_system%space, maxwell_system%gr, &
2008 delta, unit_one, ierr)
2009 write(fname2,
'(a)')
'vector_potential_analytical'
2010 call io_function_output_vector(out_how ,
'./' , trim(fname2), namespace, maxwell_system%space, maxwell_system%gr, &
2011 vector_potential_analytical, unit_one, ierr)
2012 write(fname3,
'(a)')
'vector_potential_mag'
2013 call io_function_output_vector(out_how ,
'./' , trim(fname3), namespace, maxwell_system%space, maxwell_system%gr, &
2014 vector_potential_mag, unit_one, ierr)
2016 safe_deallocate_a(magnetic_field)
2017 safe_deallocate_a(vector_potential_mag)
2018 safe_deallocate_a(vector_potential_analytical)
2019 safe_deallocate_a(delta)
2020 safe_deallocate_p(maxwell_system)
2026 type(multigrid_t),
intent(in) :: mgrid
2027 class(space_t),
intent(in) :: space
2029 real(real64),
allocatable :: guess0(:), res0(:), guess1(:)
2030 type(mesh_t),
pointer :: mesh0, mesh1
2031 real(real64) :: delta, xx(3,2), alpha, beta, rr
2032 integer :: nn, ip, ierr
2036 message(1) =
'Info: Testing the grid interpolation.'
2038 call messages_info(2)
2040 mesh0 => mgrid%level(0)%mesh
2041 mesh1 => mgrid%level(1)%mesh
2043 safe_allocate(guess0(1:mesh0%np_part))
2044 safe_allocate(res0(1:mesh0%np_part))
2045 safe_allocate(guess1(1:mesh1%np_part))
2047 alpha = m_four*mesh0%spacing(1)
2048 beta = m_one / (alpha**space%dim *
sqrt(m_pi)**space%dim)
2063 call mesh_r(mesh0, ip, rr, origin = xx(:, nn))
2064 guess0(ip) = guess0(ip) + (-1)**nn * beta*
exp(-(rr/alpha)**2)
2068 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_target", global_namespace, &
2069 space, mesh0, guess0, unit_one, ierr)
2070 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_target", global_namespace, &
2071 space, mesh0, guess0, unit_one, ierr)
2072 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_target", global_namespace, &
2073 space, mesh0, guess0, unit_one, ierr)
2080 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, injection)
2082 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2084 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_result", global_namespace, &
2085 space, mesh0, res0, unit_one, ierr)
2086 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_result", global_namespace, &
2087 space, mesh0, res0, unit_one, ierr)
2088 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_result", global_namespace, &
2089 space, mesh0, res0, unit_one, ierr)
2091 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2092 write(message(1),
'(a,e13.6)')
'Interpolation test (abs.) = ', delta
2098 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, fullweight)
2100 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2102 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"restriction_result", global_namespace, &
2103 space, mesh0, res0, unit_one, ierr)
2104 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"restriction_result", global_namespace, &
2105 space, mesh0, res0, unit_one, ierr)
2106 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"restriction_result", global_namespace, &
2107 space, mesh0, res0, unit_one, ierr)
2109 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2110 write(message(2),
'(a,e13.6)')
'Restriction test (abs.) = ', delta
2111 call messages_info(2)
2113 safe_deallocate_a(guess0)
2114 safe_deallocate_a(res0)
2115 safe_deallocate_a(guess1)
2123 type(namespace_t),
intent(in) :: namespace
2124 type(electrons_t),
pointer :: sys
2126 type(current_t) :: current
2127 character(len=MAX_PATH_LEN) :: fname
2128 integer :: ierr, ip, idir
2129 integer(int64) :: out_how
2130 real(real64),
allocatable :: current_para_ref(:,:), current_dia_ref(:,:), current_mag_ref(:,:), delta(:)
2131 real(real64) :: xx(3), rr, a0, mag_curr, sin_thet, sin_phi, cos_phi, vec_pot_slope
2132 complex(real64) :: alpha
2134 sys => electrons_t(namespace, generate_epot=.false.)
2135 call sys%init_parallelization(mpi_world)
2137 alpha = (0.0_real64, 0.5_real64)
2139 vec_pot_slope = 0.4_real64
2141 call states_elec_allocate_wfns(sys%st, sys%gr, wfs_type = type_cmplx)
2144 call current_init(current, namespace)
2146 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st)
2148 safe_allocate(sys%hm%hm_base%vector_potential(1:3, 1:sys%gr%np))
2150 sys%hm%hm_base%vector_potential = m_zero
2151 do ip = 1, sys%gr%np
2152 xx = sys%gr%x(ip, 1:3)
2153 sys%hm%hm_base%vector_potential(2, ip) = vec_pot_slope * xx(1) / p_c
2156 call states_elec_allocate_current(sys%st, sys%space, sys%gr)
2157 call density_calc(sys%st, sys%gr, sys%st%rho)
2159 call current_calculate(current, namespace, sys%gr, sys%hm, sys%space, sys%st)
2161 safe_allocate(current_para_ref(1:sys%gr%np,1:3))
2162 safe_allocate(current_dia_ref(1:sys%gr%np,1:3))
2163 safe_allocate(current_mag_ref(1:sys%gr%np,1:3))
2164 safe_allocate(delta(1:sys%gr%np))
2167 current_para_ref(:,:) = m_zero
2168 do ip = 1, sys%gr%np
2169 call mesh_r(sys%gr, ip, rr)
2170 xx = sys%gr%x(ip, 1:3)
2171 if (rr > r_small)
then
2173 psi_1s(rr, a0) *
dr_psi_2s(rr, a0) ) * aimag(alpha) / (1 + abs(alpha)**2) * xx(1:3) / rr
2177 write(fname,
'(a)')
'current_para'
2178 out_how = io_function_fill_how(
"PlaneZ")
2179 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2180 sys%st%current_para(:,:,1), unit_one, ierr)
2182 write(fname,
'(a)')
'current_para-ref'
2183 out_how = io_function_fill_how(
"PlaneZ")
2184 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2185 current_para_ref(:,:), unit_one, ierr)
2189 delta(:) = current_para_ref(1:sys%gr%np, idir) - sys%st%current_para(1:sys%gr%np, idir, 1)
2190 write(message(idir),*)
'idir =',idir,
', norm2(delta paramagnetic)',norm2(delta)
2192 call messages_info(3)
2195 current_dia_ref(:,:) = m_zero
2196 do ip = 1, sys%gr%np
2197 call mesh_r(sys%gr, ip, rr)
2198 current_dia_ref(ip,1:3) = - sys%hm%hm_base%vector_potential(1:3,ip) *&
2202 write(fname,
'(a)')
'current_dia'
2203 out_how = io_function_fill_how(
"PlaneZ")
2204 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2205 sys%st%current_dia(:,:,1), unit_one, ierr)
2207 write(fname,
'(a)')
'current_dia-ref'
2208 out_how = io_function_fill_how(
"PlaneZ")
2209 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2210 current_dia_ref(:,:), unit_one, ierr)
2214 delta(:) = current_dia_ref(1:sys%gr%np, idir) - sys%st%current_dia(1:sys%gr%np, idir, 1)
2215 write(message(idir),*)
'idir =',idir,
', norm2(delta diamagnetic)',norm2(delta)
2217 call messages_info(3)
2220 call current_calculate_mag(sys%gr%der, sys%st)
2223 current_mag_ref(:,:) = m_zero
2224 do ip = 1, sys%gr%np
2225 call mesh_r(sys%gr, ip, rr)
2226 xx = sys%gr%x(ip, 1:3)
2227 if (norm2(xx(1:2)) > r_small .and. rr > r_small)
then
2228 sin_thet = norm2(xx(1:2)) / rr
2229 sin_phi = xx(2) / norm2(xx(1:2))
2230 cos_phi = xx(1) / norm2(xx(1:2))
2234 current_mag_ref(ip,1) = m_half * mag_curr * sin_thet * sin_phi / (1+abs(alpha)**2)
2235 current_mag_ref(ip,2) = -m_half * mag_curr * sin_thet * cos_phi / (1+abs(alpha)**2)
2239 write(fname,
'(a)')
'current_mag'
2240 out_how = io_function_fill_how(
"PlaneZ")
2241 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2242 sys%st%current_mag(:,:,1), unit_one, ierr)
2244 write(fname,
'(a)')
'current_mag-ref'
2245 out_how = io_function_fill_how(
"PlaneZ")
2246 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2247 current_mag_ref(:,:), unit_one, ierr)
2251 delta(:) = current_mag_ref(1:sys%gr%np, idir) - sys%st%current_mag(1:sys%gr%np, idir, 1)
2252 write(message(idir),*)
'idir =',idir,
', norm2(delta magnetization)',norm2(delta)
2254 call messages_info(3)
2256 safe_deallocate_a(current_para_ref)
2257 safe_deallocate_a(current_dia_ref)
2258 safe_deallocate_a(current_mag_ref)
2259 safe_deallocate_a(delta)
2260 safe_deallocate_p(sys)
2266 class(batch_t),
intent(inout) :: psib
2267 class(mesh_t),
intent(in) :: mesh
2268 type(namespace_t),
intent(in) :: namespace
2269 complex(real64),
intent(in) :: alpha
2270 real(real64),
intent(in) :: a0
2272 complex(real64),
allocatable :: zff(:)
2279 safe_allocate(zff(1:mesh%np))
2280 if (type_is_complex(psib%type()))
then
2282 call mesh_r(mesh, ip, rr)
2284 call batch_set_state(psib, 1, mesh%np, zff)
2286 safe_deallocate_a(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)
2296 real(real64),
intent(in) :: a0, rr
2297 complex(real64),
intent(in) :: alpha
2303 real(real64) function psi_1s(rr, a0)
2304 real(real64),
intent(in) :: a0, rr
2310 real(real64) function psi_2s(rr, a0)
2311 real(real64),
intent(in) :: a0, rr
2313 psi_2s =
sqrt(m_two) * a0**(-m_three/m_two) * (m_one - rr/(m_two * a0)) *
exp(-rr/(m_two * a0)) &
2314 / (m_two *
sqrt(m_pi))
2317 real(real64) function dr_psi_1s(rr, a0)
2318 real(real64),
intent(in) :: a0, rr
2323 real(real64) function dr_psi_2s(rr, a0)
2324 real(real64),
intent(in) :: a0, rr
2327 a0**(-m_five/m_two) *
exp(-rr/(m_two * a0)) / (
sqrt(m_two) * m_two *
sqrt(m_pi))
2334 type(namespace_t),
intent(in) :: namespace
2337 integer(int64) :: i, j, k
2338 integer(int64) :: dims(3)
2339 character(len=MAX_PATH_LEN) :: fname
2341 real(real64),
allocatable :: ff(:)
2351 call parse_variable(namespace,
'TestCSVFileName',
"", fname)
2353 message(1) =
"Attempting to probe "//trim(fname)
2354 call messages_info(1, namespace=namespace)
2356 call io_csv_get_info(fname, dims, ierr)
2358 message(1) =
"Probing successful."
2359 write(message(2),
'("found dimensions: ",3I20)') dims
2360 call messages_info(2, namespace=namespace)
2362 write(message(1),
'("Probing failed. ierr = ",I5)') ierr
2363 call messages_fatal(1, namespace=namespace)
2366 safe_allocate(ff(1:dims(1)*dims(2)*dims(3)))
2368 message(1) =
"Attempting to read "//trim(fname)
2369 call messages_info(1, namespace=namespace)
2371 call dread_csv(fname, dims(1)*dims(2)*dims(3), ff, ierr)
2373 message(1) =
"Reading successful."
2374 call messages_info(1, namespace=namespace)
2376 do k=1, min(4_int64, dims(3))
2377 do j=1, min(4_int64, dims(2))
2378 write(message(j),
'("data ",2I5, 1X, 4F8.2)') k, j, &
2379 (ff(i + dims(1)*(j-1) + dims(1)* dims(2)*(k-1)), i=1, min(4_int64, dims(1)))
2381 write(message(int(j, int32)),
'("")')
2382 call messages_info(int(j, int32), namespace=namespace)
2386 message(1) =
"Reading failed."
2387 call messages_fatal(1, namespace=namespace)
2390 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), 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)