(git:34ef472)
optbas_fenv_manipulation.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
8  USE atomic_kind_types, ONLY: atomic_kind_type,&
11  USE basis_set_types, ONLY: gto_basis_set_type,&
13  USE cp_blacs_env, ONLY: cp_blacs_env_type
14  USE cp_control_types, ONLY: dft_control_type
19  USE cp_fm_pool_types, ONLY: cp_fm_pool_p_type
22  cp_fm_struct_type
23  USE cp_fm_types, ONLY: cp_fm_create,&
24  cp_fm_release,&
25  cp_fm_type
26  USE cp_log_handling, ONLY: cp_to_string
28  USE dbcsr_api, ONLY: dbcsr_get_info,&
29  dbcsr_p_type,&
30  dbcsr_type
33  section_vals_type,&
36  USE kinds, ONLY: default_string_length
37  USE message_passing, ONLY: mp_para_env_type
38  USE optimize_basis_types, ONLY: basis_optimization_type,&
39  flex_basis_type
40  USE particle_types, ONLY: particle_type
41  USE qs_density_matrices, ONLY: calculate_density_matrix
43  USE qs_environment_types, ONLY: get_qs_env,&
44  qs_environment_type
46  USE qs_kind_types, ONLY: qs_kind_type
48  USE qs_ks_types, ONLY: qs_ks_did_change
49  USE qs_matrix_pools, ONLY: mpools_get
51  USE qs_mo_types, ONLY: init_mo_set,&
52  mo_set_type
54  USE qs_rho_types, ONLY: qs_rho_get,&
55  qs_rho_type
56  USE string_utilities, ONLY: uppercase
57 #include "./base/base_uses.f90"
58 
59  IMPLICIT NONE
60  PRIVATE
61 
62  PUBLIC :: modify_input_settings, &
67 
68  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'optbas_fenv_manipulation'
69 
70 CONTAINS
71 
72 ! **************************************************************************************************
73 !> \brief change settings in the training input files to initialize
74 !> all needed structures and adjust settings to basis optimization
75 !> \param basis_optimization ...
76 !> \param bas_id ...
77 !> \param input_file ...
78 !> \author Florian Schiffmann
79 ! **************************************************************************************************
80  SUBROUTINE modify_input_settings(basis_optimization, bas_id, input_file)
81  TYPE(basis_optimization_type) :: basis_optimization
82  INTEGER :: bas_id
83  TYPE(section_vals_type), POINTER :: input_file
84 
85  CHARACTER(LEN=default_string_length) :: atom
86  CHARACTER(LEN=default_string_length), &
87  DIMENSION(:), POINTER :: abasinfo, obasinfo
88  INTEGER :: ibasis, ikind, jkind, nbasis, nkind
89  TYPE(section_vals_type), POINTER :: dft_section, feval_section, &
90  kind_section, subsys_section
91 
92  feval_section => section_vals_get_subs_vals(input_file, "FORCE_EVAL")
93  dft_section => section_vals_get_subs_vals(feval_section, "DFT")
94  subsys_section => section_vals_get_subs_vals(feval_section, "SUBSYS")
95  kind_section => section_vals_get_subs_vals(subsys_section, "KIND")
96 
97  CALL section_vals_val_set(feval_section, "PRINT%DISTRIBUTION%_SECTION_PARAMETERS_", &
98  i_val=debug_print_level)
99  CALL section_vals_val_set(dft_section, "SCF%PRINT%TOTAL_DENSITIES%_SECTION_PARAMETERS_", &
100  i_val=debug_print_level)
101  CALL section_vals_val_set(dft_section, "SCF%PRINT%DETAILED_ENERGY%_SECTION_PARAMETERS_", &
102  i_val=debug_print_level)
103 
104  ! add the new basis file containing the templates to the basis file list
105  CALL section_vals_val_get(dft_section, "BASIS_SET_FILE_NAME", n_rep_val=nbasis)
106  CALL section_vals_val_set(dft_section, "BASIS_SET_FILE_NAME", i_rep_val=nbasis + 1, &
107  c_val=basis_optimization%work_basis_file)
108 
109  ! Set the auxilarry basis in the kind sections
110  CALL section_vals_get(kind_section, n_repetition=nkind)
111  DO ikind = 1, nkind
112  CALL section_vals_val_get(kind_section, "_SECTION_PARAMETERS_", &
113  c_val=atom, i_rep_section=ikind)
114  CALL uppercase(atom)
115  CALL section_vals_val_get(kind_section, "BASIS_SET", n_rep_val=nbasis, i_rep_section=ikind)
116  IF (nbasis > 1) THEN
117  CALL cp_abort(__location__, &
118  "Basis set optimization: Only one single BASIS_SET allowed per KIND in the reference input")
119  END IF
120  CALL section_vals_val_get(kind_section, "BASIS_SET", &
121  c_vals=obasinfo, i_rep_val=1, i_rep_section=ikind)
122  ALLOCATE (abasinfo(2))
123  abasinfo(1) = "AUX_OPT"
124  IF (SIZE(obasinfo) == 1) THEN
125  abasinfo(2) = obasinfo(1)
126  ELSE
127  abasinfo(2) = obasinfo(2)
128  END IF
129  CALL section_vals_val_set(kind_section, "BASIS_SET", &
130  c_vals_ptr=abasinfo, i_rep_val=2, i_rep_section=ikind)
131  CALL section_vals_val_get(kind_section, "BASIS_SET", n_rep_val=nbasis, i_rep_section=ikind)
132  cpassert(nbasis == 2)
133 
134  DO jkind = 1, basis_optimization%nkind
135  IF (atom == basis_optimization%kind_basis(jkind)%element) THEN
136 
137  NULLIFY (abasinfo)
138  CALL section_vals_val_get(kind_section, "BASIS_SET", &
139  c_vals=abasinfo, i_rep_val=2, i_rep_section=ikind)
140  ibasis = basis_optimization%combination(bas_id, jkind)
141  cpassert(SIZE(abasinfo) == 2)
142  cpassert(abasinfo(1) == "AUX_OPT")
143  abasinfo(2) = trim(adjustl(basis_optimization%kind_basis(jkind)%flex_basis(ibasis)%basis_name))
144  EXIT
145  END IF
146  END DO
147  END DO
148 
149  END SUBROUTINE modify_input_settings
150 
151 ! **************************************************************************************************
152 !> \brief ...
153 !> \param qs_env ...
154 ! **************************************************************************************************
155  SUBROUTINE allocate_mo_sets(qs_env)
156  TYPE(qs_environment_type), POINTER :: qs_env
157 
158  INTEGER :: ispin
159  INTEGER, DIMENSION(2) :: nelectron_spin
160  LOGICAL :: natom_mismatch
161  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
162  TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_mo_fm_pools
163  TYPE(dft_control_type), POINTER :: dft_control
164  TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
165  TYPE(mp_para_env_type), POINTER :: para_env
166  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
167  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
168  TYPE(section_vals_type), POINTER :: dft_section
169 
170  NULLIFY (para_env)
171  CALL get_qs_env(qs_env=qs_env, &
172  dft_control=dft_control, &
173  mos=mos, nelectron_spin=nelectron_spin, &
174  atomic_kind_set=atomic_kind_set, &
175  qs_kind_set=qs_kind_set, &
176  particle_set=particle_set, &
177  para_env=para_env)
178  dft_section => section_vals_get_subs_vals(qs_env%input, "DFT")
179 
180  CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
181  DO ispin = 1, dft_control%nspins
182  IF (.NOT. ASSOCIATED(mos(ispin)%mo_coeff)) THEN
183  CALL init_mo_set(mos(ispin), &
184  fm_pool=ao_mo_fm_pools(ispin)%pool, &
185  name="qs_env%mo"//trim(adjustl(cp_to_string(ispin))))
186  END IF
187  END DO
188 
189  CALL read_mo_set_from_restart(mos, atomic_kind_set, qs_kind_set, particle_set, para_env, &
190  id_nr=0, multiplicity=dft_control%multiplicity, dft_section=dft_section, &
191  natom_mismatch=natom_mismatch)
192 
193  END SUBROUTINE allocate_mo_sets
194 
195 ! **************************************************************************************************
196 !> \brief ...
197 !> \param qs_env ...
198 ! **************************************************************************************************
199  SUBROUTINE calculate_ks_matrix(qs_env)
200  TYPE(qs_environment_type), POINTER :: qs_env
201 
202  INTEGER :: ispin
203  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
204  TYPE(dft_control_type), POINTER :: dft_control
205  TYPE(qs_rho_type), POINTER :: rho
206 
207  NULLIFY (rho, dft_control, rho_ao)
208 
209  CALL qs_energies_init(qs_env, .false.)
210  CALL get_qs_env(qs_env, rho=rho, dft_control=dft_control)
211  CALL qs_rho_get(rho, rho_ao=rho_ao)
212  DO ispin = 1, dft_control%nspins
213  CALL calculate_density_matrix(qs_env%mos(ispin), rho_ao(ispin)%matrix)
214  END DO
215  CALL qs_rho_update_rho(rho, qs_env)
216  CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
217  qs_env%requires_mo_derivs = .false.
218  CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false.)
219 
220  END SUBROUTINE calculate_ks_matrix
221 
222 ! **************************************************************************************************
223 !> \brief ...
224 !> \param matrix_s ...
225 !> \param matrix_s_inv ...
226 !> \param para_env ...
227 !> \param context ...
228 ! **************************************************************************************************
229  SUBROUTINE calculate_overlap_inverse(matrix_s, matrix_s_inv, para_env, context)
230  TYPE(dbcsr_type), POINTER :: matrix_s
231  TYPE(cp_fm_type), INTENT(OUT) :: matrix_s_inv
232  TYPE(mp_para_env_type), POINTER :: para_env
233  TYPE(cp_blacs_env_type), POINTER :: context
234 
235  INTEGER :: nao
236  TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
237  TYPE(cp_fm_type) :: work1
238 
239  CALL dbcsr_get_info(matrix_s, nfullrows_total=nao)
240  CALL cp_fm_struct_create(fm_struct_tmp, nrow_global=nao, ncol_global=nao, &
241  para_env=para_env, context=context)
242 
243  CALL cp_fm_create(matrix_s_inv, matrix_struct=fm_struct_tmp)
244  CALL cp_fm_create(work1, matrix_struct=fm_struct_tmp)
245  CALL copy_dbcsr_to_fm(matrix_s, matrix_s_inv)
246  CALL cp_fm_upper_to_full(matrix_s_inv, work1)
247  CALL cp_fm_cholesky_decompose(matrix_s_inv)
248  CALL cp_fm_cholesky_invert(matrix_s_inv)
249  CALL cp_fm_upper_to_full(matrix_s_inv, work1)
250  CALL cp_fm_struct_release(fm_struct_tmp)
251  CALL cp_fm_release(work1)
252 
253  END SUBROUTINE calculate_overlap_inverse
254 
255 ! **************************************************************************************************
256 !> \brief ...
257 !> \param opt_bas ...
258 !> \param bas_id ...
259 !> \param basis_type ...
260 !> \param qs_env ...
261 ! **************************************************************************************************
262  SUBROUTINE update_basis_set(opt_bas, bas_id, basis_type, qs_env)
263  TYPE(basis_optimization_type) :: opt_bas
264  INTEGER :: bas_id
265  CHARACTER(*) :: basis_type
266  TYPE(qs_environment_type), POINTER :: qs_env
267 
268  CHARACTER(default_string_length) :: elem
269  INTEGER :: ibasis, ikind, jkind
270  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
271  TYPE(dft_control_type), POINTER :: dft_control
272  TYPE(gto_basis_set_type), POINTER :: gto_basis
273  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
274 
275  CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, &
276  atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
277  DO ikind = 1, SIZE(qs_kind_set)
278  DO jkind = 1, opt_bas%nkind
279  CALL get_atomic_kind(atomic_kind_set(ikind), name=elem)
280  CALL uppercase(elem)
281  IF (elem == opt_bas%kind_basis(jkind)%element) THEN
282  ibasis = opt_bas%combination(bas_id, jkind)
283  CALL get_basis_from_container(qs_kind_set(ikind)%basis_sets, basis_set=gto_basis, &
284  basis_type=basis_type)
285  CALL transfer_data_to_gto(gto_basis, opt_bas%kind_basis(jkind)%flex_basis(ibasis))
286  CALL init_orb_basis_set(gto_basis)
287  END IF
288  END DO
289  END DO
290 
291  CALL init_interaction_radii(dft_control%qs_control, qs_kind_set)
292 
293  END SUBROUTINE update_basis_set
294 
295 ! **************************************************************************************************
296 !> \brief ...
297 !> \param gto_basis ...
298 !> \param basis ...
299 ! **************************************************************************************************
300  SUBROUTINE transfer_data_to_gto(gto_basis, basis)
301  TYPE(gto_basis_set_type), POINTER :: gto_basis
302  TYPE(flex_basis_type) :: basis
303 
304  INTEGER :: ipgf, iset, ishell
305 
306  DO iset = 1, basis%nsets
307  DO ishell = 1, basis%subset(iset)%ncon_tot
308  DO ipgf = 1, basis%subset(iset)%nexp
309  gto_basis%gcc(ipgf, ishell, iset) = basis%subset(iset)%coeff(ipgf, ishell)
310  END DO
311  END DO
312  DO ipgf = 1, basis%subset(iset)%nexp
313  gto_basis%zet(ipgf, iset) = basis%subset(iset)%exps(ipgf)
314  END DO
315  END DO
316 
317  END SUBROUTINE transfer_data_to_gto
318 
319 END MODULE optbas_fenv_manipulation
void update_basis_set(const int nkinds, const grid_basis_set **const basis_sets, grid_context *data)
Definition: atom.F:9
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_basis_from_container(container, basis_set, inumbas, basis_type)
Retrieve a basis set from the container.
subroutine, public init_orb_basis_set(gto_basis_set)
Initialise a Gaussian-type orbital (GTO) basis set data set.
methods related to the blacs parallel environment
Definition: cp_blacs_env.F:15
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
basic linear algebra operations for full matrices
subroutine, public cp_fm_upper_to_full(matrix, work)
given an upper triangular matrix computes the corresponding full matrix
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_invert(matrix, n, info_out)
used to replace the cholesky decomposition by the inverse
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
pool for for elements that are retained and released
represent the structure of a full matrix
Definition: cp_fm_struct.F:14
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
Definition: cp_fm_struct.F:125
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
Definition: cp_fm_struct.F:320
represent a full matrix distributed on many processors
Definition: cp_fm_types.F:15
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Definition: cp_fm_types.F:167
various routines to log and control the output. The idea is that decisions about where to log should ...
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer, parameter, public debug_print_level
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_val_set(section_vals, keyword_name, i_rep_section, i_rep_val, val, l_val, i_val, r_val, c_val, l_vals_ptr, i_vals_ptr, r_vals_ptr, c_vals_ptr)
sets the requested value
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public default_string_length
Definition: kinds.F:57
Interface to the message passing library MPI.
subroutine, public modify_input_settings(basis_optimization, bas_id, input_file)
change settings in the training input files to initialize all needed structures and adjust settings t...
subroutine, public calculate_ks_matrix(qs_env)
...
subroutine, public calculate_overlap_inverse(matrix_s, matrix_s_inv, para_env, context)
...
subroutine, public allocate_mo_sets(qs_env)
...
Define the data structure for the particle information.
collects routines that calculate density matrices
Utility subroutine for qs energy calculation.
subroutine, public qs_energies_init(qs_env, calc_forces)
Refactoring of qs_energies_scf. Driver routine for the initial setup and calculations for a qs energy...
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, 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_nonbond, sab_almo, sab_kp, sab_kp_nosym, 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, 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, ecoul_1c, rho0_s_rs, rho0_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, 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, rhs)
Get the QUICKSTEP environment.
Calculate the interaction radii for the operator matrix calculation.
subroutine, public init_interaction_radii(qs_control, qs_kind_set)
Initialize all the atomic kind radii for a given threshold value.
Define the quickstep kind type and their sub types.
Definition: qs_kind_types.F:23
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
Definition: qs_ks_methods.F:22
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
Definition: qs_ks_types.F:919
wrapper for the pools of matrixes
subroutine, public mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
returns various attributes of the mpools (notably the pools contained in it)
Definition and initialisation of the mo data type.
Definition: qs_mo_io.F:21
subroutine, public read_mo_set_from_restart(mo_array, atomic_kind_set, qs_kind_set, particle_set, para_env, id_nr, multiplicity, dft_section, natom_mismatch, cdft, out_unit)
...
Definition: qs_mo_io.F:495
Definition and initialisation of the mo data type.
Definition: qs_mo_types.F:22
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
Definition: qs_mo_types.F:245
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
Definition: qs_rho_types.F:18
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Definition: qs_rho_types.F:229
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.