(git:15c1bfc)
Loading...
Searching...
No Matches
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-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
15 USE cp_dbcsr_api, ONLY: dbcsr_get_info,&
26 USE cp_fm_types, ONLY: cp_fm_create,&
51 USE qs_mo_types, ONLY: init_mo_set,&
54 USE qs_rho_types, ONLY: qs_rho_get,&
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
70CONTAINS
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_", &
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, qs_kind_set, particle_set, para_env, id_nr=0, &
190 multiplicity=dft_control%multiplicity, &
191 dft_section=dft_section, &
192 natom_mismatch=natom_mismatch)
193
194 END SUBROUTINE allocate_mo_sets
195
196! **************************************************************************************************
197!> \brief ...
198!> \param qs_env ...
199! **************************************************************************************************
200 SUBROUTINE calculate_ks_matrix(qs_env)
201 TYPE(qs_environment_type), POINTER :: qs_env
202
203 INTEGER :: ispin
204 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
205 TYPE(dft_control_type), POINTER :: dft_control
206 TYPE(qs_rho_type), POINTER :: rho
207
208 NULLIFY (rho, dft_control, rho_ao)
209
210 CALL qs_energies_init(qs_env, .false.)
211 CALL get_qs_env(qs_env, rho=rho, dft_control=dft_control)
212 CALL qs_rho_get(rho, rho_ao=rho_ao)
213 DO ispin = 1, dft_control%nspins
214 CALL calculate_density_matrix(qs_env%mos(ispin), rho_ao(ispin)%matrix)
215 END DO
216 CALL qs_rho_update_rho(rho, qs_env)
217 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
218 qs_env%requires_mo_derivs = .false.
219 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false.)
220
221 END SUBROUTINE calculate_ks_matrix
222
223! **************************************************************************************************
224!> \brief ...
225!> \param matrix_s ...
226!> \param matrix_s_inv ...
227!> \param para_env ...
228!> \param context ...
229! **************************************************************************************************
230 SUBROUTINE calculate_overlap_inverse(matrix_s, matrix_s_inv, para_env, context)
231 TYPE(dbcsr_type), POINTER :: matrix_s
232 TYPE(cp_fm_type), INTENT(OUT) :: matrix_s_inv
233 TYPE(mp_para_env_type), POINTER :: para_env
234 TYPE(cp_blacs_env_type), POINTER :: context
235
236 INTEGER :: nao
237 TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
238 TYPE(cp_fm_type) :: work1
239
240 CALL dbcsr_get_info(matrix_s, nfullrows_total=nao)
241 CALL cp_fm_struct_create(fm_struct_tmp, nrow_global=nao, ncol_global=nao, &
242 para_env=para_env, context=context)
243
244 CALL cp_fm_create(matrix_s_inv, matrix_struct=fm_struct_tmp)
245 CALL cp_fm_create(work1, matrix_struct=fm_struct_tmp)
246 CALL copy_dbcsr_to_fm(matrix_s, matrix_s_inv)
247 CALL cp_fm_uplo_to_full(matrix_s_inv, work1)
248 CALL cp_fm_cholesky_decompose(matrix_s_inv)
249 CALL cp_fm_cholesky_invert(matrix_s_inv)
250 CALL cp_fm_uplo_to_full(matrix_s_inv, work1)
251 CALL cp_fm_struct_release(fm_struct_tmp)
252 CALL cp_fm_release(work1)
253
254 END SUBROUTINE calculate_overlap_inverse
255
256! **************************************************************************************************
257!> \brief ...
258!> \param opt_bas ...
259!> \param bas_id ...
260!> \param basis_type ...
261!> \param qs_env ...
262! **************************************************************************************************
263 SUBROUTINE update_basis_set(opt_bas, bas_id, basis_type, qs_env)
264 TYPE(basis_optimization_type) :: opt_bas
265 INTEGER :: bas_id
266 CHARACTER(*) :: basis_type
267 TYPE(qs_environment_type), POINTER :: qs_env
268
269 CHARACTER(default_string_length) :: elem
270 INTEGER :: ibasis, ikind, jkind
271 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
272 TYPE(dft_control_type), POINTER :: dft_control
273 TYPE(gto_basis_set_type), POINTER :: gto_basis
274 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
275
276 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, &
277 atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
278 DO ikind = 1, SIZE(qs_kind_set)
279 DO jkind = 1, opt_bas%nkind
280 CALL get_atomic_kind(atomic_kind_set(ikind), name=elem)
281 CALL uppercase(elem)
282 IF (elem == opt_bas%kind_basis(jkind)%element) THEN
283 ibasis = opt_bas%combination(bas_id, jkind)
284 CALL get_basis_from_container(qs_kind_set(ikind)%basis_sets, basis_set=gto_basis, &
285 basis_type=basis_type)
286 CALL transfer_data_to_gto(gto_basis, opt_bas%kind_basis(jkind)%flex_basis(ibasis))
287 CALL init_orb_basis_set(gto_basis)
288 END IF
289 END DO
290 END DO
291
292 CALL init_interaction_radii(dft_control%qs_control, qs_kind_set)
293
294 END SUBROUTINE update_basis_set
295
296! **************************************************************************************************
297!> \brief ...
298!> \param gto_basis ...
299!> \param basis ...
300! **************************************************************************************************
301 SUBROUTINE transfer_data_to_gto(gto_basis, basis)
302 TYPE(gto_basis_set_type), POINTER :: gto_basis
303 TYPE(flex_basis_type) :: basis
304
305 INTEGER :: ipgf, iset, ishell
306
307 DO iset = 1, basis%nsets
308 DO ishell = 1, basis%subset(iset)%ncon_tot
309 DO ipgf = 1, basis%subset(iset)%nexp
310 gto_basis%gcc(ipgf, ishell, iset) = basis%subset(iset)%coeff(ipgf, ishell)
311 END DO
312 END DO
313 DO ipgf = 1, basis%subset(iset)%nexp
314 gto_basis%zet(ipgf, iset) = basis%subset(iset)%exps(ipgf)
315 END DO
316 END DO
317
318 END SUBROUTINE transfer_data_to_gto
319
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
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
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_uplo_to_full(matrix, work, uplo)
given a triangular matrix according to uplo, 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
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
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
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_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, 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.
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.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
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...
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, qs_kind_set, particle_set, para_env, id_nr, multiplicity, dft_section, natom_mismatch, cdft, out_unit)
...
Definition qs_mo_io.F:516
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 ...
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...
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...
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
Provides all information about an atomic kind.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
represent a full matrix
stores all the informations relevant to an mpi environment
type containing all information needed for basis matching
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.