54 use,
intrinsic :: iso_fortran_env
106 real(real64) :: shift_aux
107 type(derivatives_t),
pointer :: der_aux => null()
108 type(preconditioner_t) :: prec_aux
118 type(namespace_t),
intent(in) :: namespace
120 type(test_parameters_t) :: param
127 call param%init_from_file(namespace)
207 call parse_variable(namespace,
'TestMode', option__testmode__hartree, test_mode)
217 select case (test_mode)
218 case (option__testmode__hartree)
220 case (option__testmode__derivatives)
222 case (option__testmode__orthogonalization)
224 case (option__testmode__interpolation)
226 case (option__testmode__ion_interaction)
228 case (option__testmode__projector)
230 case (option__testmode__dft_u)
232 case (option__testmode__hamiltonian_apply)
234 case (option__testmode__density_calc)
236 case (option__testmode__exp_apply)
238 case (option__testmode__boundaries)
240 case (option__testmode__subspace_diag)
242 case (option__testmode__batch_ops)
244 case (option__testmode__clock)
246 case (option__testmode__linear_solver)
248 case (option__testmode__cgal)
250 case (option__testmode__dense_eigensolver)
252 case (option__testmode__grid_interpolation)
254 case (option__testmode__iihash)
256 case (option__testmode__sihash)
258 case (option__testmode__sphash)
260 case (option__testmode__mpiwrappers)
262 case (option__testmode__regridding)
264 case (option__testmode__helmholtz_decomposition)
266 case (option__testmode__vecpot_analytical)
268 case (option__testmode__current_density)
270 case (option__testmode__mixing_tests)
272 case (option__testmode__optimizers)
274 case (option__testmode__weighted_kmeans)
276 case (option__testmode__csv_input)
278 case (option__testmode__composition_chebyshev)
280 case (option__testmode__lalg_adv)
282 case (option__testmode__isdf_serial)
284 case (option__testmode__isdf)
302 sys =>
electrons_t(namespace, generate_epot=.false.)
304 call poisson_test(sys%hm%psolver, sys%space, sys%gr, sys%ions%latt, namespace, param%repetitions)
305 safe_deallocate_p(sys)
322 sys =>
electrons_t(namespace, generate_epot=.false.)
325 call helmholtz%init(namespace, sys%gr, sys%mc, sys%space)
328 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Hertzian dipole test"
332 write(
message(1),
'(a)')
"Helmholtz decomposition: beginning Gaussian test"
334 call gaussian_test(helmholtz, sys%gr, sys%namespace, sys%space)
336 safe_deallocate_p(sys)
343 use,
intrinsic :: iso_c_binding, only: c_ptr
347 real(real64),
allocatable :: rho(:), x(:),
center(:)
348 real(real64) :: rr, alpha, beta, res
351 real(real64),
parameter :: threshold = 1.e-7_real64
352 type(c_ptr) :: userdata(0)
358 sys =>
electrons_t(namespace, generate_epot=.false.)
364 shift_aux = 0.25_real64
372 alpha =
m_four * sys%gr%spacing(1)
373 beta =
m_one / (alpha**sys%space%dim *
sqrt(
m_pi)**sys%space%dim)
375 safe_allocate(
center(1:sys%space%dim))
378 safe_allocate(rho(1:sys%gr%np))
382 rho(ip) = beta*
exp(-(rr/alpha)**2)
385 safe_allocate(x(1:sys%gr%np))
391 write(
message(1),
'(a,i6,a)')
"Info: CG converged with ", iter,
" iterations."
392 write(
message(2),
'(a,e14.6)')
"Info: The residue is ", res
393 write(
message(3),
'(a,e14.6)')
"Info: Norm solution CG ",
dmf_nrm2(sys%gr, x)
398 safe_deallocate_a(rho)
399 safe_deallocate_p(sys)
414 use,
intrinsic :: iso_c_binding, only: c_ptr
415 real(real64),
contiguous,
intent(in) :: x(:)
416 real(real64),
contiguous,
intent(out) :: Hx(:)
417 type(c_ptr),
intent(in) :: userdata(:)
419 real(real64),
allocatable :: tmpx(:)
423 safe_allocate(tmpx(1:
mesh_aux%np_part))
428 safe_deallocate_a(tmpx)
440 complex(real64),
allocatable :: psi(:, :)
446 call messages_write(
'Info: Testing the nonlocal part of the pseudopotential with SOC')
451 sys =>
electrons_t(namespace, generate_epot=.false.)
460 call sys%st%group%psib(1, 1)%copy_to(epsib)
464 do itime = 1, param%repetitions
466 sys%hm%ep%natoms, 2, sys%st%group%psib(1, 1), epsib)
469 safe_allocate(psi(1:sys%gr%np, 1:sys%st%d%dim))
470 do itime = 1, epsib%nst
472 write(
message(1),
'(a,i1,3x, f12.6)')
"Norm state ", itime,
zmf_nrm2(sys%gr, 2, psi)
475 safe_deallocate_a(psi)
479 safe_deallocate_p(sys)
491 integer :: itime, ist
493 real(real64),
allocatable :: ddot(:,:,:), dweight(:,:)
494 complex(real64),
allocatable :: zdot(:,:,:), zweight(:,:)
507 sys =>
electrons_t(namespace, generate_epot=.false.)
512 if (sys%st%pack_states)
call sys%st%pack()
514 call sys%st%group%psib(1, 1)%copy_to(epsib2, copy_data = .
true.)
517 if (.not. sys%hm%phase%is_allocated())
then
518 call sys%st%group%psib(1, 1)%copy_to(epsib, copy_data = .
true.)
520 call sys%st%group%psib(1, 1)%copy_to(epsib)
521 call sys%hm%phase%apply_to(sys%gr, sys%gr%np, &
522 .false., epsib, src=sys%st%group%psib(1, 1))
523 epsib2%has_phase = .
true.
529 call dorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
530 sys%hm%phase%is_allocated(), .false., .false.)
531 safe_allocate(dweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
532 safe_allocate(ddot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
534 call zorbitalbasis_build(basis, sys%namespace, sys%ions, sys%gr, sys%st%d%kpt, sys%st%d%dim, &
535 sys%hm%phase%is_allocated(), .false., .false.)
537 safe_allocate(zweight(1:basis%orbsets(1)%norbs, 1:epsib%nst_linear))
538 safe_allocate(zdot(1:sys%st%d%dim, 1:basis%orbsets(1)%norbs, 1:epsib%nst))
541 if (sys%hm%phase%is_allocated())
then
547 do itime = 1, param%repetitions
562 if (epsib%is_packed())
then
563 call epsib%do_unpack(force = .
true.)
566 do ist = 1, epsib%nst
568 write(
message(1),
'(a,i2,3x,e13.6)')
"Dotp state ", ist, ddot(1,1,ist)
570 write(
message(1),
'(a,i2,2(3x,e13.6))')
"Dotp state ", ist, zdot(1,1,ist)
578 safe_deallocate_a(dweight)
579 safe_deallocate_a(zweight)
580 safe_deallocate_a(ddot)
581 safe_deallocate_a(zdot)
587 safe_deallocate_p(sys)
599 integer :: itime, terms
618 call parse_variable(namespace,
'TestHamiltonianApply', option__testhamiltonianapply__term_all, terms)
619 if (terms == 0) terms = huge(1)
624 call messages_write(
'Info: Testing the application of the Hamiltonian')
629 sys =>
electrons_t(namespace, generate_epot=.false.)
636 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
639 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
641 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
643 call sys%st%group%psib(1, 1)%copy_to(hpsib)
645 if (sys%hm%apply_packed())
then
646 call sys%st%group%psib(1, 1)%do_pack()
647 call hpsib%do_pack(copy = .false.)
650 do itime = 1, param%repetitions
660 if (hpsib%is_packed())
then
661 call hpsib%do_unpack(force = .
true.)
666 call hpsib%end(copy = .false.)
668 safe_deallocate_p(sys)
691 sys =>
electrons_t(namespace, generate_epot=.false.)
696 if (sys%st%pack_states)
call sys%st%pack()
698 do itime = 1, param%repetitions
702 write(
message(1),
'(a,3x, f12.6)')
"Norm density ",
dmf_nrm2(sys%gr, sys%st%rho(:,1))
706 safe_deallocate_p(sys)
729 sys =>
electrons_t(namespace, generate_epot=.false.)
734 if (sys%st%pack_states)
call sys%st%pack()
736 do itime = 1, param%repetitions
737 call boundaries_set(sys%gr%der%boundaries, sys%gr, sys%st%group%psib(1, 1))
743 safe_deallocate_p(sys)
757 integer,
allocatable :: degree(:)
765 call messages_write(
'Info: Testing Chebyshev filtering and its composition rule')
775 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
778 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
781 safe_allocate(degree(1:sys%st%group%nblocks))
791 call parse_variable(namespace,
'TestCompositionOrder', 2, degree_n)
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.)
809 call messages_write(
'Info: Result after calling 2n-th order filtering')
815 call sys%st%group%psib(1, 1)%copy_to(psib, copy_data=.
true.)
818 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
819 call dchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
821 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
822 call zchebyshev_filter(namespace, sys%gr, sys%st, sys%hm, degree, bounds, 1, normalize=.false.)
833 safe_deallocate_a(degree)
834 safe_deallocate_p(bounds)
838 safe_deallocate_p(sys)
863 sys =>
electrons_t(namespace, generate_epot=.false.)
870 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
873 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
877 if (sys%hm%apply_packed())
then
878 call sys%st%group%psib(1, 1)%do_pack()
881 do itime = 1, param%repetitions
882 call te%apply_batch(sys%namespace, sys%gr, sys%hm, sys%st%group%psib(1, 1), 1e-3_real64)
888 safe_deallocate_p(sys)
902 real(real64),
allocatable :: diff(:)
913 sys =>
electrons_t(namespace, generate_epot=.false.)
919 if (sys%st%pack_states .and. sys%hm%apply_packed())
call sys%st%pack()
922 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, sys%st, sys%ions, sys%ext_partners)
924 call sdiag%init(sys%namespace, sys%st)
926 safe_allocate(diff(1:sys%st%nst))
928 do itime = 1, param%repetitions
930 call dsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
932 call zsubspace_diag(sdiag, sys%namespace, sys%gr, sys%st, sys%hm, 1, sys%st%eigenval(:, 1), diff)
936 safe_deallocate_a(diff)
941 safe_deallocate_p(sys)
953 integer :: itime, ops, ops_default, ist, jst, nst
955 real(real64),
allocatable :: tmp(:)
956 real(real64),
allocatable :: ddotv(:)
957 complex(real64),
allocatable :: zdotv(:)
958 real(real64),
allocatable :: ddot(:,:), df(:,:), dweight(:), dpoints(:,:,:)
959 complex(real64),
allocatable :: zdot(:,:), zf(:,:), zweight(:), zpoints(:,:,:)
960 integer :: sp, block_size, size
989 option__testbatchops__ops_axpy + &
990 option__testbatchops__ops_scal + &
991 option__testbatchops__ops_nrm2 + &
992 option__testbatchops__ops_dotp_matrix + &
993 option__testbatchops__ops_dotp_self + &
994 option__testbatchops__ops_dotp_vector + &
995 option__testbatchops__ops_ax_function_py + &
996 option__testbatchops__ops_get_points
1007 sys =>
electrons_t(namespace, generate_epot=.false.)
1008 call sys%init_parallelization(
mpi_world)
1012 if (sys%st%pack_states)
call sys%st%pack()
1014 if (
bitand(ops, option__testbatchops__ops_axpy) /= 0)
then
1015 message(1) =
'Info: Testing axpy'
1018 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1019 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1021 do itime = 1, param%repetitions
1022 call batch_axpy(sys%gr%np, 0.1_real64, xx, yy)
1030 if (
bitand(ops, option__testbatchops__ops_scal) /= 0)
then
1031 message(1) =
'Info: Testing scal'
1034 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1035 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1037 do itime = 1, param%repetitions
1046 if (
bitand(ops, option__testbatchops__ops_nrm2) /= 0)
then
1047 message(1) =
'Info: Testing nrm2'
1050 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1051 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1053 safe_allocate(tmp(1:xx%nst))
1055 do itime = 1, param%repetitions
1058 do itime = 1, xx%nst
1059 write(
message(1),
'(a,i1,3x,e23.16)')
"Nrm2 norm state ", itime, tmp(itime)
1063 safe_deallocate_a(tmp)
1069 if (
bitand(ops, option__testbatchops__ops_dotp_matrix) /= 0)
then
1071 message(1) =
'Info: Testing dotp_matrix'
1074 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1075 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1077 nst = sys%st%group%psib(1, 1)%nst
1080 safe_allocate(ddot(1:nst, 1:nst))
1081 do itime = 1, param%repetitions
1087 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_matrix states', ist, jst, ddot(ist,jst)
1091 safe_deallocate_a(ddot)
1093 safe_allocate(zdot(1:nst, 1:nst))
1094 do itime = 1, param%repetitions
1100 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_matrix states', ist, jst, zdot(ist,jst)
1104 safe_deallocate_a(zdot)
1111 if (
bitand(ops, option__testbatchops__ops_dotp_vector) /= 0)
then
1113 message(1) =
'Info: Testing dotp_vector'
1116 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1117 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1119 nst = sys%st%group%psib(1, 1)%nst
1122 safe_allocate(ddotv(1:nst))
1123 do itime = 1, param%repetitions
1128 write(
message(ist),
'(a,i3,3x,e23.16)')
'Dotp_vector state', ist, ddotv(ist)
1131 safe_deallocate_a(ddotv)
1133 safe_allocate(zdotv(1:nst))
1134 do itime = 1, param%repetitions
1139 write(
message(ist),
'(a,i3,3x,2(e23.16,1x))')
'Dotp_vector state', ist, zdotv(ist)
1142 safe_deallocate_a(zdotv)
1149 if (
bitand(ops, option__testbatchops__ops_dotp_self) /= 0)
then
1151 message(1) =
'Info: Testing dotp_self'
1154 call sys%st%group%psib(1, 1)%copy_to(xx, copy_data = .
true.)
1156 nst = sys%st%group%psib(1, 1)%nst
1159 safe_allocate(ddot(1:nst, 1:nst))
1160 do itime = 1, param%repetitions
1166 write(
message(jst),
'(a,2i3,3x,e23.16)')
'Dotp_self states', ist, jst, ddot(ist,jst)
1170 safe_deallocate_a(ddot)
1172 safe_allocate(zdot(1:nst, 1:nst))
1173 do itime = 1, param%repetitions
1179 write(
message(jst),
'(a,2i3,3x,2(e23.16,1x))')
'Dotp_self states', ist, jst, zdot(ist,jst)
1183 safe_deallocate_a(zdot)
1189 if (
bitand(ops, option__testbatchops__ops_ax_function_py) /= 0)
then
1190 message(1) =
'Info: Testing ax_function_py'
1193 call sys%st%group%psib(1, 1)%copy_to(yy, copy_data = .
true.)
1196 safe_allocate(df(sys%gr%np, sys%st%d%dim))
1197 safe_allocate(dweight(1:sys%st%group%psib(1, 1)%nst_linear))
1198 dweight = 0.1_real64
1201 do itime = 1, param%repetitions
1204 safe_deallocate_a(df)
1205 safe_deallocate_a(dweight)
1207 safe_allocate(zf(sys%gr%np, sys%st%d%dim))
1208 safe_allocate(zweight(1:sys%st%group%psib(1, 1)%nst_linear))
1209 zweight = cmplx(0.1_real64,
m_zero, real64)
1212 do itime = 1, param%repetitions
1215 safe_deallocate_a(zf)
1222 if (
bitand(ops, option__testbatchops__ops_get_points) /= 0)
then
1227 call sys%st%group%psib(1, 1)%copy_to(yy)
1233 safe_allocate(dpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1235 do itime = 1, param%repetitions
1236 do sp = 1, sys%gr%np, block_size
1237 size = min(block_size, sys%gr%np - sp + 1)
1242 safe_deallocate_a(dpoints)
1248 safe_allocate(zpoints(1:sys%st%nst, 1:sys%st%d%dim, 1:block_size))
1250 do itime = 1, param%repetitions
1251 do sp = 1, sys%gr%np, block_size
1252 size = min(block_size, sys%gr%np - sp + 1)
1257 safe_deallocate_a(dpoints)
1268 safe_deallocate_p(sys)
1282 sys =>
electrons_t(namespace, generate_epot=.false.)
1283 call sys%init_parallelization(
mpi_world)
1285 message(1) =
'Info: Testing the finite-differences derivatives.'
1289 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1290 call dderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1293 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1294 call zderivatives_test(sys%gr%der, sys%namespace, param%repetitions, param%min_blocksize, param%max_blocksize)
1297 safe_deallocate_p(sys)
1316 sys =>
electrons_t(namespace, generate_epot=.false.)
1317 call sys%init_parallelization(
mpi_world)
1319 message(1) =
'Info: Testing orthogonalization.'
1323 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1324 message(1) =
'Info: Real wave-functions.'
1326 do itime = 1, param%repetitions
1331 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1332 message(1) =
'Info: Complex wave-functions.'
1334 do itime = 1, param%repetitions
1339 safe_deallocate_p(sys)
1354 sys =>
electrons_t(namespace, generate_epot=.false.)
1355 call sys%init_parallelization(
mpi_world)
1357 if (param%type == option__testtype__all .or. param%type == option__testtype__real)
then
1366 if (param%type == option__testtype__all .or. param%type == option__testtype__complex)
then
1368 call messages_write(
'Info: Testing complex interpolation routines')
1376 safe_deallocate_p(sys)
1391 sys =>
electrons_t(namespace, generate_epot=.false.)
1392 call sys%init_parallelization(
mpi_world)
1394 call ion_interaction_test(sys%space, sys%ions%latt, sys%ions%atom, sys%ions%natoms, sys%ions%pos, &
1395 sys%gr%box%bounding_box_l, namespace, sys%mc)
1397 safe_deallocate_p(sys)
1406 type(
grid_t),
intent(in) :: gr
1407 class(
batch_t),
intent(inout) :: psib
1408 character(*),
optional,
intent(in) :: string
1411 complex(real64),
allocatable :: zpsi(:, :)
1412 real(real64),
allocatable :: dpsi(:, :)
1414 character(80) :: string_
1421 safe_allocate(dpsi(1:gr%np, 1:st%d%dim))
1423 safe_allocate(zpsi(1:gr%np, 1:st%d%dim))
1426 do itime = 1, psib%nst
1429 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
dmf_nrm2(gr, st%d%dim, dpsi)
1432 write(
message(1),
'(a,i2,3x,e23.16)')
"Norm state "//trim(string_)//
" ", itime,
zmf_nrm2(gr, st%d%dim, zpsi)
1438 safe_deallocate_a(dpsi)
1440 safe_deallocate_a(zpsi)
1456 write(
message(1),
'(a)')
" Operation Counter Time Global step"
1471 call clock%set(
clock_t(time_step=
m_four, initial_iteration=1))
1475 write(
message(1),
'(a)')
" Clock comparisons:"
1478 other_clock =
clock_t(time_step=
m_one, initial_iteration=5)
1490 character(len=*),
intent(in) :: operation
1492 write(
message(1),
'(a17,1x,i6,1x,f10.1,1x,i16)') operation, clock%counter(), clock%value(), clock%global_step()
1497 character(len=*),
intent(in) :: condition
1498 logical,
intent(in) :: result
1500 write(
message(1),
'(a10," = ",i1," (",l1,")")') condition, abs(transfer(result, 0)), result
1517 message(1) =
"cgal_polyhedron_point_inside"
1529 integer :: N, ii, jj, N_list(4), i_N
1530 real(real64),
allocatable :: matrix(:, :), eigenvectors(:, :), eigenvalues(:), test(:)
1531 real(real64),
allocatable :: differences(:)
1535 n_list = [15, 32, 100, 500]
1539 safe_allocate(matrix(1:n, 1:n))
1540 safe_allocate(eigenvectors(1:n, 1:n))
1541 safe_allocate(eigenvalues(1:n))
1542 safe_allocate(test(1:n))
1543 safe_allocate(differences(1:n))
1549 matrix(ii, jj) = ii * jj
1554 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1558 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1559 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1561 write(
message(1),
"(A, I3, A, E13.6)")
"Parallel solver - N: ", n, &
1562 ", average difference: ", sum(differences)/n
1566 eigenvectors(1:n, 1:n) = matrix(1:n, 1:n)
1570 test(:) = matmul(matrix, eigenvectors(:, ii)) - eigenvalues(ii) * eigenvectors(:, ii)
1571 differences(ii) = sum(abs(test)) / sum(abs(eigenvectors(:, ii)))
1573 write(
message(1),
"(A, I3, A, E13.6)")
"Serial solver - N: ", n, &
1574 ", average difference: ", sum(differences)/n
1577 safe_deallocate_a(matrix)
1578 safe_deallocate_a(eigenvectors)
1579 safe_deallocate_a(eigenvalues)
1580 safe_deallocate_a(test)
1581 safe_deallocate_a(differences)
1588 class(
batch_t),
intent(inout) :: psib
1589 class(
mesh_t),
intent(in) :: mesh
1591 real(real64),
allocatable :: dff(:)
1592 complex(real64),
allocatable :: zff(:)
1594 real(real64) :: da, db, dc
1595 complex(real64) :: za, zb, zc
1600 da =
m_one/mesh%box%bounding_box_l(1)
1606 za = da +
m_zi*0.01_real64
1607 zb = db*
exp(
m_zi*0.345_real64)
1608 zc = dc -
m_zi*50.0_real64
1610 safe_allocate(zff(1:mesh%np))
1611 do ist = 1, psib%nst_linear
1615 zff(ip) = zb*
exp(-za*sum(mesh%x(ip, :)**2)) + zc
1620 safe_deallocate_a(zff)
1622 safe_allocate(dff(1:mesh%np))
1623 do ist = 1, psib%nst_linear
1627 dff(ip) = db*
exp(-da*sum(mesh%x(ip, :)**2)) + dc
1632 safe_deallocate_a(dff)
1646 call sys%init_parallelization(
mpi_world)
1649 sys%gr%stencil, sys%mc, nlevels=3)
1655 safe_deallocate_p(sys)
1671 write(
message(1),*)
'hash[1] :', found,
value
1675 write(
message(1),*)
'hash[2] :', found,
value
1679 write(
message(1),*)
'hash[3] :', found,
value
1691 integer ::
value, sum
1700 write(
message(1),*)
'hash["one"]: ', found,
value
1704 write(
message(1),*)
'hash["two"]: ', found,
value
1708 write(
message(1),*)
'hash["three"]: ', found,
value
1715 do while (it%has_next())
1716 value = it%get_next()
1718 write(
message(1),
'(I3,A,I5)') counter,
': hash[...] = ',
value
1720 counter = counter + 1
1722 write(
message(1),*)
'counter = ', counter
1723 write(
message(2),*)
'sum = ', sum
1745 class(*),
pointer :: value
1747 integer :: count_clock, count_space
1749 safe_allocate(clock_2)
1763 write(
message(1),*)
'hash["one"]: ', found,
value%counter()
1766 write(
message(1),*)
'hash["one"]: ', found,
value%short_info()
1769 write(
message(1),*)
'wrong type. found = ', found
1776 write(
message(1),*)
'hash["two"]: ', found,
value%counter()
1779 write(
message(1),*)
'hash["two"]: ', found,
value%short_info()
1782 write(
message(1),*)
'wrong type. found = ',found
1786 safe_deallocate_a(clock_2)
1791 write(
message(1),*)
'hash["three"]: ', found,
value%counter()
1794 write(
message(1),*)
'hash["three"]: ', found,
value%short_info()
1797 write(
message(1),*)
'wrong type. found = ',found
1806 do while (it%has_next())
1807 value => it%get_next()
1810 count_clock = count_clock + 1
1812 count_space = count_space + 1
1816 write(
message(1), *)
'Count_clock = ', count_clock
1817 write(
message(2), *)
'Count_space = ', count_space
1830 real(real64),
allocatable :: ff_A(:), ff_A_reference(:), ff_B(:), ff_B_reference(:), diff_A(:), diff_B(:)
1831 real(real64) :: norm_ff, norm_diff
1840 call sysa%init_parallelization(
mpi_world)
1841 call sysb%init_parallelization(
mpi_world)
1844 safe_allocate(ff_a(1:sysa%gr%np))
1845 safe_allocate(ff_a_reference(1:sysa%gr%np))
1846 safe_allocate(diff_a(1:sysa%gr%np))
1847 safe_allocate(ff_b(1:sysb%gr%np))
1848 safe_allocate(ff_b_reference(1:sysb%gr%np))
1849 safe_allocate(diff_b(1:sysb%gr%np))
1851 do ip = 1, sysa%gr%np
1852 ff_a_reference(ip) =
values(sysa%gr%x(ip, :))
1854 do ip = 1, sysb%gr%np
1855 ff_b_reference(ip) =
values(sysb%gr%x(ip, :))
1859 regridding =>
regridding_t(sysb%gr, sysa%gr, sysa%space, sysa%namespace)
1860 call regridding%do_transfer(ff_b, ff_a_reference)
1861 safe_deallocate_p(regridding)
1864 do ip = 1, sysb%gr%np
1866 ff_b_reference(ip) =
m_zero
1869 diff_b(ip) = abs(ff_b_reference(ip) - ff_b(ip))
1872 norm_ff =
dmf_nrm2(sysb%gr, ff_b_reference)
1873 norm_diff =
dmf_nrm2(sysb%gr, diff_b)
1875 write(
message(1),
'(a, E14.6)')
"Forward: difference of reference to mapped function (rel.): ", &
1880 sysb%gr, ff_b_reference,
unit_one, ierr)
1884 sysa%gr, ff_a_reference,
unit_one, ierr)
1887 regridding =>
regridding_t(sysa%gr, sysb%gr, sysb%space, sysb%namespace)
1888 call regridding%do_transfer(ff_a, ff_b_reference)
1889 safe_deallocate_p(regridding)
1891 do ip = 1, sysa%gr%np
1893 ff_a_reference(ip) =
m_zero
1896 diff_a(ip) = abs(ff_a_reference(ip) - ff_a(ip))
1899 norm_ff =
dmf_nrm2(sysa%gr, ff_a_reference)
1900 norm_diff =
dmf_nrm2(sysa%gr, diff_a)
1902 write(
message(1),
'(a, E14.6)')
"Backward: difference of reference to mapped function (rel.): ", &
1907 sysa%gr, ff_a_reference,
unit_one, ierr)
1911 sysb%gr, ff_b_reference,
unit_one, ierr)
1913 safe_deallocate_a(ff_a)
1914 safe_deallocate_a(ff_a_reference)
1915 safe_deallocate_a(ff_b)
1916 safe_deallocate_a(ff_b_reference)
1917 safe_deallocate_a(diff_a)
1918 safe_deallocate_a(diff_b)
1919 safe_deallocate_p(sysa)
1920 safe_deallocate_p(sysb)
1926 real(real64) function values(xx)
1927 real(real64),
intent(in) :: xx(:)
1928 real(real64) :: xx0(1:size(xx, dim=1))
1929 real(real64),
parameter :: aa =
m_half
1930 real(real64),
parameter :: bb =
m_four
1934 values = bb *
exp(-aa*sum((xx-xx0)**2))
1944 type(namespace_t),
intent(in) :: namespace
1946 class(maxwell_t),
pointer :: maxwell_system
1948 real(real64),
allocatable :: magnetic_field(:,:)
1949 real(real64),
allocatable :: vector_potential_mag(:,:)
1950 real(real64),
allocatable :: vector_potential_analytical(:,:)
1951 real(real64),
allocatable :: delta(:,:)
1952 real(real64) :: exp_factor
1956 real(real64) :: sigma
1957 integer :: ip, j, ierr, nn
1958 integer(int64) :: out_how
1959 character(len=MAX_PATH_LEN) :: fname, fname2, fname3
1962 maxwell_system => maxwell_t(namespace)
1963 sigma = maxwell_system%gr%box%bounding_box_l(1)/10_real64
1964 call maxwell_system%init_parallelization(mpi_world)
1966 safe_allocate(magnetic_field(1:maxwell_system%gr%np_part, 1:3))
1967 safe_allocate(vector_potential_mag(1:maxwell_system%gr%np_part, 1:3))
1968 safe_allocate(vector_potential_analytical(1:maxwell_system%gr%np_part, 1:3))
1969 safe_allocate(delta(1:maxwell_system%gr%np, 1:3))
1982 call parse_variable(namespace,
'TestVectorPotentialType', option__testvectorpotentialtype__bounded, nn)
1985 case (option__testvectorpotentialtype__bounded)
1986 do ip = 1, maxwell_system%gr%np_part
1987 xx = maxwell_system%gr%x(ip, 1)
1988 yy = maxwell_system%gr%x(ip, 2)
1989 zz = maxwell_system%gr%x(ip, 3)
1990 exp_factor =
exp((-xx**2 - yy**2 - zz**2)*1/(2*sigma**2))
1991 magnetic_field(ip, 1) = exp_factor*yy*(1 - (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
1992 magnetic_field(ip, 2) = exp_factor * xx * (1 + (-xx**2 + yy**2)/(3*sigma**2) - zz**2/(3*sigma**2))
1993 magnetic_field(ip, 3) = exp_factor * 2 * xx * yy * zz * 1/(3*sigma**2)
1995 vector_potential_analytical(ip, 1) = m_third * xx * zz * exp_factor
1996 vector_potential_analytical(ip, 2) = - m_third * yy * zz * exp_factor
1997 vector_potential_analytical(ip, 3) = m_third * (-xx**2 + yy**2) * exp_factor
1999 case (option__testvectorpotentialtype__unbounded)
2001 do ip = 1, maxwell_system%gr%np_part
2002 magnetic_field(ip, 1) = maxwell_system%gr%x(ip, 2)
2003 magnetic_field(ip, 2) = maxwell_system%gr%x(ip, 1)
2004 magnetic_field(ip, 3) = m_zero
2006 vector_potential_analytical(ip, 1) = m_third * maxwell_system%gr%x(ip, 1) * maxwell_system%gr%x(ip, 3)
2007 vector_potential_analytical(ip, 2) = - m_third * maxwell_system%gr%x(ip, 2) * maxwell_system%gr%x(ip, 3)
2008 vector_potential_analytical(ip, 3) = - m_third * (maxwell_system%gr%x(ip, 1)**2 - maxwell_system%gr%x(ip, 2)**2)
2011 call maxwell_system%helmholtz%get_vector_potential(namespace, vector_potential_mag, magnetic_field)
2015 do ip = 1, maxwell_system%gr%np
2016 delta(ip,j) = vector_potential_analytical(ip, j) - vector_potential_mag(ip, j)
2021 write(message(j),*)
'j, norm2(delta)', j, norm2(delta(:,j))
2023 call messages_info(3)
2025 write(fname,
'(a)')
'deviation_from_analytical_formulation'
2026 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, maxwell_system%space, maxwell_system%gr, &
2027 delta, unit_one, ierr)
2028 write(fname2,
'(a)')
'vector_potential_analytical'
2029 call io_function_output_vector(out_how ,
'./' , trim(fname2), namespace, maxwell_system%space, maxwell_system%gr, &
2030 vector_potential_analytical, unit_one, ierr)
2031 write(fname3,
'(a)')
'vector_potential_mag'
2032 call io_function_output_vector(out_how ,
'./' , trim(fname3), namespace, maxwell_system%space, maxwell_system%gr, &
2033 vector_potential_mag, unit_one, ierr)
2035 safe_deallocate_a(magnetic_field)
2036 safe_deallocate_a(vector_potential_mag)
2037 safe_deallocate_a(vector_potential_analytical)
2038 safe_deallocate_a(delta)
2039 safe_deallocate_p(maxwell_system)
2045 type(multigrid_t),
intent(in) :: mgrid
2046 class(space_t),
intent(in) :: space
2048 real(real64),
allocatable :: guess0(:), res0(:), guess1(:)
2049 type(mesh_t),
pointer :: mesh0, mesh1
2050 real(real64) :: delta, xx(3,2), alpha, beta, rr
2051 integer :: nn, ip, ierr
2055 message(1) =
'Info: Testing the grid interpolation.'
2057 call messages_info(2)
2059 mesh0 => mgrid%level(0)%mesh
2060 mesh1 => mgrid%level(1)%mesh
2062 safe_allocate(guess0(1:mesh0%np_part))
2063 safe_allocate(res0(1:mesh0%np_part))
2064 safe_allocate(guess1(1:mesh1%np_part))
2066 alpha = m_four*mesh0%spacing(1)
2067 beta = m_one / (alpha**space%dim *
sqrt(m_pi)**space%dim)
2082 call mesh_r(mesh0, ip, rr, origin = xx(:, nn))
2083 guess0(ip) = guess0(ip) + (-1)**nn * beta*
exp(-(rr/alpha)**2)
2087 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_target", global_namespace, &
2088 space, mesh0, guess0, unit_one, ierr)
2089 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_target", global_namespace, &
2090 space, mesh0, guess0, unit_one, ierr)
2091 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_target", global_namespace, &
2092 space, mesh0, guess0, unit_one, ierr)
2099 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, injection)
2101 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2103 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"interpolation_result", global_namespace, &
2104 space, mesh0, res0, unit_one, ierr)
2105 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"interpolation_result", global_namespace, &
2106 space, mesh0, res0, unit_one, ierr)
2107 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"interpolation_result", global_namespace, &
2108 space, mesh0, res0, unit_one, ierr)
2110 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2111 write(message(1),
'(a,e13.6)')
'Interpolation test (abs.) = ', delta
2117 call dmultigrid_fine2coarse(mgrid%level(1)%tt, mgrid%level(0)%der, mesh1, guess0, guess1, fullweight)
2119 call dmultigrid_coarse2fine(mgrid%level(1)%tt, mgrid%level(1)%der, mesh0, guess1, res0)
2121 call dio_function_output (io_function_fill_how(
'AxisX'),
".",
"restriction_result", global_namespace, &
2122 space, mesh0, res0, unit_one, ierr)
2123 call dio_function_output (io_function_fill_how(
'AxisZ'),
".",
"restriction_result", global_namespace, &
2124 space, mesh0, res0, unit_one, ierr)
2125 call dio_function_output (io_function_fill_how(
'PlaneZ'),
".",
"restriction_result", global_namespace, &
2126 space, mesh0, res0, unit_one, ierr)
2128 delta = dmf_nrm2(mesh0, guess0(1:mesh0%np)-res0(1:mesh0%np))
2129 write(message(2),
'(a,e13.6)')
'Restriction test (abs.) = ', delta
2130 call messages_info(2)
2132 safe_deallocate_a(guess0)
2133 safe_deallocate_a(res0)
2134 safe_deallocate_a(guess1)
2142 type(namespace_t),
intent(in) :: namespace
2143 type(electrons_t),
pointer :: sys
2145 type(current_t) :: current
2146 character(len=MAX_PATH_LEN) :: fname
2147 integer :: ierr, ip, idir
2148 integer(int64) :: out_how
2149 real(real64),
allocatable :: current_para_ref(:,:), current_dia_ref(:,:), current_mag_ref(:,:), delta(:)
2150 real(real64) :: xx(3), rr, a0, mag_curr, sin_thet, sin_phi, cos_phi, vec_pot_slope
2151 complex(real64) :: alpha
2153 sys => electrons_t(namespace, generate_epot=.false.)
2154 call sys%init_parallelization(mpi_world)
2156 alpha = (0.0_real64, 0.5_real64)
2158 vec_pot_slope = 0.4_real64
2160 call states_elec_allocate_wfns(sys%st, sys%gr, wfs_type = type_cmplx)
2163 call current_init(current, namespace)
2165 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st)
2167 safe_allocate(sys%hm%hm_base%vector_potential(1:3, 1:sys%gr%np))
2169 sys%hm%hm_base%vector_potential = m_zero
2170 do ip = 1, sys%gr%np
2171 xx = sys%gr%x(ip, 1:3)
2172 sys%hm%hm_base%vector_potential(2, ip) = vec_pot_slope * xx(1) / p_c
2175 call states_elec_allocate_current(sys%st, sys%space, sys%gr)
2176 call density_calc(sys%st, sys%gr, sys%st%rho)
2178 call current_calculate(current, namespace, sys%gr, sys%hm, sys%space, sys%st)
2180 safe_allocate(current_para_ref(1:sys%gr%np,1:3))
2181 safe_allocate(current_dia_ref(1:sys%gr%np,1:3))
2182 safe_allocate(current_mag_ref(1:sys%gr%np,1:3))
2183 safe_allocate(delta(1:sys%gr%np))
2186 current_para_ref(:,:) = m_zero
2187 do ip = 1, sys%gr%np
2188 call mesh_r(sys%gr, ip, rr)
2189 xx = sys%gr%x(ip, 1:3)
2190 if (rr > r_small)
then
2192 psi_1s(rr, a0) *
dr_psi_2s(rr, a0) ) * aimag(alpha) / (1 + abs(alpha)**2) * xx(1:3) / rr
2196 write(fname,
'(a)')
'current_para'
2197 out_how = io_function_fill_how(
"PlaneZ")
2198 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2199 sys%st%current_para(:,:,1), unit_one, ierr)
2201 write(fname,
'(a)')
'current_para-ref'
2202 out_how = io_function_fill_how(
"PlaneZ")
2203 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2204 current_para_ref(:,:), unit_one, ierr)
2208 delta(:) = current_para_ref(1:sys%gr%np, idir) - sys%st%current_para(1:sys%gr%np, idir, 1)
2209 write(message(idir),*)
'idir =',idir,
', norm2(delta paramagnetic)',norm2(delta)
2211 call messages_info(3)
2214 current_dia_ref(:,:) = m_zero
2215 do ip = 1, sys%gr%np
2216 call mesh_r(sys%gr, ip, rr)
2217 current_dia_ref(ip,1:3) = - sys%hm%hm_base%vector_potential(1:3,ip) *&
2221 write(fname,
'(a)')
'current_dia'
2222 out_how = io_function_fill_how(
"PlaneZ")
2223 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2224 sys%st%current_dia(:,:,1), unit_one, ierr)
2226 write(fname,
'(a)')
'current_dia-ref'
2227 out_how = io_function_fill_how(
"PlaneZ")
2228 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2229 current_dia_ref(:,:), unit_one, ierr)
2233 delta(:) = current_dia_ref(1:sys%gr%np, idir) - sys%st%current_dia(1:sys%gr%np, idir, 1)
2234 write(message(idir),*)
'idir =',idir,
', norm2(delta diamagnetic)',norm2(delta)
2236 call messages_info(3)
2239 call current_calculate_mag(sys%gr%der, sys%st)
2242 current_mag_ref(:,:) = m_zero
2243 do ip = 1, sys%gr%np
2244 call mesh_r(sys%gr, ip, rr)
2245 xx = sys%gr%x(ip, 1:3)
2246 if (norm2(xx(1:2)) > r_small .and. rr > r_small)
then
2247 sin_thet = norm2(xx(1:2)) / rr
2248 sin_phi = xx(2) / norm2(xx(1:2))
2249 cos_phi = xx(1) / norm2(xx(1:2))
2253 current_mag_ref(ip,1) = m_half * mag_curr * sin_thet * sin_phi / (1+abs(alpha)**2)
2254 current_mag_ref(ip,2) = -m_half * mag_curr * sin_thet * cos_phi / (1+abs(alpha)**2)
2258 write(fname,
'(a)')
'current_mag'
2259 out_how = io_function_fill_how(
"PlaneZ")
2260 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2261 sys%st%current_mag(:,:,1), unit_one, ierr)
2263 write(fname,
'(a)')
'current_mag-ref'
2264 out_how = io_function_fill_how(
"PlaneZ")
2265 call io_function_output_vector(out_how ,
'./' , trim(fname), namespace, sys%space, sys%gr, &
2266 current_mag_ref(:,:), unit_one, ierr)
2270 delta(:) = current_mag_ref(1:sys%gr%np, idir) - sys%st%current_mag(1:sys%gr%np, idir, 1)
2271 write(message(idir),*)
'idir =',idir,
', norm2(delta magnetization)',norm2(delta)
2273 call messages_info(3)
2275 safe_deallocate_a(current_para_ref)
2276 safe_deallocate_a(current_dia_ref)
2277 safe_deallocate_a(current_mag_ref)
2278 safe_deallocate_a(delta)
2279 safe_deallocate_p(sys)
2285 class(batch_t),
intent(inout) :: psib
2286 class(mesh_t),
intent(in) :: mesh
2287 type(namespace_t),
intent(in) :: namespace
2288 complex(real64),
intent(in) :: alpha
2289 real(real64),
intent(in) :: a0
2291 complex(real64),
allocatable :: zff(:)
2298 safe_allocate(zff(1:mesh%np))
2299 if (type_is_complex(psib%type()))
then
2301 call mesh_r(mesh, ip, rr)
2303 call batch_set_state(psib, 1, mesh%np, zff)
2305 safe_deallocate_a(zff)
2307 write(message(1),*)
"States should be complex for the linear combination of hydrogenic states to work"
2308 call messages_info(1, namespace=namespace)
2315 real(real64),
intent(in) :: a0, rr
2316 complex(real64),
intent(in) :: alpha
2322 real(real64) function psi_1s(rr, a0)
2323 real(real64),
intent(in) :: a0, rr
2329 real(real64) function psi_2s(rr, a0)
2330 real(real64),
intent(in) :: a0, rr
2332 psi_2s =
sqrt(m_two) * a0**(-m_three/m_two) * (m_one - rr/(m_two * a0)) *
exp(-rr/(m_two * a0)) &
2333 / (m_two *
sqrt(m_pi))
2336 real(real64) function dr_psi_1s(rr, a0)
2337 real(real64),
intent(in) :: a0, rr
2342 real(real64) function dr_psi_2s(rr, a0)
2343 real(real64),
intent(in) :: a0, rr
2346 a0**(-m_five/m_two) *
exp(-rr/(m_two * a0)) / (
sqrt(m_two) * m_two *
sqrt(m_pi))
2351 type(namespace_t),
intent(in) :: namespace
2354 integer(int64) :: i, j, k
2355 integer(int64) :: dims(3)
2356 character(len=MAX_PATH_LEN) :: fname
2358 real(real64),
allocatable :: ff(:)
2368 call parse_variable(namespace,
'TestCSVFileName',
"", fname)
2370 message(1) =
"Attempting to probe "//trim(fname)
2371 call messages_info(1, namespace=namespace)
2373 call io_csv_get_info(fname, dims, ierr)
2375 message(1) =
"Probing successful."
2376 write(message(2),
'("found dimensions: ",3I20)') dims
2377 call messages_info(2, namespace=namespace)
2379 write(message(1),
'("Probing failed. ierr = ",I5)') ierr
2380 call messages_fatal(1, namespace=namespace)
2383 safe_allocate(ff(1:dims(1)*dims(2)*dims(3)))
2385 message(1) =
"Attempting to read "//trim(fname)
2386 call messages_info(1, namespace=namespace)
2388 call dread_csv(fname, dims(1)*dims(2)*dims(3), ff, ierr)
2390 message(1) =
"Reading successful."
2391 call messages_info(1, namespace=namespace)
2393 do k=1, min(4_int64, dims(3))
2394 do j=1, min(4_int64, dims(2))
2395 write(message(j),
'("data ",2I5, 1X, 4F8.2)') k, j, &
2396 (ff(i + dims(1)*(j-1) + dims(1)* dims(2)*(k-1)), i=1, min(4_int64, dims(1)))
2398 write(message(int(j, int32)),
'("")')
2399 call messages_info(int(j, int32), namespace=namespace)
2403 message(1) =
"Reading failed."
2404 call messages_fatal(1, namespace=namespace)
2407 safe_deallocate_a(ff)
batchified version of the BLAS axpy routine:
scale a batch by a constant or vector
There are several ways how to call batch_set_state and batch_get_state:
constant times a vector plus a vector
Copies a vector x, to a vector y.
scales a vector by a constant
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
double exp(double __x) __attribute__((__nothrow__
double sqrt(double __x) __attribute__((__nothrow__
pure logical function, public accel_is_enabled()
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
subroutine, public dbatch_ax_function_py(np, aa, psi, yy)
This routine performs a set of axpy operations adding the same function psi to all functions of a bat...
subroutine, public batch_set_zero(this, np, async)
fill all mesh functions of the batch with zero
subroutine, public zbatch_ax_function_py(np, aa, psi, yy)
This routine performs a set of axpy operations adding the same function psi to all functions of a bat...
Module implementing boundary conditions in Octopus.
Module, implementing a factory for boxes.
This module handles the calculation mode.
integer, parameter, public p_strategy_kpoints
parallelization in k-points
integer, parameter, public p_strategy_domains
parallelization in domains
type(calc_mode_par_t), public calc_mode_par
Singleton instance of parallel calculation mode.
integer, parameter, public p_strategy_states
parallelization in states
subroutine, public cgal_polyhedron_init(cgal_poly, fname, verbose)
logical function, public cgal_polyhedron_point_inside(cgal_poly, xq, yq, zq)
subroutine, public cgal_polyhedron_end(cgal_poly)
pure real(real64) function center(this)
Center of the filter interval.
This module implements a calculator for the density and defines related functions.
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public dderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public dderivatives_lapl(der, ff, op_ff, ghost_update, set_bc, factor)
apply the Laplacian to a mesh function
subroutine, public zderivatives_test(this, namespace, repetitions, min_blocksize, max_blocksize)
unit test for derivatives
subroutine, public zchebyshev_filter(namespace, mesh, st, hm, degree, bounds, ik, normalize)
Chebyshev Filter.
subroutine, public dchebyshev_filter(namespace, mesh, st, hm, degree, bounds, ik, normalize)
Chebyshev Filter.
integer, parameter, public spin_polarized
subroutine, public exponential_init(te, namespace, full_batch)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_pi
some mathematical constants
complex(real64), parameter, public m_zi
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public zhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
subroutine, public dhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
type(hardware_t), public cpu_hardware
Global instance of CPU hardware specification.
integer, parameter, public sizeof_real64
Number of bytes to store a variable of type real(real64)
integer, parameter, public sizeof_complex64
Number of bytes to store a variable of type complex(real64)
The Helmholtz decomposition is intended to contain "only mathematical" functions and procedures to co...
Test suit for the Helmholtz decomposition module.
subroutine, public gaussian_test(helmholtz, sys_grid, namespace, space)
subroutine, public hertzian_dipole_test(helmholtz, sys_grid, namespace, space)
This module implements a simple hash table for non-negative integer keys and integer values.
subroutine, public iihash_end(h)
Free a hash table.
subroutine, public iihash_insert(h, key, val)
Insert a (key, val) pair into the hash table h.
integer function, public iihash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
subroutine, public iihash_init(h)
Initialize a hash table h.
subroutine, public dio_function_output(how, dir, fname, namespace, space, mesh, ff, unit, ierr, pos, atoms, grp, root)
Top-level IO routine for functions defined on the mesh.
integer(int64) function, public io_function_fill_how(where)
Use this function to quickly plot functions for debugging purposes: call dio_function_output(io_funct...
subroutine, public ion_interaction_test(space, latt, atom, natoms, pos, lsize, namespace, mc)
This modules takes care of testing some linear algebra routines.
subroutine, public test_exponential_matrix(namespace)
Unit tests for the exponential of a matrix.
This module defines functions over batches of mesh functions.
subroutine, public dmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public dmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public mesh_batch_nrm2(mesh, aa, nrm2, reduce)
Calculate the norms (norm2, not the square!) of a batch of mesh functions.
subroutine, public zmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
subroutine, public zmesh_batch_dotp_matrix(mesh, aa, bb, dot, reduce)
Calculate the overlap matrix of two batches.
subroutine, public zmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public zmesh_batch_dotp_self(mesh, aa, dot, reduce)
calculate the overlap matrix of a batch with itself
subroutine, public dmesh_batch_normalize(mesh, psib, norm)
Normalize a batch.
subroutine, public dmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
calculate the vector of dot-products of mesh functions between two batches
This module defines various routines, operating on mesh functions.
class(mesh_t), pointer, public mesh_aux
Globally-scoped pointer to the mesh instance.
real(real64) function, public dmf_dotp_aux(f1, f2)
dot product between two vectors (mesh functions)
subroutine, public mesh_init_mesh_aux(mesh)
Initialise a pointer to the grid/mesh, that is globally exposed, such that low level mesh operations ...
subroutine, public zmesh_interpolation_test(mesh)
subroutine, public dmesh_interpolation_test(mesh)
This module defines the meshes, which are used in Octopus.
pure subroutine, public mesh_r(mesh, ip, rr, origin, coords)
return the distance to the origin for a given grid point
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
character(len=512), private msg
subroutine, public messages_obsolete_variable(namespace, name, rep)
subroutine, public messages_new_line()
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This modules takes care of testing optimizers using standard test functions.
subroutine, public test_optimizers(namespace)
Unit tests for different optimizers.
This module implements unit tests for the mixing methods.
subroutine, public mix_tests_run()
type(mpi_grp_t), public mpi_world
subroutine, public test_mpiwrappers
This module handles the communicators for the various parallelization strategies.
subroutine, public multigrid_end(mgrid)
subroutine, public multigrid_init(mgrid, namespace, space, mesh, der, stencil, mc, nlevels)
type(namespace_t), public global_namespace
subroutine, public orbitalbasis_end(this)
subroutine, public zorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public dorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public orbitalbasis_init(this, namespace, periodic_dim)
subroutine, public dorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public zorbitalset_add_to_batch(os, ndim, psib, weight)
subroutine, public orbitalset_update_phase(os, dim, kpt, kpoints, spin_polarized, vec_pot, vec_pot_var, kpt_max)
Build the phase correction to the global phase in case the orbital crosses the border of the simulato...
subroutine, public dorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public zorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
subroutine, public poisson_test(this, space, mesh, latt, namespace, repetitions)
This routine checks the Hartree solver selected in the input file by calculating numerically and anal...
subroutine, public preconditioner_end(this)
subroutine, public preconditioner_init(this, namespace, gr, mc, space)
subroutine, public zproject_psi_batch(mesh, bnd, pj, npj, dim, psib, ppsib)
To optimize the application of the non-local operator in parallel, the projectors are applied in step...
Implementation details for regridding.
This module implements a simple hash table for string valued keys and integer values using the C++ ST...
subroutine, public sihash_insert(h, key, val)
Insert a (key, val) pair into the hash table h.
subroutine, public sihash_init(h)
Initialize a hash table h with size entries. Since we use separate chaining, the number of entries in...
integer function, public sihash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
subroutine, public sihash_end(h)
Free a hash table.
This module is intended to contain "only mathematical" functions and procedures.
This module implements a simple hash table for string valued keys and integer values using the C++ ST...
subroutine, public sphash_init(h)
Initialize a hash table h with size entries. Since we use separate chaining, the number of entries in...
subroutine, public sphash_insert(h, key, val, clone)
Insert a (key, val) pair into the hash table h. If clone=.true., the object will be copied.
subroutine, public sphash_end(h)
Free a hash table.
class(*) function, pointer, public sphash_lookup(h, key, found)
Look up a value in the hash table h. If found is present, it indicates if key could be found in the t...
pure logical function, public states_are_real(st)
subroutine, public zstates_elec_calc_orth_test(st, namespace, mesh, kpoints)
subroutine, public dstates_elec_calc_orth_test(st, namespace, mesh, kpoints)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public states_elec_deallocate_wfns(st)
Deallocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
Allocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public dsubspace_diag(this, namespace, mesh, st, hm, ik, eigenval, diff, nonortho)
Diagonalises the Hamiltonian in the subspace defined by the states.
subroutine, public zsubspace_diag(this, namespace, mesh, st, hm, ik, eigenval, diff, nonortho)
Diagonalises the Hamiltonian in the subspace defined by the states.
Integration tests for ISDF.
subroutine, public test_isdf(namespace, 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)