55 use,
intrinsic :: iso_fortran_env
107 real(real64) :: shift_aux
108 type(derivatives_t),
pointer :: der_aux => null()
109 type(preconditioner_t) :: prec_aux
119 type(namespace_t),
intent(in) :: namespace
121 type(test_parameters_t) :: param
128 call param%init_from_file(namespace)
211 call parse_variable(namespace,
'TestMode', option__testmode__hartree, test_mode)
221 select case (test_mode)
222 case (option__testmode__hartree)
224 case (option__testmode__derivatives)
226 case (option__testmode__orthogonalization)
228 case (option__testmode__interpolation)
230 case (option__testmode__ion_interaction)
232 case (option__testmode__projector)
234 case (option__testmode__dft_u)
236 case (option__testmode__hamiltonian_apply)
238 case (option__testmode__density_calc)
240 case (option__testmode__exp_apply)
242 case (option__testmode__boundaries)
244 case (option__testmode__subspace_diag)
246 case (option__testmode__batch_ops)
248 case (option__testmode__clock)
250 case (option__testmode__linear_solver)
252 case (option__testmode__cgal)
254 case (option__testmode__dense_eigensolver)
256 case (option__testmode__grid_interpolation)
258 case (option__testmode__iihash)
260 case (option__testmode__sihash)
262 case (option__testmode__sphash)
264 case (option__testmode__mpiwrappers)
266 case (option__testmode__regridding)
268 case (option__testmode__helmholtz_decomposition)
270 case (option__testmode__vecpot_analytical)
272 case (option__testmode__current_density)
274 case (option__testmode__mixing_tests)
276 case (option__testmode__optimizers)
278 case (option__testmode__weighted_kmeans)
280 case (option__testmode__csv_input)
282 case (option__testmode__composition_chebyshev)
284 case (option__testmode__lalg_adv)
286 case (option__testmode__isdf_serial)
288 case (option__testmode__isdf)
306 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
308 call poisson_test(sys%hm%psolver, sys%space, sys%gr, sys%ions%latt, namespace, param%repetitions)
309 safe_deallocate_p(sys)
326 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
329 call helmholtz%init(namespace, sys%gr, sys%mc, sys%space)
332 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Hertzian dipole test"
336 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Gaussian test"
338 call gaussian_test(helmholtz, sys%gr, sys%namespace, sys%space)
340 safe_deallocate_p(sys)
347 use,
intrinsic :: iso_c_binding, only: c_ptr
351 real(real64),
allocatable :: rho(:), x(:),
center(:)
352 real(real64) :: rr, alpha, beta, res
355 real(real64),
parameter :: threshold = 1.e-7_real64
356 type(c_ptr) :: userdata(0)
362 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
368 shift_aux = 0.25_real64
376 alpha =
m_four * sys%gr%spacing(1)
377 beta =
m_one / (alpha**sys%space%dim *
sqrt(
m_pi)**sys%space%dim)
379 safe_allocate(
center(1:sys%space%dim))
382 safe_allocate(rho(1:sys%gr%np))
386 rho(ip) = beta*
exp(-(rr/alpha)**2)
389 safe_allocate(x(1:sys%gr%np))
395 write(
message(1),
'(a,i6,a)')
"Info: CG converged with ", iter,
" iterations."
396 write(
message(2),
'(a,e14.6)')
"Info: The residue is ", res
397 write(
message(3),
'(a,e14.6)')
"Info: Norm solution CG ",
dmf_nrm2(sys%gr, x)
402 safe_deallocate_a(rho)
403 safe_deallocate_p(sys)
418 use,
intrinsic :: iso_c_binding, only: c_ptr
419 real(real64),
contiguous,
intent(in) :: x(:)
420 real(real64),
contiguous,
intent(out) :: Hx(:)
421 type(c_ptr),
intent(in) :: userdata(:)
423 real(real64),
allocatable :: tmpx(:)
427 safe_allocate(tmpx(1:
mesh_aux%np_part))
432 safe_deallocate_a(tmpx)
444 complex(real64),
allocatable :: psi(:, :)
450 call messages_write(
'Info: Testing the nonlocal part of the pseudopotential with SOC')
455 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
464 call sys%st%group%psib(1, 1)%copy_to(epsib)
468 do itime = 1, param%repetitions
470 sys%hm%ep%natoms, 2, sys%st%group%psib(1, 1), epsib)
473 safe_allocate(psi(1:sys%gr%np, 1:sys%st%d%dim))
474 do itime = 1, epsib%nst
476 write(
message(1),
'(a,i1,3x, f12.6)')
"Norm state ", itime,
zmf_nrm2(sys%gr, 2, psi)
479 safe_deallocate_a(psi)
483 safe_deallocate_p(sys)
495 integer :: itime, ist
497 real(real64),
allocatable :: ddot(:,:,:), dweight(:,:)
498 complex(real64),
allocatable :: zdot(:,:,:), zweight(:,:)
499 logical :: skipSOrbitals, useAllOrbitals
512 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
517 if (sys%st%pack_states)
call sys%st%pack()
519 call sys%st%group%psib(1, 1)%copy_to(epsib2, copy_data = .
true.)
522 if (.not. sys%hm%phase%is_allocated())
then
523 call sys%st%group%psib(1, 1)%copy_to(epsib, copy_data = .
true.)
525 call sys%st%group%psib(1, 1)%copy_to(epsib)
526 call sys%hm%phase%apply_to(sys%gr, sys%gr%np, &
527 .false., epsib, src=sys%st%group%psib(1, 1))
528 epsib2%has_phase = .
true.
535 call parse_variable(namespace,
'UseAllAtomicOrbitals', .false., useallorbitals)
539 call dorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
540 skipsorbitals, useallorbitals, verbose=.false.)
541 safe_allocate(dweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
542 safe_allocate(ddot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
544 call zorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
545 skipsorbitals, useallorbitals, verbose=.false.)
547 safe_allocate(zweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
548 safe_allocate(zdot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
551 if (sys%hm%phase%is_allocated())
then
557 do itime = 1, param%repetitions
572 if (epsib%is_packed())
then
573 call epsib%do_unpack(force = .
true.)
576 do ist = 1, epsib%nst
578 write(
message(1),
'(a,i2,3x,e13.6)')
"Dotp state ", ist, ddot(1,1,ist)
580 write(
message(1),
'(a,i2,2(3x,e13.6))')
"Dotp state ", ist, zdot(1,1,ist)
588 safe_deallocate_a(dweight)
589 safe_deallocate_a(zweight)
590 safe_deallocate_a(ddot)
591 safe_deallocate_a(zdot)
597 safe_deallocate_p(sys)
609 integer :: itime, terms
628 call parse_variable(namespace,
'TestHamiltonianApply', option__testhamiltonianapply__term_all, terms)
629 if (terms == 0) terms = huge(1)
634 call messages_write(
'Info: Testing the application of the Hamiltonian')
639 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
646 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
649 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
651 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
653 call sys%st%group%psib(1, 1)%copy_to(hpsib)
655 if (sys%hm%apply_packed())
then
656 call sys%st%group%psib(1, 1)%do_pack()
657 call hpsib%do_pack(copy = .false.)
660 do itime = 1, param%repetitions
670 if (hpsib%is_packed())
then
671 call hpsib%do_unpack(force = .
true.)
676 call hpsib%end(copy = .false.)
678 safe_deallocate_p(sys)
701 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
706 if (sys%st%pack_states)
call sys%st%pack()
708 do itime = 1, param%repetitions
712 write(
message(1),
'(a,3x, f12.6)')
"Norm density ",
dmf_nrm2(sys%gr, sys%st%rho(:,1))
716 safe_deallocate_p(sys)
739 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
744 if (sys%st%pack_states)
call sys%st%pack()
746 do itime = 1, param%repetitions
747 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
753 safe_deallocate_p(sys)
767 integer,
allocatable :: degree(:)
775 call messages_write(
'Info: Testing Chebyshev filtering and its composition rule')
780 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
785 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
788 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
791 safe_allocate(degree(1:sys%st%group%nblocks))
801 call parse_variable(namespace,
'TestCompositionOrder', 2, degree_n)
813 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
815 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
819 call messages_write(
'Info: Result after calling 2n-th order filtering')
825 call sys%st%group%psib(1, 1)%copy_to(psib, copy_data=.
true.)
828 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
829 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
831 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
832 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
843 safe_deallocate_a(degree)
844 safe_deallocate_p(bounds)
848 safe_deallocate_p(sys)
873 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
880 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
883 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
887 if (sys%hm%apply_packed())
then
888 call sys%st%group%psib(1, 1)%do_pack()
891 do itime = 1, param%repetitions
892 call te%apply_batch(sys%namespace, sys%gr, sys%hm, sys%st%group%psib(1, 1), 1e-3_real64)
898 safe_deallocate_p(sys)
912 real(real64),
allocatable :: diff(:)
923 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
929 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
932 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
934 call sdiag%init(sys%namespace, sys%st)
936 safe_allocate(diff(1:sys%st%nst))
938 do itime = 1, param%repetitions
940 call dsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
942 call zsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
946 safe_deallocate_a(diff)
951 safe_deallocate_p(sys)
963 integer :: itime, ops, ops_default, ist, jst, nst
965 real(real64),
allocatable :: tmp(:)
966 real(real64),
allocatable :: ddotv(:)
967 complex(real64),
allocatable :: zdotv(:)
968 real(real64),
allocatable :: ddot(:,:), df(:,:), dweight(:), dpoints(:,:,:)
969 complex(real64),
allocatable :: zdot(:,:), zf(:,:), zweight(:), zpoints(:,:,:)
970 integer :: sp, block_size, size
999 option__testbatchops__ops_axpy + &
1000 option__testbatchops__ops_scal + &
1001 option__testbatchops__ops_nrm2 + &
1002 option__testbatchops__ops_dotp_matrix + &
1003 option__testbatchops__ops_dotp_self + &
1004 option__testbatchops__ops_dotp_vector + &
1005 option__testbatchops__ops_ax_function_py + &
1006 option__testbatchops__ops_get_points
1017 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
1018 call sys%init_parallelization(
mpi_world)
1022 if (sys%st%pack_states)
call sys%st%pack()
1024 if (
bitand(ops, option__testbatchops__ops_axpy) /= 0)
then
1025 message(1) =
'Info: Testing axpy'
1028 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1029 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1031 do itime = 1, param%repetitions
1032 call batch_axpy(sys%gr%np, 0.1_real64, xx, yy)
1040 if (
bitand(ops, option__testbatchops__ops_scal) /= 0)
then
1041 message(1) =
'Info: Testing scal'
1044 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1045 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1047 do itime = 1, param%repetitions
1056 if (
bitand(ops, option__testbatchops__ops_nrm2) /= 0)
then
1057 message(1) =
'Info: Testing nrm2'
1060 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1061 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1063 safe_allocate(tmp(1:xx%nst))
1065 do itime = 1, param%repetitions
1068 do itime = 1, xx%nst
1069 write(
message(1),
'(a,i1,3x,e23.16)')
"Nrm2 norm state ", itime, tmp(itime)
1073 safe_deallocate_a(tmp)
1079 if (
bitand(ops, option__testbatchops__ops_dotp_matrix) /= 0)
then
1081 message(1) =
'Info: Testing dotp_matrix'
1084 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1085 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1087 nst = sys%st%group%psib(1, 1)%nst
1090 safe_allocate(ddot(1:nst, 1:nst))
1091 do itime = 1, param%repetitions
1097 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_matrix states', ist, jst, ddot(ist,jst)
1101 safe_deallocate_a(ddot)
1103 safe_allocate(zdot(1:nst, 1:nst))
1104 do itime = 1, param%repetitions
1110 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_matrix states', ist, jst, zdot(ist,jst)
1114 safe_deallocate_a(zdot)
1121 if (
bitand(ops, option__testbatchops__ops_dotp_vector) /= 0)
then
1123 message(1) =
'Info: Testing dotp_vector'
1126 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1127 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1129 nst = sys%st%group%psib(1, 1)%nst
1132 safe_allocate(ddotv(1:nst))
1133 do itime = 1, param%repetitions
1138 write(
message(ist),
'(a,i3,3x,e23.16)')
'Dotp_vector state', ist, ddotv(ist)
1141 safe_deallocate_a(ddotv)
1143 safe_allocate(zdotv(1:nst))
1144 do itime = 1, param%repetitions
1149 write(
message(ist),
'(a,i3,3x,2(e23.16,1x))')
'Dotp_vector state', ist, zdotv(ist)
1152 safe_deallocate_a(zdotv)
1159 if (
bitand(ops, option__testbatchops__ops_dotp_self) /= 0)
then
1161 message(1) =
'Info: Testing dotp_self'
1164 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1166 nst = sys%st%group%psib(1, 1)%nst
1169 safe_allocate(ddot(1:nst, 1:nst))
1170 do itime = 1, param%repetitions
1176 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_self states', ist, jst, ddot(ist,jst)
1180 safe_deallocate_a(ddot)
1182 safe_allocate(zdot(1:nst, 1:nst))
1183 do itime = 1, param%repetitions
1189 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_self states', ist, jst, zdot(ist,jst)
1193 safe_deallocate_a(zdot)
1199 if (
bitand(ops, option__testbatchops__ops_ax_function_py) /= 0)
then
1200 message(1) =
'Info: Testing ax_function_py'
1203 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1206 safe_allocate(df(sys%gr%np, sys%st%d%dim))
1207 safe_allocate(dweight(1:sys%st%group%psib(1, 1)%nst_linear))
1208 dweight = 0.1_real64
1211 do itime = 1, param%repetitions
1214 safe_deallocate_a(df)
1215 safe_deallocate_a(dweight)
1217 safe_allocate(zf(sys%gr%np, sys%st%d%dim))
1218 safe_allocate(zweight(1:sys%st%group%psib(1, 1)%nst_linear))
1219 zweight = cmplx(0.1_real64,
m_zero, real64)
1222 do itime = 1, param%repetitions
1225 safe_deallocate_a(zf)
1232 if (
bitand(ops, option__testbatchops__ops_get_points) /= 0)
then
1237 call sys%st%group%psib(1, 1)%copy_to(yy)
1243 safe_allocate(dpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1245 do itime = 1, param%repetitions
1246 do sp = 1, sys%gr%np, block_size
1247 size = min(block_size, sys%gr%np - sp + 1)
1252 safe_deallocate_a(dpoints)
1258 safe_allocate(zpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1260 do itime = 1, param%repetitions
1261 do sp = 1, sys%gr%np, block_size
1262 size = min(block_size, sys%gr%np - sp + 1)
1267 safe_deallocate_a(dpoints)
1278 safe_deallocate_p(sys)
1292 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
1293 call sys%init_parallelization(
mpi_world)
1295 message(1) =
'Info: Testing the finite-differences derivatives.'
1299 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1300 call dderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1303 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1304 call zderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1307 if (sys%space%dim > 1)
then
1311 safe_deallocate_p(sys)
1330 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
1331 call sys%init_parallelization(
mpi_world)
1333 message(1) =
'Info: Testing orthogonalization.'
1337 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1338 message(1) =
'Info: Real wave-functions.'
1340 do itime = 1, param%repetitions
1345 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1346 message(1) =
'Info: Complex wave-functions.'
1348 do itime = 1, param%repetitions
1353 safe_deallocate_p(sys)
1368 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
1369 call sys%init_parallelization(
mpi_world)
1371 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1380 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1382 call messages_write(
'Info: Testing complex interpolation routines')
1390 safe_deallocate_p(sys)
1405 sys =>
electrons_t(namespace, int(option__calculationmode__dummy, int32))
1406 call sys%init_parallelization(
mpi_world)
1408 call ion_interaction_test(sys%space, sys%ions%latt, sys%ions%atom, sys%ions%natoms, sys%ions%pos, &
1409 sys%gr%box%bounding_box_l, namespace, sys%mc)
1411 safe_deallocate_p(sys)
1420 type(
grid_t),
intent(in) :: gr
1421 class(
batch_t),
intent(inout) :: psib
1422 character(*),
optional,
intent(in) :: string
1425 complex(real64),
allocatable :: zpsi(:, :)
1426 real(real64),
allocatable :: dpsi(:, :)
1428 character(80) :: string_
1435 safe_allocate(dpsi(1:gr%np, 1:st%d%dim))
1437 safe_allocate(zpsi(1:gr%np, 1:st%d%dim))
1440 do itime = 1, psib%nst
1443 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
dmf_nrm2(gr, st%d%dim, dpsi)
1446 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
zmf_nrm2(gr, st%d%dim, zpsi)
1452 safe_deallocate_a(dpsi)
1454 safe_deallocate_a(zpsi)
1470 write(
message(1),
'(a)')
" Operation Counter Time Global step"
1485 call clock%set(
clock_t(time_step=
m_four, initial_iteration=1))
1489 write(
message(1),
'(a)')
" Clock comparisons:"
1492 other_clock =
clock_t(time_step=
m_one, initial_iteration=5)
1504 character(len=*),
intent(in) :: operation
1506 write(
message(1),
'(a17,1x,i6,1x,f10.1,1x,i16)') operation, clock%counter(), clock%value(), clock%global_step()
1511 character(len=*),
intent(in) :: condition
1512 logical,
intent(in) :: result
1514 write(
message(1),
'(a10," = ",i1," (",l1,")")') condition, abs(transfer(result, 0)), result
1531 message(1) =
"cgal_polyhedron_point_inside"
1543 integer :: N, ii, jj, N_list(4), i_N
1544 real(real64),
allocatable :: matrix(:, :), eigenvectors(:, :), eigenvalues(:), test(:)
1545 real(real64),
allocatable :: differences(:)
1549 n_list = [15, 32, 100, 500]
1553 safe_allocate(matrix(1:n, 1:n))
1554 safe_allocate(eigenvectors(1:n, 1:n))
1555 safe_allocate(eigenvalues(1:n))
1556 safe_allocate(test(1:n))
1557 safe_allocate(differences(1:n))
1563 matrix(ii, jj) = ii * jj
1568 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1572 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1573 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1575 write(
message(1),
"(A, I3, A, E13.6)")
"Parallel solver - N: ", n, &
1576 ", average difference: ", sum(differences)/n
1580 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1584 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1585 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1587 write(
message(1),
"(A, I3, A, E13.6)")
"Serial solver - N: ", n, &
1588 ", average difference: ", sum(differences)/n
1591 safe_deallocate_a(matrix)
1592 safe_deallocate_a(eigenvectors)
1593 safe_deallocate_a(eigenvalues)
1594 safe_deallocate_a(test)
1595 safe_deallocate_a(differences)
1602 class(
batch_t),
intent(inout) :: psib
1603 class(
mesh_t),
intent(in) :: mesh
1605 real(real64),
allocatable :: dff(:)
1606 complex(real64),
allocatable :: zff(:)
1608 real(real64) :: da, db, dc
1609 complex(real64) :: za, zb, zc
1614 da =
m_one/mesh%box%bounding_box_l(1)
1620 za = da +
m_zi*0.01_real64
1621 zb = db*
exp(
m_zi*0.345_real64)
1622 zc = dc -
m_zi*50.0_real64
1624 safe_allocate(zff(1:mesh%np))
1625 do ist = 1, psib%nst_linear
1629 zff(ip) = zb*
exp(-za*sum(mesh%x(:, ip)**2)) + zc
1634 safe_deallocate_a(zff)
1636 safe_allocate(dff(1:mesh%np))
1637 do ist = 1, psib%nst_linear
1641 dff(ip) = db*
exp(-da*sum(mesh%x(:, ip)**2)) + dc
1646 safe_deallocate_a(dff)
1660 call sys%init_parallelization(
mpi_world)
1663 sys%gr%stencil, sys%mc, nlevels=3)
1669 safe_deallocate_p(sys)
1685 write(
message(1),*)
'hash[1] :', found,
value
1689 write(
message(1),*)
'hash[2] :', found,
value
1693 write(
message(1),*)
'hash[3] :', found,
value
1705 integer ::
value, sum
1714 write(
message(1),*)
'hash["one"]: ', found,
value
1718 write(
message(1),*)
'hash["two"]: ', found,
value
1722 write(
message(1),*)
'hash["three"]: ', found,
value
1729 do while (it%has_next())
1730 value = it%get_next()
1732 write(
message(1),
'(I3,A,I5)') counter,
': hash[...] = ',
value
1734 counter = counter + 1
1736 write(
message(1),*)
'counter = ', counter
1737 write(
message(2),*)
'sum = ', sum
1759 class(*),
pointer :: value
1761 integer :: count_clock, count_space
1763 safe_allocate(clock_2)
1777 write(
message(1),*)
'hash["one"]: ', found,
value%counter()
1780 write(
message(1),*)
'hash["one"]: ', found,
value%short_info()
1783 write(
message(1),*)
'wrong type. found = ', found
1790 write(
message(1),*)
'hash["two"]: ', found,
value%counter()
1793 write(
message(1),*)
'hash["two"]: ', found,
value%short_info()
1796 write(
message(1),*)
'wrong type. found = ',found
1800 safe_deallocate_a(clock_2)
1805 write(
message(1),*)
'hash["three"]: ', found,
value%counter()
1808 write(
message(1),*)
'hash["three"]: ', found,
value%short_info()
1811 write(
message(1),*)
'wrong type. found = ',found
1820 do while (it%has_next())
1821 value => it%get_next()
1824 count_clock = count_clock + 1
1826 count_space = count_space + 1
1830 write(
message(1), *)
'Count_clock = ', count_clock
1831 write(
message(2), *)
'Count_space = ', count_space
1844 real(real64),
allocatable :: ff_A(:), ff_A_reference(:), ff_B(:), ff_B_reference(:), diff_A(:), diff_B(:)
1845 real(real64) :: norm_ff, norm_diff
1854 call sysa%init_parallelization(
mpi_world)
1855 call sysb%init_parallelization(
mpi_world)
1858 safe_allocate(ff_a(1:sysa%gr%np))
1859 safe_allocate(ff_a_reference(1:sysa%gr%np))
1860 safe_allocate(diff_a(1:sysa%gr%np))
1861 safe_allocate(ff_b(1:sysb%gr%np))
1862 safe_allocate(ff_b_reference(1:sysb%gr%np))
1863 safe_allocate(diff_b(1:sysb%gr%np))
1865 do ip = 1, sysa%gr%np
1866 ff_a_reference(ip) =
values(sysa%gr%x(:, ip))
1868 do ip = 1, sysb%gr%np
1869 ff_b_reference(ip) =
values(sysb%gr%x(:, ip))
1873 regridding =>
regridding_t(sysb%gr, sysa%gr, sysa%space, sysa%namespace)
1874 call regridding%do_transfer(ff_b, ff_a_reference)
1875 safe_deallocate_p(regridding)
1878 do ip = 1, sysb%gr%np
1880 ff_b_reference(ip) =
m_zero
1883 diff_b(ip) = abs(ff_b_reference(ip) - ff_b(ip))
1886 norm_ff =
dmf_nrm2(sysb%gr, ff_b_reference)
1887 norm_diff =
dmf_nrm2(sysb%gr, diff_b)
1889 write(
message(1),
'(a, E14.6)')
"Forward: difference of reference to mapped function (rel.): ", &
1894 sysb%gr, ff_b_reference,
unit_one, ierr)
1898 sysa%gr, ff_a_reference,
unit_one, ierr)
1901 regridding =>
regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
1902 call regridding%do_transfer(ff_a, ff_b_reference)
1903 safe_deallocate_p(regridding)
1905 do ip = 1, sysa%gr%np
1907 ff_a_reference(ip) =
m_zero
1910 diff_a(ip) = abs(ff_a_reference(ip) - ff_a(ip))
1913 norm_ff =
dmf_nrm2(sysa%gr, ff_a_reference)
1914 norm_diff =
dmf_nrm2(sysa%gr, diff_a)
1916 write(
message(1),
'(a, E14.6)')
"Backward: difference of reference to mapped function (rel.): ", &
1921 sysa%gr, ff_a_reference,
unit_one, ierr)
1925 sysb%gr, ff_b_reference,
unit_one, ierr)
1927 safe_deallocate_a(ff_a)
1928 safe_deallocate_a(ff_a_reference)
1929 safe_deallocate_a(ff_b)
1930 safe_deallocate_a(ff_b_reference)
1931 safe_deallocate_a(diff_a)
1932 safe_deallocate_a(diff_b)
1933 safe_deallocate_p(sysa)
1934 safe_deallocate_p(sysb)
1940 real(real64) function values(xx)
1941 real(real64),
intent(in) :: xx(:)
1942 real(real64) :: xx0(1:size(xx, dim=1))
1943 real(real64),
parameter :: aa =
m_half
1944 real(real64),
parameter :: bb =
m_four
1948 values = bb *
exp(-aa*sum((xx-xx0)**2))
1958 type(namespace_t),
intent(in) :: namespace
1960 class(maxwell_t),
pointer :: maxwell_system
1962 real(real64),
allocatable :: magnetic_field(:,:)
1963 real(real64),
allocatable :: vector_potential_mag(:,:)
1964 real(real64),
allocatable :: vector_potential_analytical(:,:)
1965 real(real64),
allocatable :: delta(:,:)
1966 real(real64) :: exp_factor
1970 real(real64) :: sigma
1971 integer :: ip, j, ierr, nn
1972 integer(int64) :: out_how
1973 character(len=MAX_PATH_LEN) :: fname, fname2, fname3
1976 maxwell_system => maxwell_t(namespace)
1977 sigma = maxwell_system%gr%box%bounding_box_l(1)/10_real64
1978 call maxwell_system%init_parallelization(mpi_world)
1980 safe_allocate(magnetic_field(1:maxwell_system%gr%np_part, 1:3))
1981 safe_allocate(vector_potential_mag(1:maxwell_system%gr%np_part, 1:3))
1982 safe_allocate(vector_potential_analytical(1:maxwell_system%gr%np_part, 1:3))
1983 safe_allocate(delta(1:maxwell_system%gr%np, 1:3))
1996 call parse_variable(namespace,
'TestVectorPotentialType', option__testvectorpotentialtype__bounded, nn)
1999 case (option__testvectorpotentialtype__bounded)
2000 do ip = 1, maxwell_system%gr%np_part
2001 xx = maxwell_system%gr%x(1, ip)
2002 yy = maxwell_system%gr%x(2, ip)
2003 zz = maxwell_system%gr%x(3, ip)
2004 exp_factor =
exp((-xx**2 - yy**2 - zz**2)*1/(2*sigma**2))
2005 magnetic_field(ip, 1) = exp_factor*yy*(1 - (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
2006 magnetic_field(ip, 2) = exp_factor * xx * (1 + (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
2007 magnetic_field(ip, 3) = exp_factor * 2 * xx * yy * zz * 1/(3*sigma**2)
2009 vector_potential_analytical(ip, 1) = m_third * xx * zz * exp_factor
2010 vector_potential_analytical(ip, 2) = - m_third * yy * zz * exp_factor
2011 vector_potential_analytical(ip, 3) = m_third * (-xx**2 + yy**2) * exp_factor
2013 case (option__testvectorpotentialtype__unbounded)
2015 do ip = 1, maxwell_system%gr%np_part
2016 magnetic_field(ip, 1) = maxwell_system%gr%x(2, ip)
2017 magnetic_field(ip, 2) = maxwell_system%gr%x(1, ip)
2018 magnetic_field(ip, 3) = m_zero
2020 vector_potential_analytical(ip, 1) = m_third * maxwell_system%gr%x(1, ip) * maxwell_system%gr%x(3, ip)
2021 vector_potential_analytical(ip, 2) = - m_third * maxwell_system%gr%x(2, ip) * maxwell_system%gr%x(3, ip)
2022 vector_potential_analytical(ip, 3) = - m_third * (maxwell_system%gr%x(1, ip)**2 - maxwell_system%gr%x(2, ip)**2)
2025 call maxwell_system%helmholtz%get_vector_potential(namespace, vector_potential_mag, magnetic_field)
2029 do ip = 1, maxwell_system%gr%np
2030 delta(ip,j) = vector_potential_analytical(ip, j) - vector_potential_mag(ip, j)
2035 write(message(j),*)
'j, norm2(delta)', j, norm2(delta(:,j))
2037 call messages_info(3)
2039 write(fname,
'(a)')
'deviation_from_analytical_formulation'
2040 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, maxwell_system%space, maxwell_system%gr, &
2041 delta, unit_one, ierr)
2042 write(fname2,
'(a)')
'vector_potential_analytical'
2043 call io_function_output_vector(out_how ,
'./' , trim(fname2), namespace, maxwell_system%space, maxwell_system%gr, &
2044 vector_potential_analytical, unit_one, ierr)
2045 write(fname3,
'(a)')
'vector_potential_mag'
2046 call io_function_output_vector(out_how ,
'./' , trim(fname3), namespace, maxwell_system%space, maxwell_system%gr, &
2047 vector_potential_mag, unit_one, ierr)
2049 safe_deallocate_a(magnetic_field)
2050 safe_deallocate_a(vector_potential_mag)
2051 safe_deallocate_a(vector_potential_analytical)
2052 safe_deallocate_a(delta)
2053 safe_deallocate_p(maxwell_system)
2059 type(multigrid_t),
intent(in) :: mgrid
2060 class(space_t),
intent(in) :: space
2062 real(real64),
allocatable :: guess0(:), res0(:), guess1(:)
2063 type(mesh_t),
pointer :: mesh0, mesh1
2064 real(real64) :: delta, xx(3,2), alpha, beta, rr
2065 integer :: nn, ip, ierr
2069 message(1) =
'Info: Testing the grid interpolation.'
2071 call messages_info(2)
2073 mesh0 => mgrid%level(0)%mesh
2074 mesh1 => mgrid%level(1)%mesh
2076 safe_allocate(guess0(1:mesh0%np_part))
2077 safe_allocate(res0(1:mesh0%np_part))
2078 safe_allocate(guess1(1:mesh1%np_part))
2080 alpha = m_four*mesh0%spacing(1)
2081 beta = m_one / (alpha**space%dim *
sqrt(m_pi)**space%dim)
2096 call mesh_r(mesh0, ip, rr, origin = xx(:, nn))
2097 guess0(ip) = guess0(ip) + (-1)**nn * beta*
exp(-(rr/alpha)**2)
2101 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_target", global_namespace, &
2102 space, mesh0, guess0, unit_one, ierr)
2103 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_target", global_namespace, &
2104 space, mesh0, guess0, unit_one, ierr)
2105 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_target", global_namespace, &
2106 space, mesh0, guess0, unit_one, ierr)
2113 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, injection)
2115 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2117 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_result", global_namespace, &
2118 space, mesh0, res0, unit_one, ierr)
2119 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_result", global_namespace, &
2120 space, mesh0, res0, unit_one, ierr)
2121 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_result", global_namespace, &
2122 space, mesh0, res0, unit_one, ierr)
2124 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2125 write(message(1),
'(a,e13.6)')
'Interpolation test (abs.) = ', delta
2131 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, fullweight)
2133 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2135 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"restriction_result", global_namespace, &
2136 space, mesh0, res0, unit_one, ierr)
2137 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"restriction_result", global_namespace, &
2138 space, mesh0, res0, unit_one, ierr)
2139 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"restriction_result", global_namespace, &
2140 space, mesh0, res0, unit_one, ierr)
2142 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2143 write(message(2),
'(a,e13.6)')
'Restriction test (abs.) = ', delta
2144 call messages_info(2)
2146 safe_deallocate_a(guess0)
2147 safe_deallocate_a(res0)
2148 safe_deallocate_a(guess1)
2156 type(namespace_t),
intent(in) :: namespace
2157 type(electrons_t),
pointer :: sys
2159 type(current_t) :: current
2160 character(len=MAX_PATH_LEN) :: fname
2161 integer :: ierr, ip, idir
2162 integer(int64) :: out_how
2163 real(real64),
allocatable :: current_para_ref(:,:), current_dia_ref(:,:), current_mag_ref(:,:), delta(:)
2164 real(real64) :: xx(3), rr, a0, mag_curr, sin_thet, sin_phi, cos_phi, vec_pot_slope
2165 complex(real64) :: alpha
2167 sys => electrons_t(namespace, int(option__calculationmode__dummy, int32))
2168 call sys%init_parallelization(mpi_world)
2170 alpha = (0.0_real64, 0.5_real64)
2172 vec_pot_slope = 0.4_real64
2174 call states_elec_allocate_wfns(sys%st, sys%gr, wfs_type = type_cmplx)
2177 call current_init(current, namespace)
2179 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st)
2181 safe_allocate(sys%hm%hm_base%vector_potential(1:3, 1:sys%gr%np))
2183 sys%hm%hm_base%vector_potential = m_zero
2184 do ip = 1, sys%gr%np
2185 xx = sys%gr%x(1:3, ip)
2186 sys%hm%hm_base%vector_potential(2, ip) = vec_pot_slope * xx(1) / p_c
2189 call states_elec_allocate_current(sys%st, sys%space, sys%gr)
2190 call density_calc(sys%st, sys%gr, sys%st%rho)
2192 call current_calculate(current, namespace, sys%gr, sys%hm, sys%space, sys%st)
2194 safe_allocate(current_para_ref(1:sys%gr%np,1:3))
2195 safe_allocate(current_dia_ref(1:sys%gr%np,1:3))
2196 safe_allocate(current_mag_ref(1:sys%gr%np,1:3))
2197 safe_allocate(delta(1:sys%gr%np))
2200 current_para_ref(:,:) = m_zero
2201 do ip = 1, sys%gr%np
2202 call mesh_r(sys%gr, ip, rr)
2203 xx = sys%gr%x(1:3, ip)
2204 if (rr > r_small)
then
2206 psi_1s(rr, a0) *
dr_psi_2s(rr, a0) ) * aimag(alpha) / (1 + abs(alpha)**2) * xx(1:3) / rr
2210 write(fname,
'(a)')
'current_para'
2211 out_how = io_function_fill_how(
"PlaneZ")
2212 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2213 sys%st%current_para(:,:,1), unit_one, ierr)
2215 write(fname,
'(a)')
'current_para-ref'
2216 out_how = io_function_fill_how(
"PlaneZ")
2217 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2218 current_para_ref(:,:), unit_one, ierr)
2222 delta(:) = current_para_ref(1:sys%gr%np, idir) - sys%st%current_para(1:sys%gr%np, idir, 1)
2223 write(message(idir),*)
'idir =',idir,
', norm2(delta paramagnetic)',norm2(delta)
2225 call messages_info(3)
2228 current_dia_ref(:,:) = m_zero
2229 do ip = 1, sys%gr%np
2230 call mesh_r(sys%gr, ip, rr)
2231 current_dia_ref(ip,1:3) = - sys%hm%hm_base%vector_potential(1:3,ip) *&
2235 write(fname,
'(a)')
'current_dia'
2236 out_how = io_function_fill_how(
"PlaneZ")
2237 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2238 sys%st%current_dia(:,:,1), unit_one, ierr)
2240 write(fname,
'(a)')
'current_dia-ref'
2241 out_how = io_function_fill_how(
"PlaneZ")
2242 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2243 current_dia_ref(:,:), unit_one, ierr)
2247 delta(:) = current_dia_ref(1:sys%gr%np, idir) - sys%st%current_dia(1:sys%gr%np, idir, 1)
2248 write(message(idir),*)
'idir =',idir,
', norm2(delta diamagnetic)',norm2(delta)
2250 call messages_info(3)
2253 call current_calculate_mag(sys%gr%der, sys%st)
2256 current_mag_ref(:,:) = m_zero
2257 do ip = 1, sys%gr%np
2258 call mesh_r(sys%gr, ip, rr)
2259 xx = sys%gr%x(1:3, ip)
2260 if (norm2(xx(1:2)) > r_small .and. rr > r_small)
then
2261 sin_thet = norm2(xx(1:2)) / rr
2262 sin_phi = xx(2) / norm2(xx(1:2))
2263 cos_phi = xx(1) / norm2(xx(1:2))
2267 current_mag_ref(ip,1) = m_half * mag_curr * sin_thet * sin_phi / (1+abs(alpha)**2)
2268 current_mag_ref(ip,2) = -m_half * mag_curr * sin_thet * cos_phi / (1+abs(alpha)**2)
2272 write(fname,
'(a)')
'current_mag'
2273 out_how = io_function_fill_how(
"PlaneZ")
2274 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2275 sys%st%current_mag(:,:,1), unit_one, ierr)
2277 write(fname,
'(a)')
'current_mag-ref'
2278 out_how = io_function_fill_how(
"PlaneZ")
2279 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2280 current_mag_ref(:,:), unit_one, ierr)
2284 delta(:) = current_mag_ref(1:sys%gr%np, idir) - sys%st%current_mag(1:sys%gr%np, idir, 1)
2285 write(message(idir),*)
'idir =',idir,
', norm2(delta magnetization)',norm2(delta)
2287 call messages_info(3)
2289 safe_deallocate_a(current_para_ref)
2290 safe_deallocate_a(current_dia_ref)
2291 safe_deallocate_a(current_mag_ref)
2292 safe_deallocate_a(delta)
2293 safe_deallocate_p(sys)
2299 class(batch_t),
intent(inout) :: psib
2300 class(mesh_t),
intent(in) :: mesh
2301 type(namespace_t),
intent(in) :: namespace
2302 complex(real64),
intent(in) :: alpha
2303 real(real64),
intent(in) :: a0
2305 complex(real64),
allocatable :: zff(:)
2312 safe_allocate(zff(1:mesh%np))
2313 if (type_is_complex(psib%type()))
then
2315 call mesh_r(mesh, ip, rr)
2317 call batch_set_state(psib, 1, mesh%np, zff)
2319 safe_deallocate_a(zff)
2321 write(message(1),*)
"States should be complex for the linear combination of hydrogenic states to work"
2322 call messages_info(1, namespace=namespace)
2329 real(real64),
intent(in) :: a0, rr
2330 complex(real64),
intent(in) :: alpha
2336 real(real64) function psi_1s(rr, a0)
2337 real(real64),
intent(in) :: a0, rr
2343 real(real64) function psi_2s(rr, a0)
2344 real(real64),
intent(in) :: a0, rr
2346 psi_2s =
sqrt(m_two) * a0**(-m_three/m_two) * (m_one - rr/(m_two * a0)) *
exp(-rr/(m_two * a0)) &
2347 / (m_two *
sqrt(m_pi))
2350 real(real64) function dr_psi_1s(rr, a0)
2351 real(real64),
intent(in) :: a0, rr
2356 real(real64) function dr_psi_2s(rr, a0)
2357 real(real64),
intent(in) :: a0, rr
2360 a0**(-m_five/m_two) *
exp(-rr/(m_two * a0)) / (
sqrt(m_two) * m_two *
sqrt(m_pi))
2365 type(namespace_t),
intent(in) :: namespace
2368 integer(int64) :: i, j, k
2369 integer(int64) :: dims(3)
2370 character(len=MAX_PATH_LEN) :: fname
2372 real(real64),
allocatable :: ff(:)
2382 call parse_variable(namespace,
'TestCSVFileName',
"", fname)
2384 message(1) =
"Attempting to probe "//trim(fname)
2385 call messages_info(1, namespace=namespace)
2387 call io_csv_get_info(fname, dims, ierr)
2389 message(1) =
"Probing successful."
2390 write(message(2),
'("found dimensions: ",3I20)') dims
2391 call messages_info(2, namespace=namespace)
2393 write(message(1),
'("Probing failed. ierr = ",I5)') ierr
2394 call messages_fatal(1, namespace=namespace)
2397 safe_allocate(ff(1:dims(1)*dims(2)*dims(3)))
2399 message(1) =
"Attempting to read "//trim(fname)
2400 call messages_info(1, namespace=namespace)
2402 call dread_csv(fname, dims(1)*dims(2)*dims(3), ff, ierr)
2404 message(1) =
"Reading successful."
2405 call messages_info(1, namespace=namespace)
2407 do k=1, min(4_int64, dims(3))
2408 do j=1, min(4_int64, dims(2))
2409 write(message(j),
'("data ",2I5, 1X, 4F8.2)') k, j, &
2410 (ff(i + dims(1)*(j-1) + dims(1)* dims(2)*(k-1)), i=1, min(4_int64, dims(1)))
2412 write(message(int(j, int32)),
'("")')
2413 call messages_info(int(j, int32), namespace=namespace)
2417 message(1) =
"Reading failed."
2418 call messages_fatal(1, namespace=namespace)
2421 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_lapl(der, ff, op_ff, ghost_update, set_bc, factor)
apply the Laplacian to a mesh function
This module provides unit tests for the derivatives.
subroutine, public zderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public dderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public derivatives_advanced_benchmark(this, namespace)
Further unit tests design to challenge numerical stability of the finite differences.
subroutine, public zchebyshev_filter(namespace, mesh, st, hm, degree, bounds, ik, normalize)
Chebyshev Filter.
subroutine, public dchebyshev_filter(namespace, mesh, st, hm, degree, bounds, ik, normalize)
Chebyshev Filter.
integer, parameter, public spin_polarized
subroutine, public exponential_init(te, namespace, full_batch)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_pi
some mathematical constants
complex(real64), parameter, public m_zi
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public zhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
subroutine, public dhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
type(hardware_t), public cpu_hardware
Global instance of CPU hardware specification.
integer, parameter, public sizeof_real64
Number of bytes to store a variable of type real(real64)
integer, parameter, public sizeof_complex64
Number of bytes to store a variable of type complex(real64)
The Helmholtz decomposition is intended to contain "only mathematical" functions and procedures to co...
Test suit for the Helmholtz decomposition module.
subroutine, public gaussian_test(helmholtz, sys_grid, namespace, space)
subroutine, public hertzian_dipole_test(helmholtz, sys_grid, namespace, space)
This module implements a simple hash table for non-negative integer keys and integer values.
subroutine, public iihash_end(h)
Free a hash table.
subroutine, public iihash_insert(h, key, val)
Insert a (key, val) pair into the hash table h.
integer function, public iihash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
subroutine, public iihash_init(h)
Initialize a hash table h.
subroutine, public dio_function_output(how, dir, fname, namespace, space, mesh, ff, unit, ierr, pos, atoms, grp, root)
Top-level IO routine for functions defined on the mesh.
integer(int64) function, public io_function_fill_how(where)
Use this function to quickly plot functions for debugging purposes: call dio_function_output(io_funct...
subroutine, public ion_interaction_test(space, latt, atom, natoms, pos, lsize, namespace, mc)
This modules takes care of testing some linear algebra routines.
subroutine, public test_exponential_matrix(namespace)
Unit tests for the exponential of a matrix.
This module defines functions over batches of mesh functions.
subroutine, public dmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public dmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public mesh_batch_nrm2(mesh, aa, nrm2, reduce)
Calculate the norms (norm2, not the square!) of a batch of mesh functions.
subroutine, public zmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
subroutine, public zmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public zmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public zmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public dmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public dmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
This module defines various routines, operating on mesh functions.
class(mesh_t), pointer, public mesh_aux
Globally-scoped pointer to the mesh instance.
real(real64) function, public dmf_dotp_aux(f1, f2)
dot product between two vectors (mesh functions)
subroutine, public mesh_init_mesh_aux(mesh)
Initialise a pointer to the grid/mesh, that is globally exposed, such that low level mesh operations ...
subroutine, public zmesh_interpolation_test(mesh)
subroutine, public dmesh_interpolation_test(mesh)
This module defines the meshes, which are used in Octopus.
pure subroutine, public mesh_r(mesh, ip, rr, origin, coords)
return the distance to the origin for a given grid point
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
character(len=512), private msg
subroutine, public messages_obsolete_variable(namespace, name, rep)
subroutine, public messages_new_line()
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This modules takes care of testing optimizers using standard test functions.
subroutine, public test_optimizers(namespace)
Unit tests for different optimizers.
This module implements unit tests for the mixing methods.
subroutine, public mix_tests_run()
type(mpi_grp_t), public mpi_world
subroutine, public test_mpiwrappers
This module handles the communicators for the various parallelization strategies.
subroutine, public multigrid_end(mgrid)
subroutine, public multigrid_init(mgrid, namespace, space, mesh, der, stencil, mc, nlevels)
type(namespace_t), public global_namespace
subroutine, public orbitalbasis_end(this)
subroutine, public zorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public dorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public orbitalbasis_init(this, namespace, periodic_dim)
subroutine, public dorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public zorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public orbitalset_update_phase(os, dim, kpt, kpoints, spin_polarized, vec_pot, vec_pot_var, kpt_max)
Build the phase correction to the global phase in case the orbital crosses the border of the simulato...
subroutine, public dorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public zorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public poisson_test(this, space, mesh, latt, namespace, repetitions)
This routine checks the Hartree solver selected in the input file by calculating numerically and anal...
subroutine, public preconditioner_end(this)
subroutine, public preconditioner_init(this, namespace, gr, mc, space)
subroutine, public zproject_psi_batch(mesh, bnd, pj, npj, dim, psib, ppsib)
To optimize the application of the non-local operator in parallel, the projectors are applied in step...
Implementation details for regridding.
This module implements a simple hash table for string valued keys and integer values using the C++ ST...
subroutine, public sihash_insert(h, key, val)
Insert a (key, val) pair into the hash table h.
subroutine, public sihash_init(h)
Initialize a hash table h with size entries. Since we use separate chaining, the number of entries in...
integer function, public sihash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
subroutine, public sihash_end(h)
Free a hash table.
This module is intended to contain "only mathematical" functions and procedures.
This module implements a simple hash table for string valued keys and integer values using the C++ ST...
subroutine, public sphash_init(h)
Initialize a hash table h with size entries. Since we use separate chaining, the number of entries in...
subroutine, public sphash_insert(h, key, val, clone)
Insert a (key, val) pair into the hash table h. If clone=.true., the object will be copied.
subroutine, public sphash_end(h)
Free a hash table.
class(*) function, pointer, public sphash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
pure logical function, public states_are_real(st)
subroutine, public zstates_elec_calc_orth_test(st, namespace, mesh, kpoints)
subroutine, public dstates_elec_calc_orth_test(st, namespace, mesh, kpoints)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public states_elec_deallocate_wfns(st)
Deallocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
Allocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public dsubspace_diag(this, namespace, mesh, st, hm, ik, eigenval, diff, nonortho)
Diagonalises the Hamiltonian in the subspace defined by the states.
subroutine, public zsubspace_diag(this, namespace, mesh, st, hm, ik, eigenval, diff, nonortho)
Diagonalises the Hamiltonian in the subspace defined by the states.
Integration tests for ISDF.
subroutine, public test_isdf(namespace, serial)
Set up an electron system, compute some optimal centroid positions, and use these to build a set of I...
subroutine, public test_weighted_kmeans(namespace)
Test weighted kmeans algorithm for a finite system.
This module implements a unit-test like runmode for Octopus.
subroutine set_der_aux(der)
real(real64) function psi_2s(rr, a0)
subroutine test_helmholtz_decomposition(namespace)
subroutine test_hartree(param, namespace)
subroutine test_derivatives(param, namespace)
subroutine laplacian_op(x, hx, userdata)
Computes .
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 write_condition_result(condition, result)
real(real64) function values(xx)