(git:374b731)
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-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
23 USE cp_fm_types, ONLY: cp_fm_create,&
28 USE dbcsr_api, ONLY: dbcsr_get_info,&
29 dbcsr_p_type,&
30 dbcsr_type
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, 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
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...
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
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_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.
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, 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 ...
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.