39 dbcsr_type_antisymmetric, dbcsr_type_no_symmetry, &
73 USE trexio,
ONLY: trexio_open, trexio_close, &
74 trexio_hdf5, trexio_success, &
75 trexio_string_of_error, trexio_t, trexio_exit_code, &
76 trexio_write_metadata_code, trexio_write_metadata_code_num, &
77 trexio_write_nucleus_coord, trexio_read_nucleus_coord, &
78 trexio_write_nucleus_num, trexio_read_nucleus_num, &
79 trexio_write_nucleus_charge, trexio_read_nucleus_charge, &
80 trexio_write_nucleus_label, trexio_read_nucleus_label, &
81 trexio_write_nucleus_repulsion, &
82 trexio_write_cell_a, trexio_write_cell_b, trexio_write_cell_c, &
83 trexio_write_cell_g_a, trexio_write_cell_g_b, &
84 trexio_write_cell_g_c, trexio_write_cell_two_pi, &
85 trexio_write_pbc_periodic, trexio_write_pbc_k_point_num, &
86 trexio_write_pbc_k_point, trexio_write_pbc_k_point_weight, &
87 trexio_write_electron_num, trexio_read_electron_num, &
88 trexio_write_electron_up_num, trexio_read_electron_up_num, &
89 trexio_write_electron_dn_num, trexio_read_electron_dn_num, &
90 trexio_write_state_num, trexio_write_state_id, &
91 trexio_write_state_energy, &
92 trexio_write_basis_type, trexio_write_basis_prim_num, &
93 trexio_write_basis_shell_num, trexio_read_basis_shell_num, &
94 trexio_write_basis_nucleus_index, &
95 trexio_write_basis_shell_ang_mom, trexio_read_basis_shell_ang_mom, &
96 trexio_write_basis_shell_factor, &
97 trexio_write_basis_r_power, trexio_write_basis_shell_index, &
98 trexio_write_basis_exponent, trexio_write_basis_coefficient, &
99 trexio_write_basis_prim_factor, &
100 trexio_write_ecp_z_core, trexio_write_ecp_max_ang_mom_plus_1, &
101 trexio_write_ecp_num, trexio_write_ecp_ang_mom, &
102 trexio_write_ecp_nucleus_index, trexio_write_ecp_exponent, &
103 trexio_write_ecp_coefficient, trexio_write_ecp_power, &
104 trexio_write_ao_cartesian, trexio_write_ao_num, &
105 trexio_read_ao_cartesian, trexio_read_ao_num, &
106 trexio_write_ao_shell, trexio_write_ao_normalization, &
107 trexio_read_ao_shell, trexio_read_ao_normalization, &
108 trexio_write_mo_num, trexio_write_mo_energy, &
109 trexio_read_mo_num, trexio_read_mo_energy, &
110 trexio_write_mo_occupation, trexio_write_mo_spin, &
111 trexio_read_mo_occupation, trexio_read_mo_spin, &
112 trexio_write_mo_class, trexio_write_mo_coefficient, &
113 trexio_read_mo_class, trexio_read_mo_coefficient, &
114 trexio_write_mo_coefficient_im, trexio_write_mo_k_point, &
117#include "./base/base_uses.f90"
123 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'trexio_utils'
138 TYPE(
dbcsr_p_type),
INTENT(IN),
DIMENSION(:),
POINTER,
OPTIONAL :: energy_derivative
141 CHARACTER(LEN=*),
PARAMETER :: routinen =
'write_trexio'
143 INTEGER :: handle, output_unit, unit_trexio
144 CHARACTER(len=default_path_length) :: filename, filename_de
145 INTEGER(trexio_t) :: f
146 INTEGER(trexio_exit_code) :: rc
147 LOGICAL :: explicit, do_kpoints, ecp_semi_local, &
148 ecp_local, sgp_potential_present, ionode, &
149 use_real_wfn, save_cartesian, &
150 trexio_kpoints_created
151 REAL(kind=
dp) :: e_nn, zeff, expzet, prefac, zeta, gcca, &
157 TYPE(
kpoint_type),
POINTER :: kpoints, trexio_kpoints
163 TYPE(
mo_set_type),
DIMENSION(:, :),
POINTER :: mos_kp
168 TYPE(
cp_fm_type) :: fm_mo_coeff, fm_dummy, fm_mo_coeff_im
171 CHARACTER(LEN=2) :: element_symbol
172 CHARACTER(LEN=2),
DIMENSION(:),
ALLOCATABLE :: label
173 INTEGER :: iatom, natoms, periodic, nkp, nel_tot, &
174 nspins, ikind, ishell_loc, ishell, &
175 shell_num, prim_num, nset, iset, ipgf, z, &
176 sl_lmax, ecp_num, nloc, nsemiloc, sl_l, iecp, &
177 iao, icgf_atom, ncgf, nao_shell, ao_num, nmo, &
178 mo_num, ispin, ikp, imo, ikp_loc, nsgf, ncgf_atom, &
179 i, j, k, l, m, unit_de, &
180 row, col, row_size, col_size, &
181 row_offset, col_offset
182 INTEGER,
DIMENSION(2) :: nel_spin, kp_range, nmo_spin
183 INTEGER,
DIMENSION(0:10) :: npot
184 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nucleus_index, shell_ang_mom, r_power, &
185 shell_index, z_core, max_ang_mom_plus_1, &
186 ang_mom, powers, ao_shell, mo_spin, mo_kpoint, &
187 cp2k_to_trexio_ang_mom, ao_to_atom
199 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: agauge
200 REAL(kind=
dp) :: scoord(3), scoord_pbc(3), r_pbc(3), &
201 kdotg, cval, sval, re_old, im_old
202 INTEGER,
DIMENSION(:),
POINTER :: nshell, npgf
203 INTEGER,
DIMENSION(:, :),
POINTER :: l_shell_set
204 REAL(kind=
dp),
DIMENSION(:),
ALLOCATABLE :: charge, shell_factor, exponents, coefficients, &
205 prim_factor, ao_normalization, mo_energy, &
206 mo_occupation, sgcc, ecp_coefficients, &
208 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp, norm_cgf
209 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: coord, mo_coefficient, mo_coefficient_im, &
211 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: zetas, data_block, xkp
212 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: gcc
214 CALL timeset(routinen, handle)
216 NULLIFY (cell, logger, dft_control, basis_set, kpoints, trexio_kpoints, particle_set, &
218 NULLIFY (sgp_potential, mos, mos_kp, kp_env, para_env, para_env_inter_kp, blacs_env)
219 NULLIFY (fm_struct, nshell, npgf, l_shell_set, wkp, norm_cgf, zetas, data_block, gcc)
224 cpassert(
ASSOCIATED(qs_env))
228 IF (.NOT. explicit)
THEN
229 filename = trim(logger%iter_info%project_name)//
'-TREXIO.h5'
231 filename = trim(filename)//
'.h5'
235 ionode = para_env%is_source()
236 CALL get_qs_env(qs_env, do_kpoints=do_kpoints, kpoints=kpoints)
237 trexio_kpoints => kpoints
238 trexio_kpoints_created = .false.
239 CALL prepare_trexio_kpoint_grid(qs_env, trexio_section, do_kpoints, kpoints, &
240 trexio_kpoints, trexio_kpoints_created)
245 CALL open_file(filename, unit_number=unit_trexio)
246 CALL close_file(unit_number=unit_trexio, file_status=
"DELETE")
252 WRITE (output_unit,
"((T2,A,A))")
'TREXIO| Writing trexio file ', trim(filename)
253 f = trexio_open(filename,
'w', trexio_hdf5, rc)
254 CALL trexio_error(rc)
259 rc = trexio_write_metadata_code_num(f, 1)
260 CALL trexio_error(rc)
263 CALL trexio_error(rc)
268 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set, qs_kind_set=kind_set, natom=natoms)
270 rc = trexio_write_nucleus_num(f, natoms)
271 CALL trexio_error(rc)
273 ALLOCATE (coord(3, natoms))
274 ALLOCATE (label(natoms))
275 ALLOCATE (charge(natoms))
278 coord(:, iatom) = particle_set(iatom)%r(1:3)
280 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, element_symbol=element_symbol, kind_number=ikind)
282 label(iatom) = element_symbol
288 rc = trexio_write_nucleus_coord(f, coord)
289 CALL trexio_error(rc)
292 rc = trexio_write_nucleus_charge(f, charge)
293 CALL trexio_error(rc)
296 rc = trexio_write_nucleus_label(f, label, 3)
297 CALL trexio_error(rc)
301 IF (sum(cell%perd) == 0)
THEN
302 CALL nuclear_repulsion_energy(particle_set, kind_set, e_nn)
303 rc = trexio_write_nucleus_repulsion(f, e_nn)
304 CALL trexio_error(rc)
310 rc = trexio_write_cell_a(f, cell%hmat(:, 1))
311 CALL trexio_error(rc)
313 rc = trexio_write_cell_b(f, cell%hmat(:, 2))
314 CALL trexio_error(rc)
316 rc = trexio_write_cell_c(f, cell%hmat(:, 3))
317 CALL trexio_error(rc)
319 rc = trexio_write_cell_g_a(f, cell%h_inv(:, 1))
320 CALL trexio_error(rc)
322 rc = trexio_write_cell_g_b(f, cell%h_inv(:, 2))
323 CALL trexio_error(rc)
325 rc = trexio_write_cell_g_c(f, cell%h_inv(:, 3))
326 CALL trexio_error(rc)
328 rc = trexio_write_cell_two_pi(f, 0)
329 CALL trexio_error(rc)
335 IF (sum(cell%perd) /= 0) periodic = 1
336 rc = trexio_write_pbc_periodic(f, periodic)
337 CALL trexio_error(rc)
342 rc = trexio_write_pbc_k_point_num(f, nkp)
343 CALL trexio_error(rc)
345 rc = trexio_write_pbc_k_point(f, xkp)
346 CALL trexio_error(rc)
348 rc = trexio_write_pbc_k_point_weight(f, wkp)
349 CALL trexio_error(rc)
355 CALL get_qs_env(qs_env, dft_control=dft_control, nelectron_total=nel_tot)
357 rc = trexio_write_electron_num(f, nel_tot)
358 CALL trexio_error(rc)
360 nspins = dft_control%nspins
361 IF (nspins == 1)
THEN
364 nel_spin(1) = nel_tot/2
365 nel_spin(2) = nel_tot/2
369 CALL get_qs_env(qs_env, nelectron_spin=nel_spin)
371 rc = trexio_write_electron_up_num(f, nel_spin(1))
372 CALL trexio_error(rc)
373 rc = trexio_write_electron_dn_num(f, nel_spin(2))
374 CALL trexio_error(rc)
381 rc = trexio_write_state_num(f, 1)
382 CALL trexio_error(rc)
384 rc = trexio_write_state_id(f, 1)
385 CALL trexio_error(rc)
388 CALL trexio_error(rc)
395 CALL get_qs_env(qs_env, qs_kind_set=kind_set, natom=natoms, particle_set=particle_set)
401 rc = trexio_write_basis_type(f,
'Gaussian', len_trim(
'Gaussian') + 1)
402 CALL trexio_error(rc)
404 rc = trexio_write_basis_shell_num(f, shell_num)
405 CALL trexio_error(rc)
407 rc = trexio_write_basis_prim_num(f, prim_num)
408 CALL trexio_error(rc)
412 ALLOCATE (nucleus_index(shell_num))
413 ALLOCATE (shell_ang_mom(shell_num))
414 ALLOCATE (shell_index(prim_num))
415 ALLOCATE (exponents(prim_num))
416 ALLOCATE (coefficients(prim_num))
417 ALLOCATE (prim_factor(prim_num))
420 IF (.NOT. save_cartesian)
THEN
421 ALLOCATE (sgf_coefficients(prim_num))
428 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
430 CALL get_qs_kind(kind_set(ikind), basis_set=basis_set, basis_type=
"ORB")
441 DO ishell_loc = 1, nshell(iset)
445 nucleus_index(ishell) = iatom
448 l = l_shell_set(ishell_loc, iset)
449 shell_ang_mom(ishell) = l
452 shell_index(ipgf + 1:ipgf + npgf(iset)) = ishell
455 exponents(ipgf + 1:ipgf + npgf(iset)) = zetas(1:npgf(iset), iset)
459 expzet = 0.25_dp*real(2*l + 3,
dp)
460 prefac = 2.0_dp**l*(2.0_dp/
pi)**0.75_dp
462 gcca = gcc(i, ishell_loc, iset)
463 zeta = zetas(i, iset)
464 prim_cart_fac = prefac*zeta**expzet
467 coefficients(ipgf + i) = gcca/prim_cart_fac
469 IF (save_cartesian)
THEN
471 prim_factor(ipgf + i) = prim_cart_fac
474 prim_factor(ipgf + i) = sgf_norm(l, exponents(ipgf + i))
476 sgf_coefficients(ipgf + i) = coefficients(ipgf + i)*prim_factor(ipgf + i)
481 ipgf = ipgf + npgf(iset)
486 cpassert(ishell == shell_num)
487 cpassert(ipgf == prim_num)
490 rc = trexio_write_basis_nucleus_index(f, nucleus_index)
491 CALL trexio_error(rc)
493 rc = trexio_write_basis_shell_ang_mom(f, shell_ang_mom)
494 CALL trexio_error(rc)
497 ALLOCATE (shell_factor(shell_num))
498 shell_factor(:) = 1.0_dp
499 rc = trexio_write_basis_shell_factor(f, shell_factor)
500 CALL trexio_error(rc)
501 DEALLOCATE (shell_factor)
504 ALLOCATE (r_power(shell_num))
506 rc = trexio_write_basis_r_power(f, r_power)
507 CALL trexio_error(rc)
510 rc = trexio_write_basis_shell_index(f, shell_index)
511 CALL trexio_error(rc)
513 rc = trexio_write_basis_exponent(f, exponents)
514 CALL trexio_error(rc)
516 rc = trexio_write_basis_coefficient(f, coefficients)
517 CALL trexio_error(rc)
520 rc = trexio_write_basis_prim_factor(f, prim_factor)
521 CALL trexio_error(rc)
524 DEALLOCATE (nucleus_index)
525 DEALLOCATE (shell_index)
526 DEALLOCATE (exponents)
527 DEALLOCATE (coefficients)
528 DEALLOCATE (prim_factor)
535 CALL get_qs_kind_set(kind_set, sgp_potential_present=sgp_potential_present)
539 IF (sgp_potential_present)
THEN
542 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
544 CALL get_qs_kind(kind_set(ikind), sgp_potential=sgp_potential)
547 IF (
ASSOCIATED(sgp_potential))
THEN
548 CALL get_potential(potential=sgp_potential, ecp_local=ecp_local, ecp_semi_local=ecp_semi_local)
552 ecp_num = ecp_num + nloc
554 IF (ecp_semi_local)
THEN
557 ecp_num = ecp_num + sum(npot)
564 IF (ecp_num > 0)
THEN
565 ALLOCATE (z_core(natoms))
566 ALLOCATE (max_ang_mom_plus_1(natoms))
567 max_ang_mom_plus_1(:) = 0
569 ALLOCATE (ang_mom(ecp_num))
570 ALLOCATE (nucleus_index(ecp_num))
571 ALLOCATE (exponents(ecp_num))
572 ALLOCATE (ecp_coefficients(ecp_num))
573 ALLOCATE (powers(ecp_num))
578 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind, z=z)
580 CALL get_qs_kind(kind_set(ikind), sgp_potential=sgp_potential, zeff=zeff)
583 z_core(iatom) = z - int(zeff)
586 IF (
ASSOCIATED(sgp_potential))
THEN
587 CALL get_potential(potential=sgp_potential, ecp_local=ecp_local, ecp_semi_local=ecp_semi_local)
591 CALL get_potential(potential=sgp_potential, nloc=nloc, sl_lmax=sl_lmax)
592 ang_mom(iecp + 1:iecp + nloc) = sl_lmax + 1
593 nucleus_index(iecp + 1:iecp + nloc) = iatom
594 exponents(iecp + 1:iecp + nloc) = sgp_potential%bloc(1:nloc)
595 ecp_coefficients(iecp + 1:iecp + nloc) = sgp_potential%aloc(1:nloc)
596 powers(iecp + 1:iecp + nloc) = sgp_potential%nrloc(1:nloc) - 2
601 IF (ecp_semi_local)
THEN
602 CALL get_potential(potential=sgp_potential, npot=npot, sl_lmax=sl_lmax)
603 max_ang_mom_plus_1(iatom) = sl_lmax + 1
606 nsemiloc = npot(sl_l)
607 ang_mom(iecp + 1:iecp + nsemiloc) = sl_l
608 nucleus_index(iecp + 1:iecp + nsemiloc) = iatom
609 exponents(iecp + 1:iecp + nsemiloc) = sgp_potential%bpot(1:nsemiloc, sl_l)
610 ecp_coefficients(iecp + 1:iecp + nsemiloc) = sgp_potential%apot(1:nsemiloc, sl_l)
611 powers(iecp + 1:iecp + nsemiloc) = sgp_potential%nrpot(1:nsemiloc, sl_l) - 2
612 iecp = iecp + nsemiloc
619 cpassert(iecp == ecp_num)
621 rc = trexio_write_ecp_num(f, ecp_num)
622 CALL trexio_error(rc)
624 rc = trexio_write_ecp_z_core(f, z_core)
625 CALL trexio_error(rc)
628 rc = trexio_write_ecp_max_ang_mom_plus_1(f, max_ang_mom_plus_1)
629 CALL trexio_error(rc)
630 DEALLOCATE (max_ang_mom_plus_1)
632 rc = trexio_write_ecp_ang_mom(f, ang_mom)
633 CALL trexio_error(rc)
636 rc = trexio_write_ecp_nucleus_index(f, nucleus_index)
637 CALL trexio_error(rc)
638 DEALLOCATE (nucleus_index)
640 rc = trexio_write_ecp_exponent(f, exponents)
641 CALL trexio_error(rc)
642 DEALLOCATE (exponents)
644 rc = trexio_write_ecp_coefficient(f, ecp_coefficients)
645 CALL trexio_error(rc)
646 DEALLOCATE (ecp_coefficients)
648 rc = trexio_write_ecp_power(f, powers)
649 CALL trexio_error(rc)
666 IF (save_cartesian)
THEN
673 IF (save_cartesian)
THEN
674 rc = trexio_write_ao_cartesian(f, 1)
676 rc = trexio_write_ao_cartesian(f, 0)
678 CALL trexio_error(rc)
680 rc = trexio_write_ao_num(f, ao_num)
681 CALL trexio_error(rc)
685 ALLOCATE (ao_shell(ao_num))
686 ALLOCATE (ao_normalization(ao_num))
687 ALLOCATE (ao_to_atom(ao_num))
689 IF (.NOT. save_cartesian)
THEN
693 ALLOCATE (cp2k_to_trexio_ang_mom(ao_num))
695 DO ishell = 1, shell_num
696 l = shell_ang_mom(ishell)
698 m = (-1)**k*floor(real(k, kind=
dp)/2.0_dp)
699 cp2k_to_trexio_ang_mom(i + k) = i + l + 1 + m
703 cpassert(i == ao_num)
712 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
714 CALL get_qs_kind(kind_set(ikind), basis_set=basis_set, basis_type=
"ORB")
727 DO ishell_loc = 1, nshell(iset)
731 l = l_shell_set(ishell_loc, iset)
734 IF (save_cartesian)
THEN
741 ao_shell(iao + 1:iao + nao_shell) = ishell
744 ao_to_atom(iao + 1:iao + nao_shell) = iatom
747 IF (save_cartesian)
THEN
748 ao_normalization(iao + 1:iao + nao_shell) = norm_cgf(icgf_atom + 1:icgf_atom + nao_shell)
751 ALLOCATE (sloc(npgf(iset), npgf(iset)))
752 ALLOCATE (sgcc(npgf(iset)))
753 CALL sg_overlap(sloc, l, zetas(1:npgf(iset), iset), zetas(1:npgf(iset), iset))
756 sgcc(:) = matmul(sloc, sgf_coefficients(ipgf + 1:ipgf + npgf(iset)))
757 nsgto = 1.0_dp/sqrt(dot_product(sgf_coefficients(ipgf + 1:ipgf + npgf(iset)), sgcc))
765 ao_normalization(iao + 1:iao + nao_shell) = nsgto*sqrt((2*l + 1)/(4*
pi))
768 ipgf = ipgf + npgf(iset)
769 iao = iao + nao_shell
770 icgf_atom = icgf_atom +
nco(l)
774 cpassert(icgf_atom == ncgf_atom)
778 rc = trexio_write_ao_shell(f, ao_shell)
779 CALL trexio_error(rc)
781 rc = trexio_write_ao_normalization(f, ao_normalization)
782 CALL trexio_error(rc)
785 DEALLOCATE (ao_shell)
786 DEALLOCATE (ao_normalization)
787 IF (
ALLOCATED(sgf_coefficients))
DEALLOCATE (sgf_coefficients)
792 CALL get_qs_env(qs_env, do_kpoints=do_kpoints, kpoints=kpoints, dft_control=dft_control, &
793 particle_set=particle_set, qs_kind_set=kind_set, blacs_env=blacs_env, &
795 nspins = dft_control%nspins
802 CALL get_kpoint_info(trexio_kpoints, kp_env=kp_env, nkp=nkp, use_real_wfn=use_real_wfn)
806 nmo_spin(ispin) = nmo
808 mo_num = nkp*sum(nmo_spin)
812 nrow_global=nsgf, ncol_global=mo_num)
815 IF (.NOT. use_real_wfn)
THEN
824 nmo_spin(ispin) = nmo
826 mo_num = sum(nmo_spin)
830 ALLOCATE (mo_coefficient(ao_num, mo_num))
831 mo_coefficient(:, :) = 0.0_dp
832 ALLOCATE (mo_energy(mo_num))
833 mo_energy(:) = 0.0_dp
834 ALLOCATE (mo_occupation(mo_num))
835 mo_occupation(:) = 0.0_dp
836 ALLOCATE (mo_spin(mo_num))
840 ALLOCATE (mo_coefficient_im(ao_num, mo_num))
841 mo_coefficient_im(:, :) = 0.0_dp
842 ALLOCATE (mo_kpoint(mo_num))
850 CALL get_kpoint_info(trexio_kpoints, kp_env=kp_env, nkp=nkp, kp_range=kp_range)
854 nmo = nmo_spin(ispin)
856 imo = (ikp - 1)*nmo + (ispin - 1)*nmo_spin(1)*nkp
859 IF (ikp >= kp_range(1) .AND. ikp <= kp_range(2))
THEN
860 ikp_loc = ikp - kp_range(1) + 1
865 IF (mos_kp(1, ispin)%use_mo_coeff_b)
THEN
866 CALL copy_dbcsr_to_fm(mos_kp(1, ispin)%mo_coeff_b, mos_kp(1, ispin)%mo_coeff)
870 nsgf, nmo, 1, 1, 1, imo + 1, blacs_env)
873 mo_energy(imo + 1:imo + nmo) = mos_kp(1, ispin)%eigenvalues(1:nmo)
876 mo_occupation(imo + 1:imo + nmo) = mos_kp(1, ispin)%occupation_numbers(1:nmo)
879 IF (.NOT. use_real_wfn)
THEN
880 IF (mos_kp(2, ispin)%use_mo_coeff_b)
THEN
881 CALL copy_dbcsr_to_fm(mos_kp(2, ispin)%mo_coeff_b, mos_kp(2, ispin)%mo_coeff)
884 nsgf, nmo, 1, 1, 1, imo + 1, blacs_env)
889 nsgf, nmo, 1, 1, 1, imo + 1, blacs_env)
890 IF (.NOT. use_real_wfn)
THEN
892 nsgf, nmo, 1, 1, 1, imo + 1, blacs_env)
901 CALL get_kpoint_info(trexio_kpoints, para_env_inter_kp=para_env_inter_kp)
902 CALL para_env_inter_kp%sum(mo_energy)
903 CALL para_env_inter_kp%sum(mo_occupation)
911 IF (do_kpoints .AND. .NOT. use_real_wfn)
THEN
913 ALLOCATE (agauge(3, natoms))
916 IF (kpoints%symmetry)
THEN
917 r_pbc =
pbc_stable(particle_set(iatom)%r(1:3), cell)
919 r_pbc =
pbc(particle_set(iatom)%r(1:3), cell)
922 agauge(:, iatom) = nint(scoord_pbc - scoord)
929 nmo = nmo_spin(ispin)
931 ALLOCATE (mos_sgf(nsgf, nmo))
932 mos_sgf(:, :) = 0.0_dp
937 imo = (ikp - 1)*nmo + (ispin - 1)*nmo_spin(1)*nkp
940 mo_kpoint(imo + 1:imo + nmo) = ikp
942 mo_spin(imo + 1:imo + nmo) = ispin - 1
946 IF (save_cartesian)
THEN
947 CALL spherical_to_cartesian_mo(mos_sgf, particle_set, kind_set, mo_coefficient(:, imo + 1:imo + nmo))
951 mo_coefficient(i, imo + 1:imo + nmo) = mos_sgf(cp2k_to_trexio_ang_mom(i), :)
956 IF (.NOT. use_real_wfn)
THEN
958 IF (save_cartesian)
THEN
959 CALL spherical_to_cartesian_mo(mos_sgf, particle_set, kind_set, mo_coefficient_im(:, imo + 1:imo + nmo))
963 mo_coefficient_im(i, imo + 1:imo + nmo) = mos_sgf(cp2k_to_trexio_ang_mom(i), :)
971 iatom = ao_to_atom(iao)
972 kdotg = 2.0_dp*
pi*dot_product(xkp(:, ikp), real(agauge(:, iatom), kind=
dp))
975 DO j = imo + 1, imo + nmo
976 re_old = mo_coefficient(iao, j)
977 im_old = mo_coefficient_im(iao, j)
978 mo_coefficient(iao, j) = cval*re_old + sval*im_old
979 mo_coefficient_im(iao, j) = -sval*re_old + cval*im_old
986 imo = (ispin - 1)*nmo_spin(1)
988 mo_energy(imo + 1:imo + nmo) = mos(ispin)%eigenvalues
990 mo_occupation(imo + 1:imo + nmo) = mos(ispin)%occupation_numbers
992 mo_spin(imo + 1:imo + nmo) = ispin - 1
995 IF (mos(ispin)%use_mo_coeff_b)
CALL copy_dbcsr_to_fm(mos(ispin)%mo_coeff_b, mos(ispin)%mo_coeff)
1000 IF (save_cartesian)
THEN
1001 CALL spherical_to_cartesian_mo(mos_sgf, particle_set, kind_set, mo_coefficient(:, imo + 1:imo + nmo))
1005 mo_coefficient(i, imo + 1:imo + nmo) = mos_sgf(cp2k_to_trexio_ang_mom(i), :)
1010 DEALLOCATE (mos_sgf)
1014 rc = trexio_write_mo_type(f,
'Canonical', len_trim(
'Canonical') + 1)
1015 CALL trexio_error(rc)
1017 rc = trexio_write_mo_num(f, mo_num)
1018 CALL trexio_error(rc)
1020 rc = trexio_write_mo_coefficient(f, mo_coefficient)
1021 CALL trexio_error(rc)
1023 rc = trexio_write_mo_energy(f, mo_energy)
1024 CALL trexio_error(rc)
1026 rc = trexio_write_mo_occupation(f, mo_occupation)
1027 CALL trexio_error(rc)
1029 rc = trexio_write_mo_spin(f, mo_spin)
1030 CALL trexio_error(rc)
1032 IF (do_kpoints)
THEN
1033 rc = trexio_write_mo_coefficient_im(f, mo_coefficient_im)
1034 CALL trexio_error(rc)
1036 rc = trexio_write_mo_k_point(f, mo_kpoint)
1037 CALL trexio_error(rc)
1041 DEALLOCATE (mo_coefficient)
1042 DEALLOCATE (mo_energy)
1043 DEALLOCATE (mo_occupation)
1044 DEALLOCATE (mo_spin)
1045 IF (do_kpoints)
THEN
1046 DEALLOCATE (mo_coefficient_im)
1047 DEALLOCATE (mo_kpoint)
1051 IF (
ALLOCATED(ao_to_atom))
DEALLOCATE (ao_to_atom)
1052 IF (
ALLOCATED(agauge))
DEALLOCATE (agauge)
1063 IF (
PRESENT(energy_derivative))
THEN
1064 filename_de = trim(logger%iter_info%project_name)//
'-TREXIO.dEdP.dat'
1066 ALLOCATE (dedp(nsgf, nsgf))
1069 DO ispin = 1, nspins
1074 row_size=row_size, col_size=col_size, &
1075 row_offset=row_offset, col_offset=col_offset)
1080 dedp(row_offset + i - 1, col_offset + j - 1) = data_block(i, j)
1088 CASE (dbcsr_type_symmetric)
1090 CASE (dbcsr_type_antisymmetric)
1092 CASE (dbcsr_type_no_symmetry)
1094 cpabort(
"Unknown matrix type for energy derivative")
1099 CALL para_env%sum(dedp)
1103 WRITE (output_unit,
"((T2,A,A))")
'TREXIO| Writing derivative file ', trim(filename_de)
1107 file_action=
"WRITE", &
1108 file_status=
"UNKNOWN", &
1109 unit_number=unit_de)
1110 WRITE (unit_de,
'(I0, 1X, I0)') nsgf, nsgf
1112 WRITE (unit_de,
'(*(1X, F15.8))') (dedp(cp2k_to_trexio_ang_mom(i), &
1113 cp2k_to_trexio_ang_mom(j)), j=1, nsgf)
1122 IF (
ALLOCATED(shell_ang_mom))
DEALLOCATE (shell_ang_mom)
1123 IF (
ALLOCATED(cp2k_to_trexio_ang_mom))
DEALLOCATE (cp2k_to_trexio_ang_mom)
1129 rc = trexio_close(f)
1130 CALL trexio_error(rc)
1133 CALL timestop(handle)
1136 mark_used(trexio_section)
1137 mark_used(energy_derivative)
1138 cpwarn(
'TREXIO support has not been enabled in this build.')
1152 SUBROUTINE prepare_trexio_kpoint_grid(qs_env, trexio_section, do_kpoints, kpoints_scf, &
1153 kpoints_out, created)
1156 LOGICAL,
INTENT(IN) :: do_kpoints
1157 TYPE(
kpoint_type),
POINTER :: kpoints_scf, kpoints_out
1158 LOGICAL,
INTENT(OUT) :: created
1161 CHARACTER(LEN=*),
PARAMETER :: routinen =
'prepare_trexio_kpoint_grid'
1163 CHARACTER(LEN=default_string_length) :: kp_scheme, reuse_reason
1164 INTEGER :: aligned_blocks, aligned_max_size, handle, &
1166 INTEGER,
DIMENSION(3) :: nkp_grid
1167 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1168 LOGICAL :: diis_step, full_grid, full_kpoint_grid, &
1169 gamma_centered, reuse_scf_mos, &
1170 reused_scf_mos, symmetry
1171 REAL(kind=
dp) :: aligned_min_svalue, eps_geo, wsum
1172 REAL(kind=
dp),
DIMENSION(3) :: kp_shift
1173 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp_source
1174 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp_source
1178 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_s
1188 CALL timeset(routinen, handle)
1191 kpoints_out => kpoints_scf
1192 NULLIFY (blacs_env, cell, cell_to_index, dft_control, logger, matrix_ks, matrix_s, mos, &
1193 para_env, particle_set, sab_nl, scf_control, scf_env, wkp_source, xkp_source)
1196 IF (.NOT. do_kpoints .OR. .NOT. full_kpoint_grid)
THEN
1197 CALL timestop(handle)
1200 cpassert(
ASSOCIATED(kpoints_scf))
1202 CALL get_kpoint_info(kpoints_scf, kp_scheme=kp_scheme, symmetry=symmetry, &
1203 full_grid=full_grid, nkp_grid=nkp_grid, kp_shift=kp_shift, &
1204 gamma_centered=gamma_centered, eps_geo=eps_geo)
1205 IF (.NOT. symmetry .OR. full_grid)
THEN
1206 CALL timestop(handle)
1210 SELECT CASE (trim(kp_scheme))
1211 CASE (
"MONKHORST-PACK",
"MACDONALD",
"GENERAL")
1214 cpabort(
"TREXIO%FULL_KPOINT_GRID supports only MONKHORST-PACK, MACDONALD, and GENERAL k-points.")
1220 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env, cell=cell, &
1221 particle_set=particle_set, mos=mos, dft_control=dft_control, &
1222 sab_orb=sab_nl, matrix_ks_kp=matrix_ks, matrix_s_kp=matrix_s, &
1223 scf_env=scf_env, scf_control=scf_control)
1224 cpassert(
ASSOCIATED(para_env))
1225 cpassert(
ASSOCIATED(blacs_env))
1226 cpassert(
ASSOCIATED(cell))
1227 cpassert(
ASSOCIATED(particle_set))
1228 cpassert(
ASSOCIATED(mos))
1229 cpassert(
ASSOCIATED(dft_control))
1230 cpassert(
ASSOCIATED(sab_nl))
1231 cpassert(
ASSOCIATED(matrix_ks))
1232 cpassert(
ASSOCIATED(matrix_s))
1233 cpassert(
ASSOCIATED(scf_env))
1234 cpassert(
ASSOCIATED(scf_control))
1236 NULLIFY (kpoints_out)
1238 kpoints_out%kp_scheme = kp_scheme
1239 kpoints_out%symmetry = .false.
1240 kpoints_out%full_grid = .true.
1241 kpoints_out%verbose = .false.
1242 kpoints_out%use_real_wfn = .false.
1243 kpoints_out%eps_geo = eps_geo
1244 kpoints_out%parallel_group_size = para_env%num_pe
1246 SELECT CASE (trim(kp_scheme))
1247 CASE (
"MONKHORST-PACK",
"MACDONALD")
1248 kpoints_out%nkp_grid(1:3) = nkp_grid(1:3)
1249 kpoints_out%kp_shift(1:3) = kp_shift(1:3)
1250 kpoints_out%gamma_centered = gamma_centered
1253 IF (.NOT.
ASSOCIATED(kpoints_scf%xkp_input) .OR. &
1254 .NOT.
ASSOCIATED(kpoints_scf%wkp_input))
THEN
1255 cpabort(
"TREXIO%FULL_KPOINT_GRID cannot recover the unreduced GENERAL k-point set.")
1257 xkp_source => kpoints_scf%xkp_input
1258 wkp_source => kpoints_scf%wkp_input
1259 nfull =
SIZE(wkp_source)
1260 wsum = sum(wkp_source)
1261 IF (wsum <= 0.0_dp) cpabort(
"TREXIO%FULL_KPOINT_GRID found invalid GENERAL k-point weights.")
1262 kpoints_out%nkp = nfull
1263 ALLOCATE (kpoints_out%xkp(3, nfull), kpoints_out%wkp(nfull))
1264 kpoints_out%xkp(1:3, 1:nfull) = xkp_source(1:3, 1:nfull)
1265 kpoints_out%wkp(1:nfull) = wkp_source(1:nfull)/wsum
1273 reused_scf_mos = .false.
1276 aligned_max_size = 0
1277 aligned_min_svalue = 0.0_dp
1279 IF (reuse_scf_mos)
THEN
1280 CALL do_general_diag_kp(matrix_ks, matrix_s, kpoints_scf, scf_env, scf_control, .false., &
1284 cell_to_index, sab_nl, para_env, reused_scf_mos, &
1285 reuse_reason, aligned_blocks, aligned_max_size, &
1288 IF (reused_scf_mos)
THEN
1289 IF (output_unit > 0)
THEN
1290 WRITE (output_unit,
'(T2,A)') &
1291 "TREXIO| Reused SCF MO coefficients for the full k-point grid."
1292 IF (aligned_blocks > 0)
THEN
1293 WRITE (output_unit,
'(T2,A,I0,A,I0,A,ES10.3)') &
1294 "TREXIO| Ritz-stabilized ", aligned_blocks, &
1295 " degenerate SCF MO subspace(s); largest block has ", aligned_max_size, &
1296 " band(s), min metric eigenvalue ", aligned_min_svalue
1300 IF (output_unit > 0)
THEN
1301 IF (reuse_scf_mos)
THEN
1302 WRITE (output_unit,
'(T2,A,A)') &
1303 "TREXIO| Could not reuse SCF MOs: ", trim(reuse_reason)
1305 WRITE (output_unit,
'(T2,A)') &
1306 "TREXIO| Diagonalizing the full k-point grid for export."
1309 CALL do_general_diag_kp(matrix_ks, matrix_s, kpoints_out, scf_env, scf_control, .false., &
1314 CALL timestop(handle)
1317 mark_used(trexio_section)
1318 mark_used(do_kpoints)
1319 mark_used(kpoints_scf)
1320 NULLIFY (kpoints_out)
1324 END SUBROUTINE prepare_trexio_kpoint_grid
1333 SUBROUTINE read_trexio(qs_env, trexio_filename, mo_set_trexio, energy_derivative)
1335 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: trexio_filename
1336 TYPE(
mo_set_type),
INTENT(OUT),
DIMENSION(:),
POINTER,
OPTIONAL :: mo_set_trexio
1337 TYPE(
dbcsr_p_type),
INTENT(OUT),
DIMENSION(:),
POINTER,
OPTIONAL :: energy_derivative
1341 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_trexio'
1343 INTEGER :: handle, output_unit, unit_de
1344 CHARACTER(len=default_path_length) :: filename, filename_de
1345 INTEGER(trexio_t) :: f
1346 INTEGER(trexio_exit_code) :: rc
1350 CHARACTER(LEN=2) :: element_symbol
1351 CHARACTER(LEN=2),
DIMENSION(:),
ALLOCATABLE :: label
1353 INTEGER :: ao_num, mo_num, nmo, nspins, ispin, nsgf, &
1354 save_cartesian, i, j, k, l, m, imo, ishell, &
1355 nshell, shell_num, nucleus_num, natoms, ikind, &
1356 iatom, nelectron, nrows, ncols, &
1357 row, col, row_size, col_size, &
1358 row_offset, col_offset, myprint
1359 INTEGER,
DIMENSION(2) :: nmo_spin, electron_num
1360 INTEGER,
DIMENSION(:),
ALLOCATABLE :: mo_spin, shell_ang_mom, trexio_to_cp2k_ang_mom
1362 REAL(kind=
dp) :: zeff, maxocc
1363 REAL(kind=
dp),
DIMENSION(:),
ALLOCATABLE :: mo_energy, mo_occupation, charge
1364 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: mo_coefficient, mos_sgf, coord, dedp, temp
1365 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
1368 TYPE(
cp_fm_type),
POINTER :: mo_coeff_ref, mo_coeff_target
1377 CALL timeset(routinen, handle)
1379 NULLIFY (logger, mo_coeff_ref, mo_coeff_target, para_env, dft_control, matrix_s, kind_set, mos, particle_set)
1383 myprint = logger%iter_info%print_level
1385 cpassert(
ASSOCIATED(qs_env))
1388 IF (.NOT.
PRESENT(trexio_filename))
THEN
1389 filename = trim(logger%iter_info%project_name)//
'-TREXIO.h5'
1390 filename_de = trim(logger%iter_info%project_name)//
'-TREXIO.dEdP.dat'
1392 filename = trim(trexio_filename)//
'.h5'
1393 filename_de = trim(trexio_filename)//
'.dEdP.dat'
1397 ionode = para_env%is_source()
1401 WRITE (output_unit,
"((T2,A,A))")
'TREXIO| Opening file named ', trim(filename)
1402 f = trexio_open(filename,
'r', trexio_hdf5, rc)
1403 CALL trexio_error(rc)
1406 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading molecule information...'
1408 rc = trexio_read_nucleus_num(f, nucleus_num)
1409 CALL trexio_error(rc)
1412 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading nuclear coordinates...'
1414 ALLOCATE (coord(3, nucleus_num))
1415 rc = trexio_read_nucleus_coord(f, coord)
1416 CALL trexio_error(rc)
1419 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading nuclear labels...'
1421 ALLOCATE (label(nucleus_num))
1422 rc = trexio_read_nucleus_label(f, label, 3)
1423 CALL trexio_error(rc)
1426 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading nuclear charges...'
1428 ALLOCATE (charge(nucleus_num))
1429 rc = trexio_read_nucleus_charge(f, charge)
1430 CALL trexio_error(rc)
1433 CALL get_qs_env(qs_env, particle_set=particle_set, qs_kind_set=kind_set, natom=natoms)
1436 cpassert(nucleus_num == natoms)
1438 DO iatom = 1, natoms
1441 cpassert(abs(coord(i, iatom) - particle_set(iatom)%r(i)) < 1.0e-6_dp)
1445 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, element_symbol=element_symbol, kind_number=ikind)
1447 cpassert(trim(element_symbol) == trim(label(iatom)))
1452 cpassert(charge(iatom) == zeff)
1455 WRITE (output_unit,
"((T2,A))")
'TREXIO| Molecule is the same as in qs_env'
1462 rc = trexio_read_ao_cartesian(f, save_cartesian)
1463 CALL trexio_error(rc)
1465 rc = trexio_read_ao_num(f, ao_num)
1466 CALL trexio_error(rc)
1468 rc = trexio_read_basis_shell_num(f, shell_num)
1469 CALL trexio_error(rc)
1472 CALL para_env%bcast(save_cartesian, para_env%source)
1473 CALL para_env%bcast(ao_num, para_env%source)
1474 CALL para_env%bcast(shell_num, para_env%source)
1476 IF (save_cartesian == 1)
THEN
1477 cpabort(
'Reading Cartesian AOs is not yet supported.')
1481 CALL get_qs_env(qs_env, qs_kind_set=kind_set)
1483 cpassert(ao_num == nsgf)
1484 cpassert(shell_num == nshell)
1486 ALLOCATE (shell_ang_mom(shell_num))
1487 shell_ang_mom(:) = 0
1491 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading shell angular momenta...'
1493 rc = trexio_read_basis_shell_ang_mom(f, shell_ang_mom)
1494 CALL trexio_error(rc)
1497 CALL para_env%bcast(shell_ang_mom, para_env%source)
1502 ALLOCATE (trexio_to_cp2k_ang_mom(nsgf))
1504 DO ishell = 1, shell_num
1505 l = shell_ang_mom(ishell)
1507 m = (-1)**k*floor(real(k, kind=
dp)/2.0_dp)
1508 trexio_to_cp2k_ang_mom(i + l + 1 + m) = i + k
1515 IF (
PRESENT(mo_set_trexio))
THEN
1516 IF (output_unit > 1)
THEN
1517 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading molecular orbitals...'
1523 rc = trexio_read_mo_num(f, mo_num)
1524 CALL trexio_error(rc)
1526 rc = trexio_read_electron_up_num(f, electron_num(1))
1527 CALL trexio_error(rc)
1529 rc = trexio_read_electron_dn_num(f, electron_num(2))
1530 CALL trexio_error(rc)
1534 CALL para_env%bcast(mo_num, para_env%source)
1535 CALL para_env%bcast(electron_num, para_env%source)
1538 CALL get_qs_env(qs_env, mos=mos, dft_control=dft_control)
1539 nspins = dft_control%nspins
1541 DO ispin = 1, nspins
1543 nmo_spin(ispin) = nmo
1545 cpassert(mo_num == sum(nmo_spin))
1547 ALLOCATE (mo_coefficient(ao_num, mo_num))
1548 ALLOCATE (mo_energy(mo_num))
1549 ALLOCATE (mo_occupation(mo_num))
1550 ALLOCATE (mo_spin(mo_num))
1552 mo_coefficient(:, :) = 0.0_dp
1553 mo_energy(:) = 0.0_dp
1554 mo_occupation(:) = 0.0_dp
1560 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading MO coefficients...'
1562 rc = trexio_read_mo_coefficient(f, mo_coefficient)
1563 CALL trexio_error(rc)
1566 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading MO energies...'
1568 rc = trexio_read_mo_energy(f, mo_energy)
1569 CALL trexio_error(rc)
1572 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading MO occupations...'
1574 rc = trexio_read_mo_occupation(f, mo_occupation)
1575 CALL trexio_error(rc)
1578 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading MO spins...'
1580 rc = trexio_read_mo_spin(f, mo_spin)
1581 CALL trexio_error(rc)
1585 CALL para_env%bcast(mo_coefficient, para_env%source)
1586 CALL para_env%bcast(mo_energy, para_env%source)
1587 CALL para_env%bcast(mo_occupation, para_env%source)
1588 CALL para_env%bcast(mo_spin, para_env%source)
1592 DO ispin = 1, nspins
1594 imo = (ispin - 1)*nmo_spin(1)
1596 nmo = nmo_spin(ispin)
1598 ALLOCATE (mos_sgf(nsgf, nmo))
1599 mos_sgf(:, :) = 0.0_dp
1603 mos_sgf(i, :) = mo_coefficient(trexio_to_cp2k_ang_mom(i), imo + 1:imo + nmo)
1606 IF (nspins == 1)
THEN
1608 nelectron = electron_num(1) + electron_num(2)
1611 nelectron = electron_num(ispin)
1614 CALL allocate_mo_set(mo_set_trexio(ispin), nsgf, nmo, nelectron, 0.0_dp, maxocc, 0.0_dp)
1616 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff_ref)
1617 CALL init_mo_set(mo_set_trexio(ispin), fm_ref=mo_coeff_ref, name=
"TREXIO MOs")
1619 CALL get_mo_set(mo_set_trexio(ispin), mo_coeff=mo_coeff_target)
1622 cpassert(mo_spin(j) == ispin - 1)
1623 mo_set_trexio(ispin)%eigenvalues(j) = mo_energy(imo + j)
1624 mo_set_trexio(ispin)%occupation_numbers(j) = mo_occupation(imo + j)
1630 DEALLOCATE (mos_sgf)
1633 DEALLOCATE (mo_coefficient)
1634 DEALLOCATE (mo_energy)
1635 DEALLOCATE (mo_occupation)
1636 DEALLOCATE (mo_spin)
1641 IF (
PRESENT(energy_derivative))
THEN
1642 IF (output_unit > 1)
THEN
1643 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading energy derivatives...'
1650 ALLOCATE (temp(nsgf, nsgf))
1656 CALL open_file(file_name=filename_de, file_status=
"OLD", unit_number=unit_de)
1658 cpabort(
"Energy derivatives file "//trim(filename_de)//
" not found")
1663 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading header information...'
1665 READ (unit_de, *) nrows, ncols
1667 WRITE (output_unit,
"((T2,A))")
'TREXIO| Check size of dEdP matrix...'
1669 cpassert(nrows == nsgf)
1670 cpassert(ncols == nsgf)
1674 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading dEdP matrix...'
1678 READ (unit_de, *) (temp(i, j), j=1, ncols)
1685 CALL para_env%bcast(temp, para_env%source)
1688 ALLOCATE (dedp(nsgf, nsgf))
1695 dedp(i, j) = temp(trexio_to_cp2k_ang_mom(i), trexio_to_cp2k_ang_mom(j))
1704 DO ispin = 1, nspins
1705 ALLOCATE (energy_derivative(ispin)%matrix)
1708 CALL dbcsr_copy(energy_derivative(ispin)%matrix, matrix_s(1)%matrix, &
1709 name=
'Energy Derivative', keep_sparsity=.false.)
1710 CALL dbcsr_set(energy_derivative(ispin)%matrix, 0.0_dp)
1715 row_size=row_size, col_size=col_size, &
1716 row_offset=row_offset, col_offset=col_offset)
1721 data_block(i, j) = dedp(row_offset + i - 1, col_offset + j - 1)
1732 IF (
ALLOCATED(shell_ang_mom))
DEALLOCATE (shell_ang_mom)
1733 IF (
ALLOCATED(trexio_to_cp2k_ang_mom))
DEALLOCATE (trexio_to_cp2k_ang_mom)
1737 WRITE (output_unit,
"((T2,A,A))")
'TREXIO| Closing file named ', trim(filename)
1738 rc = trexio_close(f)
1739 CALL trexio_error(rc)
1742 CALL timestop(handle)
1746 mark_used(trexio_filename)
1747 mark_used(mo_set_trexio)
1748 mark_used(energy_derivative)
1749 cpwarn(
'TREXIO support has not been enabled in this build.')
1750 cpabort(
'TREXIO Not Available')
1760 SUBROUTINE trexio_error(rc)
1761 INTEGER(trexio_exit_code),
INTENT(IN) :: rc
1763 CHARACTER(LEN=128) :: err_msg
1765 IF (rc /= trexio_success)
THEN
1766 CALL trexio_string_of_error(rc, err_msg)
1767 cpabort(
'TREXIO Error: '//trim(err_msg))
1770 END SUBROUTINE trexio_error
1778 SUBROUTINE nuclear_repulsion_energy(particle_set, kind_set, e_nn)
1780 POINTER :: particle_set
1783 REAL(kind=
dp),
INTENT(OUT) :: e_nn
1785 INTEGER :: i, ikind, j, jkind, natoms
1786 REAL(kind=
dp) :: r_ij, zeff_i, zeff_j
1788 natoms =
SIZE(particle_set)
1793 DO j = i + 1, natoms
1794 r_ij = norm2(particle_set(i)%r - particle_set(j)%r)
1799 e_nn = e_nn + zeff_i*zeff_j/r_ij
1803 END SUBROUTINE nuclear_repulsion_energy
1811 FUNCTION sgf_norm(l, expnt)
RESULT(norm)
1812 INTEGER,
INTENT(IN) :: l
1813 REAL(kind=
dp),
INTENT(IN) :: expnt
1814 REAL(kind=
dp) :: norm
1817 norm = sqrt(2**(2*l + 3)*
fac(l + 1)*(2*expnt)**(l + 1.5)/(
fac(2*l + 2)*sqrt(
pi)))
1819 cpabort(
"The angular momentum should be >= 0!")
1822 END FUNCTION sgf_norm
1831 SUBROUTINE spherical_to_cartesian_mo(mos_sgf, particle_set, qs_kind_set, mos_cgf)
1832 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: mos_sgf
1834 POINTER :: particle_set
1836 POINTER :: qs_kind_set
1837 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: mos_cgf
1839 INTEGER :: iatom, icgf, ikind, iset, isgf, ishell, &
1840 lshell, ncgf, nmo, nset, nsgf
1841 INTEGER,
DIMENSION(:),
POINTER :: nshell
1842 INTEGER,
DIMENSION(:, :),
POINTER :: l
1847 mos_cgf(:, :) = 0.0_dp
1848 nmo =
SIZE(mos_sgf, 2)
1853 DO iatom = 1,
SIZE(particle_set)
1854 NULLIFY (orb_basis_set)
1855 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1856 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
1858 IF (
ASSOCIATED(orb_basis_set))
THEN
1864 DO ishell = 1, nshell(iset)
1865 lshell = l(ishell, iset)
1866 CALL dgemm(
"T",
"N",
nco(lshell), nmo,
nso(lshell), 1.0_dp, &
1868 mos_sgf(isgf, 1), nsgf, 0.0_dp, &
1869 mos_cgf(icgf, 1), ncgf)
1870 icgf = icgf +
nco(lshell)
1871 isgf = isgf +
nso(lshell)
1876 cpabort(
"Unknown basis set type")
1880 END SUBROUTINE spherical_to_cartesian_mo
1889 SUBROUTINE cartesian_to_spherical_mo(mos_cgf, particle_set, qs_kind_set, mos_sgf)
1890 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: mos_cgf
1892 POINTER :: particle_set
1894 POINTER :: qs_kind_set
1895 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: mos_sgf
1897 INTEGER :: iatom, icgf, ikind, iset, isgf, ishell, &
1898 lshell, ncgf, nmo, nset, nsgf
1899 INTEGER,
DIMENSION(:),
POINTER :: nshell
1900 INTEGER,
DIMENSION(:, :),
POINTER :: l
1905 mos_sgf(:, :) = 0.0_dp
1906 nmo =
SIZE(mos_cgf, 2)
1911 DO iatom = 1,
SIZE(particle_set)
1912 NULLIFY (orb_basis_set)
1913 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1914 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
1916 IF (
ASSOCIATED(orb_basis_set))
THEN
1922 DO ishell = 1, nshell(iset)
1923 lshell = l(ishell, iset)
1924 CALL dgemm(
"N",
"N",
nso(lshell), nmo,
nco(lshell), 1.0_dp, &
1926 mos_cgf(icgf, 1), ncgf, 0.0_dp, &
1927 mos_sgf(isgf, 1), nsgf)
1928 icgf = icgf +
nco(lshell)
1929 isgf = isgf +
nso(lshell)
1934 cpabort(
"Unknown basis set type")
1938 END SUBROUTINE cartesian_to_spherical_mo
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
subroutine, public sg_overlap(smat, l, pa, pb)
...
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum, ccon)
...
Handles all functions related to the CELL.
subroutine, public real_to_scaled(s, r, cell)
Transform real to scaled cell coordinates. s=h_inv*r.
real(kind=dp) function, dimension(3), public pbc_stable(r, cell)
Apply a stable periodic-image convention for k-point Bloch gauges.
some minimal info about CP2K, including its version and license
character(len= *), parameter, public cp2k_version
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
character function, public dbcsr_get_matrix_type(matrix)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_reserve_all_blocks(matrix)
Reserves all blocks.
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers, cartesian_basis)
...
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
logical function, public file_exists(file_name)
Checks if file exists, considering also the file discovery mechanism.
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_to_fm_submat_general(source, destination, nrows, ncols, s_firstrow, s_firstcol, d_firstrow, d_firstcol, global_context)
General copy of a submatrix of fm matrix to a submatrix of another fm matrix. The two matrices can ha...
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
subroutine, public cp_fm_set_element(matrix, irow_global, icol_global, alpha)
sets an element of a matrix
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer, parameter, public medium_print_level
Definition of the atomic potential types.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Routines needed for kpoint calculation.
subroutine, public kpoint_initialize_mo_set(kpoint)
...
subroutine, public kpoint_init_cell_index(kpoint, sab_nl, para_env, nimages)
Generates the mapping of cell indices and linear RS index CELL (0,0,0) is always mapped to index 1.
subroutine, public kpoint_initialize_mos(kpoint, mos, added_mos, for_aux_fit)
Initialize a set of MOs and density matrix for each kpoint (kpoint group)
subroutine, public kpoint_initialize(kpoint, particle_set, cell)
Generate the kpoints and initialize the kpoint environment.
subroutine, public kpoint_env_initialize(kpoint, para_env, blacs_env, with_aux_fit)
Initialize the kpoint environment.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
Get information from a single kpoint environment.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Retrieve information from a kpoint environment.
subroutine, public kpoint_release(kpoint)
Release a kpoint environment, deallocate all data.
subroutine, public kpoint_create(kpoint)
Create a kpoint environment.
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), parameter, public fourpi
real(kind=dp), dimension(0:maxfac), parameter, public fac
Collection of simple mathematical functions and subroutines.
subroutine, public symmetrize_matrix(a, option)
Symmetrize the matrix a.
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public nco
integer, dimension(:), allocatable, public nso
Define the data structure for the particle information.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, do_mtlr_present, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
Definition and initialisation of the mo data type.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name, counter)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
subroutine, public allocate_mo_set(mo_set, nao, nmo, nelectron, n_el_f, maxocc, flexible_electron_count)
Allocates a mo set and partially initializes it (nao,nmo,nelectron, and flexible_electron_count are v...
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
Different diagonalization schemes that can be used for the iterative solution of the eigenvalue probl...
subroutine, public do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, update_p, diis_step, diis_error, qs_env, probe)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
module that contains the definitions of the scf types
Interface to Wannier90 code.
subroutine, public prepare_wannier90_scf_mos(kpoint, qs_kpoint, matrix_s, matrix_ks, cell_to_index, sab_nl, para_env, success, reason, aligned_degenerate_blocks, aligned_degenerate_max_size, aligned_degenerate_min_svalue)
Reconstruct a full Wannier90 k-point MO set from the SCF k-point MOs.
parameters that control an scf iteration
The module to read/write TREX IO files for interfacing CP2K with other programs.
subroutine, public write_trexio(qs_env, trexio_section, energy_derivative)
Write a trexio file.
subroutine, public read_trexio(qs_env, trexio_filename, mo_set_trexio, energy_derivative)
Read a trexio file.
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Contains information about kpoints.
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.