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
201 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: agauge
202 REAL(kind=
dp) :: scoord(3), kdotg, cval, sval, re_old, im_old
203 INTEGER,
DIMENSION(:),
POINTER :: nshell, npgf
204 INTEGER,
DIMENSION(:, :),
POINTER :: l_shell_set
205 REAL(kind=
dp),
DIMENSION(:),
ALLOCATABLE :: charge, shell_factor, exponents, coefficients, &
206 prim_factor, ao_normalization, mo_energy, &
207 mo_occupation, sgcc, ecp_coefficients, &
209 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp, norm_cgf
210 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: coord, mo_coefficient, mo_coefficient_im, &
212 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: zetas, data_block, xkp
213 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: gcc
215 CALL timeset(routinen, handle)
217 NULLIFY (cell, logger, dft_control, basis_set, kpoints, trexio_kpoints, particle_set, &
219 NULLIFY (sgp_potential, mos, mos_kp, kp_env, para_env, para_env_inter_kp, blacs_env)
220 NULLIFY (fm_struct, nshell, npgf, l_shell_set, wkp, norm_cgf, zetas, data_block, gcc)
225 cpassert(
ASSOCIATED(qs_env))
229 IF (.NOT. explicit)
THEN
230 filename = trim(logger%iter_info%project_name)//
'-TREXIO.h5'
232 filename = trim(filename)//
'.h5'
236 ionode = para_env%is_source()
237 CALL get_qs_env(qs_env, do_kpoints=do_kpoints, kpoints=kpoints)
238 trexio_kpoints => kpoints
239 trexio_kpoints_created = .false.
240 CALL prepare_trexio_kpoint_grid(qs_env, trexio_section, do_kpoints, kpoints, &
241 trexio_kpoints, trexio_kpoints_created)
246 CALL open_file(filename, unit_number=unit_trexio)
247 CALL close_file(unit_number=unit_trexio, file_status=
"DELETE")
253 WRITE (output_unit,
"((T2,A,A))")
'TREXIO| Writing trexio file ', trim(filename)
254 f = trexio_open(filename,
'w', trexio_hdf5, rc)
255 CALL trexio_error(rc)
260 rc = trexio_write_metadata_code_num(f, 1)
261 CALL trexio_error(rc)
264 CALL trexio_error(rc)
269 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set, qs_kind_set=kind_set, natom=natoms)
271 rc = trexio_write_nucleus_num(f, natoms)
272 CALL trexio_error(rc)
274 ALLOCATE (coord(3, natoms))
275 ALLOCATE (label(natoms))
276 ALLOCATE (charge(natoms))
279 coord(:, iatom) = particle_set(iatom)%r(1:3)
281 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, element_symbol=element_symbol, kind_number=ikind)
283 label(iatom) = element_symbol
289 rc = trexio_write_nucleus_coord(f, coord)
290 CALL trexio_error(rc)
293 rc = trexio_write_nucleus_charge(f, charge)
294 CALL trexio_error(rc)
297 rc = trexio_write_nucleus_label(f, label, 3)
298 CALL trexio_error(rc)
302 IF (sum(cell%perd) == 0)
THEN
303 CALL nuclear_repulsion_energy(particle_set, kind_set, e_nn)
304 rc = trexio_write_nucleus_repulsion(f, e_nn)
305 CALL trexio_error(rc)
311 rc = trexio_write_cell_a(f, cell%hmat(:, 1))
312 CALL trexio_error(rc)
314 rc = trexio_write_cell_b(f, cell%hmat(:, 2))
315 CALL trexio_error(rc)
317 rc = trexio_write_cell_c(f, cell%hmat(:, 3))
318 CALL trexio_error(rc)
320 rc = trexio_write_cell_g_a(f, cell%h_inv(:, 1))
321 CALL trexio_error(rc)
323 rc = trexio_write_cell_g_b(f, cell%h_inv(:, 2))
324 CALL trexio_error(rc)
326 rc = trexio_write_cell_g_c(f, cell%h_inv(:, 3))
327 CALL trexio_error(rc)
329 rc = trexio_write_cell_two_pi(f, 0)
330 CALL trexio_error(rc)
336 IF (sum(cell%perd) /= 0) periodic = 1
337 rc = trexio_write_pbc_periodic(f, periodic)
338 CALL trexio_error(rc)
343 rc = trexio_write_pbc_k_point_num(f, nkp)
344 CALL trexio_error(rc)
346 rc = trexio_write_pbc_k_point(f, xkp)
347 CALL trexio_error(rc)
349 rc = trexio_write_pbc_k_point_weight(f, wkp)
350 CALL trexio_error(rc)
356 CALL get_qs_env(qs_env, dft_control=dft_control, nelectron_total=nel_tot)
358 rc = trexio_write_electron_num(f, nel_tot)
359 CALL trexio_error(rc)
361 nspins = dft_control%nspins
362 IF (nspins == 1)
THEN
365 nel_spin(1) = nel_tot/2
366 nel_spin(2) = nel_tot/2
370 CALL get_qs_env(qs_env, nelectron_spin=nel_spin)
372 rc = trexio_write_electron_up_num(f, nel_spin(1))
373 CALL trexio_error(rc)
374 rc = trexio_write_electron_dn_num(f, nel_spin(2))
375 CALL trexio_error(rc)
382 rc = trexio_write_state_num(f, 1)
383 CALL trexio_error(rc)
385 rc = trexio_write_state_id(f, 1)
386 CALL trexio_error(rc)
389 CALL trexio_error(rc)
396 CALL get_qs_env(qs_env, qs_kind_set=kind_set, natom=natoms, particle_set=particle_set)
402 rc = trexio_write_basis_type(f,
'Gaussian', len_trim(
'Gaussian') + 1)
403 CALL trexio_error(rc)
405 rc = trexio_write_basis_shell_num(f, shell_num)
406 CALL trexio_error(rc)
408 rc = trexio_write_basis_prim_num(f, prim_num)
409 CALL trexio_error(rc)
413 ALLOCATE (nucleus_index(shell_num))
414 ALLOCATE (shell_ang_mom(shell_num))
415 ALLOCATE (shell_index(prim_num))
416 ALLOCATE (exponents(prim_num))
417 ALLOCATE (coefficients(prim_num))
418 ALLOCATE (prim_factor(prim_num))
421 IF (.NOT. save_cartesian)
THEN
422 ALLOCATE (sgf_coefficients(prim_num))
429 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
431 CALL get_qs_kind(kind_set(ikind), basis_set=basis_set, basis_type=
"ORB")
442 DO ishell_loc = 1, nshell(iset)
446 nucleus_index(ishell) = iatom
449 l = l_shell_set(ishell_loc, iset)
450 shell_ang_mom(ishell) = l
453 shell_index(ipgf + 1:ipgf + npgf(iset)) = ishell
456 exponents(ipgf + 1:ipgf + npgf(iset)) = zetas(1:npgf(iset), iset)
460 expzet = 0.25_dp*real(2*l + 3,
dp)
461 prefac = 2.0_dp**l*(2.0_dp/
pi)**0.75_dp
463 gcca = gcc(i, ishell_loc, iset)
464 zeta = zetas(i, iset)
465 prim_cart_fac = prefac*zeta**expzet
468 coefficients(ipgf + i) = gcca/prim_cart_fac
470 IF (save_cartesian)
THEN
472 prim_factor(ipgf + i) = prim_cart_fac
475 prim_factor(ipgf + i) = sgf_norm(l, exponents(ipgf + i))
477 sgf_coefficients(ipgf + i) = coefficients(ipgf + i)*prim_factor(ipgf + i)
482 ipgf = ipgf + npgf(iset)
487 cpassert(ishell == shell_num)
488 cpassert(ipgf == prim_num)
491 rc = trexio_write_basis_nucleus_index(f, nucleus_index)
492 CALL trexio_error(rc)
494 rc = trexio_write_basis_shell_ang_mom(f, shell_ang_mom)
495 CALL trexio_error(rc)
498 ALLOCATE (shell_factor(shell_num))
499 shell_factor(:) = 1.0_dp
500 rc = trexio_write_basis_shell_factor(f, shell_factor)
501 CALL trexio_error(rc)
502 DEALLOCATE (shell_factor)
505 ALLOCATE (r_power(shell_num))
507 rc = trexio_write_basis_r_power(f, r_power)
508 CALL trexio_error(rc)
511 rc = trexio_write_basis_shell_index(f, shell_index)
512 CALL trexio_error(rc)
514 rc = trexio_write_basis_exponent(f, exponents)
515 CALL trexio_error(rc)
517 rc = trexio_write_basis_coefficient(f, coefficients)
518 CALL trexio_error(rc)
521 rc = trexio_write_basis_prim_factor(f, prim_factor)
522 CALL trexio_error(rc)
525 DEALLOCATE (nucleus_index)
526 DEALLOCATE (shell_index)
527 DEALLOCATE (exponents)
528 DEALLOCATE (coefficients)
529 DEALLOCATE (prim_factor)
536 CALL get_qs_kind_set(kind_set, sgp_potential_present=sgp_potential_present)
540 IF (sgp_potential_present)
THEN
543 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
545 CALL get_qs_kind(kind_set(ikind), sgp_potential=sgp_potential)
548 IF (
ASSOCIATED(sgp_potential))
THEN
549 CALL get_potential(potential=sgp_potential, ecp_local=ecp_local, ecp_semi_local=ecp_semi_local)
553 ecp_num = ecp_num + nloc
555 IF (ecp_semi_local)
THEN
558 ecp_num = ecp_num + sum(npot)
565 IF (ecp_num > 0)
THEN
566 ALLOCATE (z_core(natoms))
567 ALLOCATE (max_ang_mom_plus_1(natoms))
568 max_ang_mom_plus_1(:) = 0
570 ALLOCATE (ang_mom(ecp_num))
571 ALLOCATE (nucleus_index(ecp_num))
572 ALLOCATE (exponents(ecp_num))
573 ALLOCATE (ecp_coefficients(ecp_num))
574 ALLOCATE (powers(ecp_num))
579 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind, z=z)
581 CALL get_qs_kind(kind_set(ikind), sgp_potential=sgp_potential, zeff=zeff)
584 z_core(iatom) = z - int(zeff)
587 IF (
ASSOCIATED(sgp_potential))
THEN
588 CALL get_potential(potential=sgp_potential, ecp_local=ecp_local, ecp_semi_local=ecp_semi_local)
592 CALL get_potential(potential=sgp_potential, nloc=nloc, sl_lmax=sl_lmax)
593 ang_mom(iecp + 1:iecp + nloc) = sl_lmax + 1
594 nucleus_index(iecp + 1:iecp + nloc) = iatom
595 exponents(iecp + 1:iecp + nloc) = sgp_potential%bloc(1:nloc)
596 ecp_coefficients(iecp + 1:iecp + nloc) = sgp_potential%aloc(1:nloc)
597 powers(iecp + 1:iecp + nloc) = sgp_potential%nrloc(1:nloc) - 2
602 IF (ecp_semi_local)
THEN
603 CALL get_potential(potential=sgp_potential, npot=npot, sl_lmax=sl_lmax)
604 max_ang_mom_plus_1(iatom) = sl_lmax + 1
607 nsemiloc = npot(sl_l)
608 ang_mom(iecp + 1:iecp + nsemiloc) = sl_l
609 nucleus_index(iecp + 1:iecp + nsemiloc) = iatom
610 exponents(iecp + 1:iecp + nsemiloc) = sgp_potential%bpot(1:nsemiloc, sl_l)
611 ecp_coefficients(iecp + 1:iecp + nsemiloc) = sgp_potential%apot(1:nsemiloc, sl_l)
612 powers(iecp + 1:iecp + nsemiloc) = sgp_potential%nrpot(1:nsemiloc, sl_l) - 2
613 iecp = iecp + nsemiloc
620 cpassert(iecp == ecp_num)
622 rc = trexio_write_ecp_num(f, ecp_num)
623 CALL trexio_error(rc)
625 rc = trexio_write_ecp_z_core(f, z_core)
626 CALL trexio_error(rc)
629 rc = trexio_write_ecp_max_ang_mom_plus_1(f, max_ang_mom_plus_1)
630 CALL trexio_error(rc)
631 DEALLOCATE (max_ang_mom_plus_1)
633 rc = trexio_write_ecp_ang_mom(f, ang_mom)
634 CALL trexio_error(rc)
637 rc = trexio_write_ecp_nucleus_index(f, nucleus_index)
638 CALL trexio_error(rc)
639 DEALLOCATE (nucleus_index)
641 rc = trexio_write_ecp_exponent(f, exponents)
642 CALL trexio_error(rc)
643 DEALLOCATE (exponents)
645 rc = trexio_write_ecp_coefficient(f, ecp_coefficients)
646 CALL trexio_error(rc)
647 DEALLOCATE (ecp_coefficients)
649 rc = trexio_write_ecp_power(f, powers)
650 CALL trexio_error(rc)
667 IF (save_cartesian)
THEN
674 IF (save_cartesian)
THEN
675 rc = trexio_write_ao_cartesian(f, 1)
677 rc = trexio_write_ao_cartesian(f, 0)
679 CALL trexio_error(rc)
681 rc = trexio_write_ao_num(f, ao_num)
682 CALL trexio_error(rc)
686 ALLOCATE (ao_shell(ao_num))
687 ALLOCATE (ao_normalization(ao_num))
688 ALLOCATE (ao_to_atom(ao_num))
690 IF (.NOT. save_cartesian)
THEN
694 ALLOCATE (cp2k_to_trexio_ang_mom(ao_num))
696 DO ishell = 1, shell_num
697 l = shell_ang_mom(ishell)
699 m = (-1)**k*floor(real(k, kind=
dp)/2.0_dp)
700 cp2k_to_trexio_ang_mom(i + k) = i + l + 1 + m
704 cpassert(i == ao_num)
713 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
715 CALL get_qs_kind(kind_set(ikind), basis_set=basis_set, basis_type=
"ORB")
728 DO ishell_loc = 1, nshell(iset)
732 l = l_shell_set(ishell_loc, iset)
735 IF (save_cartesian)
THEN
742 ao_shell(iao + 1:iao + nao_shell) = ishell
745 ao_to_atom(iao + 1:iao + nao_shell) = iatom
748 IF (save_cartesian)
THEN
749 ao_normalization(iao + 1:iao + nao_shell) = norm_cgf(icgf_atom + 1:icgf_atom + nao_shell)
752 ALLOCATE (sloc(npgf(iset), npgf(iset)))
753 ALLOCATE (sgcc(npgf(iset)))
754 CALL sg_overlap(sloc, l, zetas(1:npgf(iset), iset), zetas(1:npgf(iset), iset))
757 sgcc(:) = matmul(sloc, sgf_coefficients(ipgf + 1:ipgf + npgf(iset)))
758 nsgto = 1.0_dp/sqrt(dot_product(sgf_coefficients(ipgf + 1:ipgf + npgf(iset)), sgcc))
766 ao_normalization(iao + 1:iao + nao_shell) = nsgto*sqrt((2*l + 1)/(4*
pi))
769 ipgf = ipgf + npgf(iset)
770 iao = iao + nao_shell
771 icgf_atom = icgf_atom +
nco(l)
775 cpassert(icgf_atom == ncgf_atom)
779 rc = trexio_write_ao_shell(f, ao_shell)
780 CALL trexio_error(rc)
782 rc = trexio_write_ao_normalization(f, ao_normalization)
783 CALL trexio_error(rc)
786 DEALLOCATE (ao_shell)
787 DEALLOCATE (ao_normalization)
788 IF (
ALLOCATED(sgf_coefficients))
DEALLOCATE (sgf_coefficients)
793 CALL get_qs_env(qs_env, do_kpoints=do_kpoints, kpoints=kpoints, dft_control=dft_control, &
794 particle_set=particle_set, qs_kind_set=kind_set, blacs_env=blacs_env, &
796 nspins = dft_control%nspins
803 CALL get_kpoint_info(trexio_kpoints, kp_env=kp_env, nkp=nkp, use_real_wfn=use_real_wfn)
807 nmo_spin(ispin) = nmo
809 mo_num = nkp*sum(nmo_spin)
813 nrow_global=nsgf, ncol_global=mo_num)
816 IF (.NOT. use_real_wfn)
THEN
825 nmo_spin(ispin) = nmo
827 mo_num = sum(nmo_spin)
831 ALLOCATE (mo_coefficient(ao_num, mo_num))
832 mo_coefficient(:, :) = 0.0_dp
833 ALLOCATE (mo_energy(mo_num))
834 mo_energy(:) = 0.0_dp
835 ALLOCATE (mo_occupation(mo_num))
836 mo_occupation(:) = 0.0_dp
837 ALLOCATE (mo_spin(mo_num))
841 ALLOCATE (mo_coefficient_im(ao_num, mo_num))
842 mo_coefficient_im(:, :) = 0.0_dp
843 ALLOCATE (mo_kpoint(mo_num))
851 CALL get_kpoint_info(trexio_kpoints, kp_env=kp_env, nkp=nkp, kp_range=kp_range)
855 nmo = nmo_spin(ispin)
857 imo = (ikp - 1)*nmo + (ispin - 1)*nmo_spin(1)*nkp
860 IF (ikp >= kp_range(1) .AND. ikp <= kp_range(2))
THEN
861 ikp_loc = ikp - kp_range(1) + 1
866 IF (mos_kp(1, ispin)%use_mo_coeff_b)
THEN
867 CALL copy_dbcsr_to_fm(mos_kp(1, ispin)%mo_coeff_b, mos_kp(1, ispin)%mo_coeff)
871 nsgf, nmo, 1, 1, 1, imo + 1, blacs_env)
874 mo_energy(imo + 1:imo + nmo) = mos_kp(1, ispin)%eigenvalues(1:nmo)
877 mo_occupation(imo + 1:imo + nmo) = mos_kp(1, ispin)%occupation_numbers(1:nmo)
880 IF (.NOT. use_real_wfn)
THEN
881 IF (mos_kp(2, ispin)%use_mo_coeff_b)
THEN
882 CALL copy_dbcsr_to_fm(mos_kp(2, ispin)%mo_coeff_b, mos_kp(2, ispin)%mo_coeff)
885 nsgf, nmo, 1, 1, 1, imo + 1, blacs_env)
890 nsgf, nmo, 1, 1, 1, imo + 1, blacs_env)
891 IF (.NOT. use_real_wfn)
THEN
893 nsgf, nmo, 1, 1, 1, imo + 1, blacs_env)
902 CALL get_kpoint_info(trexio_kpoints, para_env_inter_kp=para_env_inter_kp)
903 CALL para_env_inter_kp%sum(mo_energy)
904 CALL para_env_inter_kp%sum(mo_occupation)
912 IF (do_kpoints .AND. .NOT. use_real_wfn)
THEN
914 ALLOCATE (agauge(3, natoms))
916 scoord(:) = matmul(cell%h_inv, particle_set(iatom)%r(1:3))
917 agauge(:, iatom) = -nint(scoord(:))
924 nmo = nmo_spin(ispin)
926 ALLOCATE (mos_sgf(nsgf, nmo))
927 mos_sgf(:, :) = 0.0_dp
932 imo = (ikp - 1)*nmo + (ispin - 1)*nmo_spin(1)*nkp
935 mo_kpoint(imo + 1:imo + nmo) = ikp
937 mo_spin(imo + 1:imo + nmo) = ispin - 1
941 IF (save_cartesian)
THEN
942 CALL spherical_to_cartesian_mo(mos_sgf, particle_set, kind_set, mo_coefficient(:, imo + 1:imo + nmo))
946 mo_coefficient(i, imo + 1:imo + nmo) = mos_sgf(cp2k_to_trexio_ang_mom(i), :)
951 IF (.NOT. use_real_wfn)
THEN
953 IF (save_cartesian)
THEN
954 CALL spherical_to_cartesian_mo(mos_sgf, particle_set, kind_set, mo_coefficient_im(:, imo + 1:imo + nmo))
958 mo_coefficient_im(i, imo + 1:imo + nmo) = mos_sgf(cp2k_to_trexio_ang_mom(i), :)
966 iatom = ao_to_atom(iao)
967 kdotg = 2.0_dp*
pi*dot_product(xkp(:, ikp), real(agauge(:, iatom), kind=
dp))
970 DO j = imo + 1, imo + nmo
971 re_old = mo_coefficient(iao, j)
972 im_old = mo_coefficient_im(iao, j)
973 mo_coefficient(iao, j) = cval*re_old + sval*im_old
974 mo_coefficient_im(iao, j) = -sval*re_old + cval*im_old
981 imo = (ispin - 1)*nmo_spin(1)
983 mo_energy(imo + 1:imo + nmo) = mos(ispin)%eigenvalues
985 mo_occupation(imo + 1:imo + nmo) = mos(ispin)%occupation_numbers
987 mo_spin(imo + 1:imo + nmo) = ispin - 1
990 IF (mos(ispin)%use_mo_coeff_b)
CALL copy_dbcsr_to_fm(mos(ispin)%mo_coeff_b, mos(ispin)%mo_coeff)
995 IF (save_cartesian)
THEN
996 CALL spherical_to_cartesian_mo(mos_sgf, particle_set, kind_set, mo_coefficient(:, imo + 1:imo + nmo))
1000 mo_coefficient(i, imo + 1:imo + nmo) = mos_sgf(cp2k_to_trexio_ang_mom(i), :)
1005 DEALLOCATE (mos_sgf)
1009 rc = trexio_write_mo_type(f,
'Canonical', len_trim(
'Canonical') + 1)
1010 CALL trexio_error(rc)
1012 rc = trexio_write_mo_num(f, mo_num)
1013 CALL trexio_error(rc)
1015 rc = trexio_write_mo_coefficient(f, mo_coefficient)
1016 CALL trexio_error(rc)
1018 rc = trexio_write_mo_energy(f, mo_energy)
1019 CALL trexio_error(rc)
1021 rc = trexio_write_mo_occupation(f, mo_occupation)
1022 CALL trexio_error(rc)
1024 rc = trexio_write_mo_spin(f, mo_spin)
1025 CALL trexio_error(rc)
1027 IF (do_kpoints)
THEN
1028 rc = trexio_write_mo_coefficient_im(f, mo_coefficient_im)
1029 CALL trexio_error(rc)
1031 rc = trexio_write_mo_k_point(f, mo_kpoint)
1032 CALL trexio_error(rc)
1036 DEALLOCATE (mo_coefficient)
1037 DEALLOCATE (mo_energy)
1038 DEALLOCATE (mo_occupation)
1039 DEALLOCATE (mo_spin)
1040 IF (do_kpoints)
THEN
1041 DEALLOCATE (mo_coefficient_im)
1042 DEALLOCATE (mo_kpoint)
1046 IF (
ALLOCATED(ao_to_atom))
DEALLOCATE (ao_to_atom)
1047 IF (
ALLOCATED(agauge))
DEALLOCATE (agauge)
1058 IF (
PRESENT(energy_derivative))
THEN
1059 filename_de = trim(logger%iter_info%project_name)//
'-TREXIO.dEdP.dat'
1061 ALLOCATE (dedp(nsgf, nsgf))
1064 DO ispin = 1, nspins
1069 row_size=row_size, col_size=col_size, &
1070 row_offset=row_offset, col_offset=col_offset)
1075 dedp(row_offset + i - 1, col_offset + j - 1) = data_block(i, j)
1083 CASE (dbcsr_type_symmetric)
1085 CASE (dbcsr_type_antisymmetric)
1087 CASE (dbcsr_type_no_symmetry)
1089 cpabort(
"Unknown matrix type for energy derivative")
1094 CALL para_env%sum(dedp)
1098 WRITE (output_unit,
"((T2,A,A))")
'TREXIO| Writing derivative file ', trim(filename_de)
1102 file_action=
"WRITE", &
1103 file_status=
"UNKNOWN", &
1104 unit_number=unit_de)
1105 WRITE (unit_de,
'(I0, 1X, I0)') nsgf, nsgf
1107 WRITE (unit_de,
'(*(1X, F15.8))') (dedp(cp2k_to_trexio_ang_mom(i), &
1108 cp2k_to_trexio_ang_mom(j)), j=1, nsgf)
1117 IF (
ALLOCATED(shell_ang_mom))
DEALLOCATE (shell_ang_mom)
1118 IF (
ALLOCATED(cp2k_to_trexio_ang_mom))
DEALLOCATE (cp2k_to_trexio_ang_mom)
1124 rc = trexio_close(f)
1125 CALL trexio_error(rc)
1128 CALL timestop(handle)
1131 mark_used(trexio_section)
1132 mark_used(energy_derivative)
1133 cpwarn(
'TREXIO support has not been enabled in this build.')
1147 SUBROUTINE prepare_trexio_kpoint_grid(qs_env, trexio_section, do_kpoints, kpoints_scf, &
1148 kpoints_out, created)
1151 LOGICAL,
INTENT(IN) :: do_kpoints
1152 TYPE(
kpoint_type),
POINTER :: kpoints_scf, kpoints_out
1153 LOGICAL,
INTENT(OUT) :: created
1156 CHARACTER(LEN=*),
PARAMETER :: routinen =
'prepare_trexio_kpoint_grid'
1158 CHARACTER(LEN=default_string_length) :: kp_scheme, reuse_reason
1159 INTEGER :: aligned_blocks, aligned_max_size, handle, &
1161 INTEGER,
DIMENSION(3) :: nkp_grid
1162 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1163 LOGICAL :: diis_step, full_grid, full_kpoint_grid, &
1164 gamma_centered, reuse_scf_mos, &
1165 reused_scf_mos, symmetry
1166 REAL(kind=
dp) :: aligned_min_svalue, eps_geo, wsum
1167 REAL(kind=
dp),
DIMENSION(3) :: kp_shift
1168 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp_source
1169 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp_source
1173 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_s
1183 CALL timeset(routinen, handle)
1186 kpoints_out => kpoints_scf
1187 NULLIFY (blacs_env, cell, cell_to_index, dft_control, logger, matrix_ks, matrix_s, mos, &
1188 para_env, particle_set, sab_nl, scf_control, scf_env, wkp_source, xkp_source)
1191 IF (.NOT. do_kpoints .OR. .NOT. full_kpoint_grid)
THEN
1192 CALL timestop(handle)
1195 cpassert(
ASSOCIATED(kpoints_scf))
1197 CALL get_kpoint_info(kpoints_scf, kp_scheme=kp_scheme, symmetry=symmetry, &
1198 full_grid=full_grid, nkp_grid=nkp_grid, kp_shift=kp_shift, &
1199 gamma_centered=gamma_centered, eps_geo=eps_geo)
1200 IF (.NOT. symmetry .OR. full_grid)
THEN
1201 CALL timestop(handle)
1205 SELECT CASE (trim(kp_scheme))
1206 CASE (
"MONKHORST-PACK",
"MACDONALD",
"GENERAL")
1209 cpabort(
"TREXIO%FULL_KPOINT_GRID supports only MONKHORST-PACK, MACDONALD, and GENERAL k-points.")
1215 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env, cell=cell, &
1216 particle_set=particle_set, mos=mos, dft_control=dft_control, &
1217 sab_orb=sab_nl, matrix_ks_kp=matrix_ks, matrix_s_kp=matrix_s, &
1218 scf_env=scf_env, scf_control=scf_control)
1219 cpassert(
ASSOCIATED(para_env))
1220 cpassert(
ASSOCIATED(blacs_env))
1221 cpassert(
ASSOCIATED(cell))
1222 cpassert(
ASSOCIATED(particle_set))
1223 cpassert(
ASSOCIATED(mos))
1224 cpassert(
ASSOCIATED(dft_control))
1225 cpassert(
ASSOCIATED(sab_nl))
1226 cpassert(
ASSOCIATED(matrix_ks))
1227 cpassert(
ASSOCIATED(matrix_s))
1228 cpassert(
ASSOCIATED(scf_env))
1229 cpassert(
ASSOCIATED(scf_control))
1231 NULLIFY (kpoints_out)
1233 kpoints_out%kp_scheme = kp_scheme
1234 kpoints_out%symmetry = .false.
1235 kpoints_out%full_grid = .true.
1236 kpoints_out%verbose = .false.
1237 kpoints_out%use_real_wfn = .false.
1238 kpoints_out%eps_geo = eps_geo
1239 kpoints_out%parallel_group_size = para_env%num_pe
1241 SELECT CASE (trim(kp_scheme))
1242 CASE (
"MONKHORST-PACK",
"MACDONALD")
1243 kpoints_out%nkp_grid(1:3) = nkp_grid(1:3)
1244 kpoints_out%kp_shift(1:3) = kp_shift(1:3)
1245 kpoints_out%gamma_centered = gamma_centered
1248 IF (.NOT.
ASSOCIATED(kpoints_scf%xkp_input) .OR. &
1249 .NOT.
ASSOCIATED(kpoints_scf%wkp_input))
THEN
1250 cpabort(
"TREXIO%FULL_KPOINT_GRID cannot recover the unreduced GENERAL k-point set.")
1252 xkp_source => kpoints_scf%xkp_input
1253 wkp_source => kpoints_scf%wkp_input
1254 nfull =
SIZE(wkp_source)
1255 wsum = sum(wkp_source)
1256 IF (wsum <= 0.0_dp) cpabort(
"TREXIO%FULL_KPOINT_GRID found invalid GENERAL k-point weights.")
1257 kpoints_out%nkp = nfull
1258 ALLOCATE (kpoints_out%xkp(3, nfull), kpoints_out%wkp(nfull))
1259 kpoints_out%xkp(1:3, 1:nfull) = xkp_source(1:3, 1:nfull)
1260 kpoints_out%wkp(1:nfull) = wkp_source(1:nfull)/wsum
1268 reused_scf_mos = .false.
1271 aligned_max_size = 0
1272 aligned_min_svalue = 0.0_dp
1274 IF (reuse_scf_mos)
THEN
1275 CALL do_general_diag_kp(matrix_ks, matrix_s, kpoints_scf, scf_env, scf_control, .false., &
1279 cell_to_index, sab_nl, para_env, reused_scf_mos, &
1280 reuse_reason, aligned_blocks, aligned_max_size, &
1283 IF (reused_scf_mos)
THEN
1284 IF (output_unit > 0)
THEN
1285 WRITE (output_unit,
'(T2,A)') &
1286 "TREXIO| Reused SCF MO coefficients for the full k-point grid."
1287 IF (aligned_blocks > 0)
THEN
1288 WRITE (output_unit,
'(T2,A,I0,A,I0,A,ES10.3)') &
1289 "TREXIO| Ritz-stabilized ", aligned_blocks, &
1290 " degenerate SCF MO subspace(s); largest block has ", aligned_max_size, &
1291 " band(s), min metric eigenvalue ", aligned_min_svalue
1295 IF (output_unit > 0)
THEN
1296 IF (reuse_scf_mos)
THEN
1297 WRITE (output_unit,
'(T2,A,A)') &
1298 "TREXIO| Could not reuse SCF MOs: ", trim(reuse_reason)
1300 WRITE (output_unit,
'(T2,A)') &
1301 "TREXIO| Diagonalizing the full k-point grid for export."
1304 CALL do_general_diag_kp(matrix_ks, matrix_s, kpoints_out, scf_env, scf_control, .false., &
1309 CALL timestop(handle)
1312 mark_used(trexio_section)
1313 mark_used(do_kpoints)
1314 mark_used(kpoints_scf)
1315 NULLIFY (kpoints_out)
1319 END SUBROUTINE prepare_trexio_kpoint_grid
1328 SUBROUTINE read_trexio(qs_env, trexio_filename, mo_set_trexio, energy_derivative)
1330 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: trexio_filename
1331 TYPE(
mo_set_type),
INTENT(OUT),
DIMENSION(:),
POINTER,
OPTIONAL :: mo_set_trexio
1332 TYPE(
dbcsr_p_type),
INTENT(OUT),
DIMENSION(:),
POINTER,
OPTIONAL :: energy_derivative
1336 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_trexio'
1338 INTEGER :: handle, output_unit, unit_de
1339 CHARACTER(len=default_path_length) :: filename, filename_de
1340 INTEGER(trexio_t) :: f
1341 INTEGER(trexio_exit_code) :: rc
1345 CHARACTER(LEN=2) :: element_symbol
1346 CHARACTER(LEN=2),
DIMENSION(:),
ALLOCATABLE :: label
1348 INTEGER :: ao_num, mo_num, nmo, nspins, ispin, nsgf, &
1349 save_cartesian, i, j, k, l, m, imo, ishell, &
1350 nshell, shell_num, nucleus_num, natoms, ikind, &
1351 iatom, nelectron, nrows, ncols, &
1352 row, col, row_size, col_size, &
1353 row_offset, col_offset, myprint
1354 INTEGER,
DIMENSION(2) :: nmo_spin, electron_num
1355 INTEGER,
DIMENSION(:),
ALLOCATABLE :: mo_spin, shell_ang_mom, trexio_to_cp2k_ang_mom
1357 REAL(kind=
dp) :: zeff, maxocc
1358 REAL(kind=
dp),
DIMENSION(:),
ALLOCATABLE :: mo_energy, mo_occupation, charge
1359 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: mo_coefficient, mos_sgf, coord, dedp, temp
1360 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
1363 TYPE(
cp_fm_type),
POINTER :: mo_coeff_ref, mo_coeff_target
1372 CALL timeset(routinen, handle)
1374 NULLIFY (logger, mo_coeff_ref, mo_coeff_target, para_env, dft_control, matrix_s, kind_set, mos, particle_set)
1378 myprint = logger%iter_info%print_level
1380 cpassert(
ASSOCIATED(qs_env))
1383 IF (.NOT.
PRESENT(trexio_filename))
THEN
1384 filename = trim(logger%iter_info%project_name)//
'-TREXIO.h5'
1385 filename_de = trim(logger%iter_info%project_name)//
'-TREXIO.dEdP.dat'
1387 filename = trim(trexio_filename)//
'.h5'
1388 filename_de = trim(trexio_filename)//
'.dEdP.dat'
1392 ionode = para_env%is_source()
1396 WRITE (output_unit,
"((T2,A,A))")
'TREXIO| Opening file named ', trim(filename)
1397 f = trexio_open(filename,
'r', trexio_hdf5, rc)
1398 CALL trexio_error(rc)
1401 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading molecule information...'
1403 rc = trexio_read_nucleus_num(f, nucleus_num)
1404 CALL trexio_error(rc)
1407 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading nuclear coordinates...'
1409 ALLOCATE (coord(3, nucleus_num))
1410 rc = trexio_read_nucleus_coord(f, coord)
1411 CALL trexio_error(rc)
1414 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading nuclear labels...'
1416 ALLOCATE (label(nucleus_num))
1417 rc = trexio_read_nucleus_label(f, label, 3)
1418 CALL trexio_error(rc)
1421 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading nuclear charges...'
1423 ALLOCATE (charge(nucleus_num))
1424 rc = trexio_read_nucleus_charge(f, charge)
1425 CALL trexio_error(rc)
1428 CALL get_qs_env(qs_env, particle_set=particle_set, qs_kind_set=kind_set, natom=natoms)
1431 cpassert(nucleus_num == natoms)
1433 DO iatom = 1, natoms
1436 cpassert(abs(coord(i, iatom) - particle_set(iatom)%r(i)) < 1.0e-6_dp)
1440 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, element_symbol=element_symbol, kind_number=ikind)
1442 cpassert(trim(element_symbol) == trim(label(iatom)))
1447 cpassert(charge(iatom) == zeff)
1450 WRITE (output_unit,
"((T2,A))")
'TREXIO| Molecule is the same as in qs_env'
1457 rc = trexio_read_ao_cartesian(f, save_cartesian)
1458 CALL trexio_error(rc)
1460 rc = trexio_read_ao_num(f, ao_num)
1461 CALL trexio_error(rc)
1463 rc = trexio_read_basis_shell_num(f, shell_num)
1464 CALL trexio_error(rc)
1467 CALL para_env%bcast(save_cartesian, para_env%source)
1468 CALL para_env%bcast(ao_num, para_env%source)
1469 CALL para_env%bcast(shell_num, para_env%source)
1471 IF (save_cartesian == 1)
THEN
1472 cpabort(
'Reading Cartesian AOs is not yet supported.')
1476 CALL get_qs_env(qs_env, qs_kind_set=kind_set)
1478 cpassert(ao_num == nsgf)
1479 cpassert(shell_num == nshell)
1481 ALLOCATE (shell_ang_mom(shell_num))
1482 shell_ang_mom(:) = 0
1486 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading shell angular momenta...'
1488 rc = trexio_read_basis_shell_ang_mom(f, shell_ang_mom)
1489 CALL trexio_error(rc)
1492 CALL para_env%bcast(shell_ang_mom, para_env%source)
1497 ALLOCATE (trexio_to_cp2k_ang_mom(nsgf))
1499 DO ishell = 1, shell_num
1500 l = shell_ang_mom(ishell)
1502 m = (-1)**k*floor(real(k, kind=
dp)/2.0_dp)
1503 trexio_to_cp2k_ang_mom(i + l + 1 + m) = i + k
1510 IF (
PRESENT(mo_set_trexio))
THEN
1511 IF (output_unit > 1)
THEN
1512 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading molecular orbitals...'
1518 rc = trexio_read_mo_num(f, mo_num)
1519 CALL trexio_error(rc)
1521 rc = trexio_read_electron_up_num(f, electron_num(1))
1522 CALL trexio_error(rc)
1524 rc = trexio_read_electron_dn_num(f, electron_num(2))
1525 CALL trexio_error(rc)
1529 CALL para_env%bcast(mo_num, para_env%source)
1530 CALL para_env%bcast(electron_num, para_env%source)
1533 CALL get_qs_env(qs_env, mos=mos, dft_control=dft_control)
1534 nspins = dft_control%nspins
1536 DO ispin = 1, nspins
1538 nmo_spin(ispin) = nmo
1540 cpassert(mo_num == sum(nmo_spin))
1542 ALLOCATE (mo_coefficient(ao_num, mo_num))
1543 ALLOCATE (mo_energy(mo_num))
1544 ALLOCATE (mo_occupation(mo_num))
1545 ALLOCATE (mo_spin(mo_num))
1547 mo_coefficient(:, :) = 0.0_dp
1548 mo_energy(:) = 0.0_dp
1549 mo_occupation(:) = 0.0_dp
1555 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading MO coefficients...'
1557 rc = trexio_read_mo_coefficient(f, mo_coefficient)
1558 CALL trexio_error(rc)
1561 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading MO energies...'
1563 rc = trexio_read_mo_energy(f, mo_energy)
1564 CALL trexio_error(rc)
1567 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading MO occupations...'
1569 rc = trexio_read_mo_occupation(f, mo_occupation)
1570 CALL trexio_error(rc)
1573 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading MO spins...'
1575 rc = trexio_read_mo_spin(f, mo_spin)
1576 CALL trexio_error(rc)
1580 CALL para_env%bcast(mo_coefficient, para_env%source)
1581 CALL para_env%bcast(mo_energy, para_env%source)
1582 CALL para_env%bcast(mo_occupation, para_env%source)
1583 CALL para_env%bcast(mo_spin, para_env%source)
1587 DO ispin = 1, nspins
1589 imo = (ispin - 1)*nmo_spin(1)
1591 nmo = nmo_spin(ispin)
1593 ALLOCATE (mos_sgf(nsgf, nmo))
1594 mos_sgf(:, :) = 0.0_dp
1598 mos_sgf(i, :) = mo_coefficient(trexio_to_cp2k_ang_mom(i), imo + 1:imo + nmo)
1601 IF (nspins == 1)
THEN
1603 nelectron = electron_num(1) + electron_num(2)
1606 nelectron = electron_num(ispin)
1609 CALL allocate_mo_set(mo_set_trexio(ispin), nsgf, nmo, nelectron, 0.0_dp, maxocc, 0.0_dp)
1611 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff_ref)
1612 CALL init_mo_set(mo_set_trexio(ispin), fm_ref=mo_coeff_ref, name=
"TREXIO MOs")
1614 CALL get_mo_set(mo_set_trexio(ispin), mo_coeff=mo_coeff_target)
1617 cpassert(mo_spin(j) == ispin - 1)
1618 mo_set_trexio(ispin)%eigenvalues(j) = mo_energy(imo + j)
1619 mo_set_trexio(ispin)%occupation_numbers(j) = mo_occupation(imo + j)
1625 DEALLOCATE (mos_sgf)
1628 DEALLOCATE (mo_coefficient)
1629 DEALLOCATE (mo_energy)
1630 DEALLOCATE (mo_occupation)
1631 DEALLOCATE (mo_spin)
1636 IF (
PRESENT(energy_derivative))
THEN
1637 IF (output_unit > 1)
THEN
1638 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading energy derivatives...'
1645 ALLOCATE (temp(nsgf, nsgf))
1651 CALL open_file(file_name=filename_de, file_status=
"OLD", unit_number=unit_de)
1653 cpabort(
"Energy derivatives file "//trim(filename_de)//
" not found")
1658 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading header information...'
1660 READ (unit_de, *) nrows, ncols
1662 WRITE (output_unit,
"((T2,A))")
'TREXIO| Check size of dEdP matrix...'
1664 cpassert(nrows == nsgf)
1665 cpassert(ncols == nsgf)
1669 WRITE (output_unit,
"((T2,A))")
'TREXIO| Reading dEdP matrix...'
1673 READ (unit_de, *) (temp(i, j), j=1, ncols)
1680 CALL para_env%bcast(temp, para_env%source)
1683 ALLOCATE (dedp(nsgf, nsgf))
1690 dedp(i, j) = temp(trexio_to_cp2k_ang_mom(i), trexio_to_cp2k_ang_mom(j))
1699 DO ispin = 1, nspins
1700 ALLOCATE (energy_derivative(ispin)%matrix)
1703 CALL dbcsr_copy(energy_derivative(ispin)%matrix, matrix_s(1)%matrix, &
1704 name=
'Energy Derivative', keep_sparsity=.false.)
1705 CALL dbcsr_set(energy_derivative(ispin)%matrix, 0.0_dp)
1710 row_size=row_size, col_size=col_size, &
1711 row_offset=row_offset, col_offset=col_offset)
1716 data_block(i, j) = dedp(row_offset + i - 1, col_offset + j - 1)
1727 IF (
ALLOCATED(shell_ang_mom))
DEALLOCATE (shell_ang_mom)
1728 IF (
ALLOCATED(trexio_to_cp2k_ang_mom))
DEALLOCATE (trexio_to_cp2k_ang_mom)
1732 WRITE (output_unit,
"((T2,A,A))")
'TREXIO| Closing file named ', trim(filename)
1733 rc = trexio_close(f)
1734 CALL trexio_error(rc)
1737 CALL timestop(handle)
1741 mark_used(trexio_filename)
1742 mark_used(mo_set_trexio)
1743 mark_used(energy_derivative)
1744 cpwarn(
'TREXIO support has not been enabled in this build.')
1745 cpabort(
'TREXIO Not Available')
1755 SUBROUTINE trexio_error(rc)
1756 INTEGER(trexio_exit_code),
INTENT(IN) :: rc
1758 CHARACTER(LEN=128) :: err_msg
1760 IF (rc /= trexio_success)
THEN
1761 CALL trexio_string_of_error(rc, err_msg)
1762 cpabort(
'TREXIO Error: '//trim(err_msg))
1765 END SUBROUTINE trexio_error
1773 SUBROUTINE nuclear_repulsion_energy(particle_set, kind_set, e_nn)
1775 POINTER :: particle_set
1778 REAL(kind=
dp),
INTENT(OUT) :: e_nn
1780 INTEGER :: i, ikind, j, jkind, natoms
1781 REAL(kind=
dp) :: r_ij, zeff_i, zeff_j
1783 natoms =
SIZE(particle_set)
1788 DO j = i + 1, natoms
1789 r_ij = norm2(particle_set(i)%r - particle_set(j)%r)
1794 e_nn = e_nn + zeff_i*zeff_j/r_ij
1798 END SUBROUTINE nuclear_repulsion_energy
1806 FUNCTION sgf_norm(l, expnt)
RESULT(norm)
1807 INTEGER,
INTENT(IN) :: l
1808 REAL(kind=
dp),
INTENT(IN) :: expnt
1809 REAL(kind=
dp) :: norm
1812 norm = sqrt(2**(2*l + 3)*
fac(l + 1)*(2*expnt)**(l + 1.5)/(
fac(2*l + 2)*sqrt(
pi)))
1814 cpabort(
"The angular momentum should be >= 0!")
1817 END FUNCTION sgf_norm
1826 SUBROUTINE spherical_to_cartesian_mo(mos_sgf, particle_set, qs_kind_set, mos_cgf)
1827 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: mos_sgf
1829 POINTER :: particle_set
1831 POINTER :: qs_kind_set
1832 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: mos_cgf
1834 INTEGER :: iatom, icgf, ikind, iset, isgf, ishell, &
1835 lshell, ncgf, nmo, nset, nsgf
1836 INTEGER,
DIMENSION(:),
POINTER :: nshell
1837 INTEGER,
DIMENSION(:, :),
POINTER :: l
1842 mos_cgf(:, :) = 0.0_dp
1843 nmo =
SIZE(mos_sgf, 2)
1848 DO iatom = 1,
SIZE(particle_set)
1849 NULLIFY (orb_basis_set)
1850 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1851 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
1853 IF (
ASSOCIATED(orb_basis_set))
THEN
1859 DO ishell = 1, nshell(iset)
1860 lshell = l(ishell, iset)
1861 CALL dgemm(
"T",
"N",
nco(lshell), nmo,
nso(lshell), 1.0_dp, &
1863 mos_sgf(isgf, 1), nsgf, 0.0_dp, &
1864 mos_cgf(icgf, 1), ncgf)
1865 icgf = icgf +
nco(lshell)
1866 isgf = isgf +
nso(lshell)
1871 cpabort(
"Unknown basis set type")
1875 END SUBROUTINE spherical_to_cartesian_mo
1884 SUBROUTINE cartesian_to_spherical_mo(mos_cgf, particle_set, qs_kind_set, mos_sgf)
1885 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: mos_cgf
1887 POINTER :: particle_set
1889 POINTER :: qs_kind_set
1890 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: mos_sgf
1892 INTEGER :: iatom, icgf, ikind, iset, isgf, ishell, &
1893 lshell, ncgf, nmo, nset, nsgf
1894 INTEGER,
DIMENSION(:),
POINTER :: nshell
1895 INTEGER,
DIMENSION(:, :),
POINTER :: l
1900 mos_sgf(:, :) = 0.0_dp
1901 nmo =
SIZE(mos_cgf, 2)
1906 DO iatom = 1,
SIZE(particle_set)
1907 NULLIFY (orb_basis_set)
1908 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1909 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
1911 IF (
ASSOCIATED(orb_basis_set))
THEN
1917 DO ishell = 1, nshell(iset)
1918 lshell = l(ishell, iset)
1919 CALL dgemm(
"N",
"N",
nso(lshell), nmo,
nco(lshell), 1.0_dp, &
1921 mos_cgf(icgf, 1), ncgf, 0.0_dp, &
1922 mos_sgf(isgf, 1), nsgf)
1923 icgf = icgf +
nco(lshell)
1924 isgf = isgf +
nso(lshell)
1929 cpabort(
"Unknown basis set type")
1933 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.
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_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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_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, 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, 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, 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, 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.