23 dbcsr_type_no_symmetry
60#include "./base/base_uses.f90"
65 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'mscfg_methods'
85 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: charge_of_frag, first_atom_of_frag, &
86 last_atom_of_frag, multip_of_frag
91 cpassert(
ASSOCIATED(qs_env))
93 molecule_set=molecule_set)
95 nmols =
SIZE(molecule_set)
97 ALLOCATE (first_atom_of_frag(nmols))
98 ALLOCATE (last_atom_of_frag(nmols))
99 ALLOCATE (charge_of_frag(nmols))
100 ALLOCATE (multip_of_frag(nmols))
103 mol_to_first_atom=first_atom_of_frag, &
104 mol_to_last_atom=last_atom_of_frag, &
105 mol_to_charge=charge_of_frag, &
106 mol_to_multiplicity=multip_of_frag)
108 CALL calcs_on_isolated_molecules(force_env, globenv, nmols, &
109 first_atom_of_frag, last_atom_of_frag, charge_of_frag, multip_of_frag)
111 DEALLOCATE (first_atom_of_frag)
112 DEALLOCATE (last_atom_of_frag)
113 DEALLOCATE (charge_of_frag)
114 DEALLOCATE (multip_of_frag)
133 SUBROUTINE calcs_on_isolated_molecules(force_env, globenv, nfrags, &
134 first_atom_of_frag, last_atom_of_frag, charge_of_frag, multip_of_frag)
138 INTEGER,
INTENT(IN) :: nfrags
139 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: first_atom_of_frag, last_atom_of_frag, &
140 charge_of_frag, multip_of_frag
142 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calcs_on_isolated_molecules'
144 CHARACTER(LEN=default_string_length) :: added_mos_string, name
145 CHARACTER(LEN=default_string_length), &
146 DIMENSION(:),
POINTER :: atom_type
147 INTEGER :: first_atom, force_method, global_charge, global_multpl, handle, i, ifrag, imo, &
148 isize, j, k, last_atom, my_targ, nb_eigenval_stored, nmo, nmo_of_frag, nmosets_of_frag, &
149 tot_added_mos, tot_isize
150 INTEGER,
DIMENSION(:),
POINTER :: atom_index, atom_list
151 LOGICAL :: global_almo_scf_keyword, smear_almo_scf
154 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_of_frag
161 qs_section, root_section, scf_section, &
164 CALL timeset(routinen, handle)
166 NULLIFY (subsys_loc, subsys, particles, para_env, atom_index, atom_type, &
167 force_env_section, qs_env_loc, mscfg_env, qs_env,
qs_energy)
168 CALL force_env_get(force_env, force_env_section=force_env_section, &
171 cpassert(force_method ==
do_qs)
172 root_section => force_env%root_section
186 CALL force_env_get(force_env=force_env, subsys=subsys, para_env=para_env)
188 CALL get_qs_env(qs_env, mscfg_env=mscfg_env, almo_scf_env=almo_scf_env)
189 cpassert(
ASSOCIATED(mscfg_env))
190 IF (global_almo_scf_keyword)
THEN
191 smear_almo_scf = qs_env%scf_control%smear%do_smear
192 IF (smear_almo_scf)
THEN
195 tot_added_mos = qs_env%scf_control%added_mos(1)
197 tot_isize = last_atom_of_frag(nfrags) - first_atom_of_frag(1) + 1
200 IF (tot_isize /= tot_added_mos)
THEN
201 cpabort(
"ALMO smearing currently requires ADDED_MOS == total number of atoms")
206 IF (
SIZE(mos) > 1) cpabort(
"Unrestricted ALMO methods are NYI")
209 cpassert(
ASSOCIATED(almo_scf_env))
210 ALLOCATE (almo_scf_env%mo_energies(nmo,
SIZE(mos)))
211 ALLOCATE (almo_scf_env%kTS(
SIZE(mos)))
212 nb_eigenval_stored = 0
215 smear_almo_scf = .false.
251 IF (almo_scf_env%activate(1) == 1)
THEN
252 multip_of_frag(ifrag) = almo_scf_env%multiplicity_of_domain(ifrag)
253 charge_of_frag(ifrag) = almo_scf_env%charge_of_domain(ifrag)
264 first_atom = first_atom_of_frag(ifrag)
265 last_atom = last_atom_of_frag(ifrag)
266 isize = last_atom - first_atom + 1
267 ALLOCATE (atom_index(isize))
268 atom_index(1:isize) = [(i, i=first_atom, last_atom)]
272 ALLOCATE (atom_type(isize))
274 my_targ = atom_index(j)
275 DO k = 1,
SIZE(particles%els)
276 CALL get_atomic_kind(particles%els(k)%atomic_kind, atom_list=atom_list, name=name)
277 IF (any(atom_list == my_targ))
EXIT
284 IF (smear_almo_scf)
THEN
285 WRITE (added_mos_string,
"(I0)") isize
292 small_cell=subsys%cell, sub_atom_index=atom_index, &
293 sub_atom_kind_name=atom_type, para_env=para_env, &
294 force_env_section=force_env_section, subsys_section=subsys_section)
295 ALLOCATE (qs_env_loc)
297 CALL qs_init(qs_env_loc, para_env, root_section, globenv=globenv, cp_subsys=subsys_loc, &
298 force_env_section=force_env_section, subsys_section=subsys_section, &
299 use_motion_section=.false., multip=multip_of_frag(ifrag), charge=charge_of_frag(ifrag))
305 CALL print_frag_info(atom_index, atom_type, ifrag, nfrags, &
306 charge_of_frag(ifrag), multip_of_frag(ifrag))
319 mscfg_env%energy_of_frag(ifrag) =
qs_energy%total
320 nmosets_of_frag =
SIZE(mos_of_frag)
322 mscfg_env%nmosets_of_frag(ifrag) = nmosets_of_frag
323 DO imo = 1, nmosets_of_frag
325 IF (global_almo_scf_keyword)
THEN
330 mos_of_frag(imo)%mo_coeff_b)
331 IF (smear_almo_scf)
THEN
333 nmo_of_frag =
SIZE(mos_of_frag(imo)%eigenvalues)
334 almo_scf_env%mo_energies(nb_eigenval_stored + 1:nb_eigenval_stored + nmo_of_frag, imo) &
335 = mos_of_frag(imo)%eigenvalues(:)
337 nb_eigenval_stored = nb_eigenval_stored + nmo_of_frag
343 template=mos_of_frag(imo)%mo_coeff_b, &
344 matrix_type=dbcsr_type_no_symmetry)
345 CALL dbcsr_copy(mscfg_env%mos_of_frag(ifrag, imo), &
346 mos_of_frag(imo)%mo_coeff_b)
353 DEALLOCATE (qs_env_loc)
354 DEALLOCATE (atom_index)
355 DEALLOCATE (atom_type)
363 CALL timestop(handle)
365 END SUBROUTINE calcs_on_isolated_molecules
380 SUBROUTINE print_frag_info(atom_index, atom_type, frag, nfrags, charge, &
383 INTEGER,
DIMENSION(:),
POINTER :: atom_index
384 CHARACTER(len=default_string_length), &
385 DIMENSION(:),
POINTER :: atom_type
386 INTEGER,
INTENT(IN) :: frag, nfrags, charge, multpl
388 CHARACTER(len=11) :: chari
394 IF (logger%para_env%is_source())
THEN
402 WRITE (unit=iw, fmt=
"(/,T2,A)") repeat(
"-", 79)
403 WRITE (unit=iw, fmt=
"(T2,A,T80,A)")
"-",
"-"
404 WRITE (unit=iw, fmt=
"(T2,A,T5,A,T25,A,T40,I11,T53,A,T67,I11,T80,A)") &
405 "-",
"MOLECULAR GUESS:",
"FRAGMENT", frag,
"OUT OF", nfrags,
"-"
406 WRITE (unit=iw, fmt=
"(T2,A,T25,A,T40,I11,T53,A,T67,I11,T80,A)")
"-",
"CHARGE", charge,
"MULTIPLICITY", &
408 WRITE (unit=iw, fmt=
"(T2,A,T80,A)")
"-",
"-"
409 WRITE (unit=iw, fmt=
"(T2,A,T25,A,T53,A,T80,A)")
"-",
"ATOM INDEX",
"ATOM NAME",
"-"
410 WRITE (unit=iw, fmt=
"(T2,A,T25,A,T53,A,T80,A)")
"-",
"----------",
"---------",
"-"
411 DO i = 1,
SIZE(atom_index)
412 WRITE (chari,
'(I11)') atom_index(i)
413 WRITE (unit=iw, fmt=
"(T2,A,T25,A,T53,A,T80,A)")
"-", adjustl(chari), trim(atom_type(i)),
"-"
415 WRITE (unit=iw, fmt=
"(T2,A)") repeat(
"-", 79)
418 END SUBROUTINE print_frag_info
433 INTEGER :: almo_guess_type, frz_term_type, &
434 method_name_id, scf_guess_type
435 LOGICAL :: almo_scf_is_on, is_crystal, is_fast_dirty
442 is_fast_dirty = .true.
444 almo_scf_is_on = .false.
446 NULLIFY (qs_env, mscfg_env, force_env_section, subsection)
447 CALL force_env_get(force_env, force_env_section=force_env_section)
450 IF (method_name_id ==
do_qs)
THEN
453 cpassert(
ASSOCIATED(qs_env))
456 cpassert(
ASSOCIATED(mscfg_env))
493 is_fast_dirty = .false.
501 mscfg_env%is_fast_dirty = is_fast_dirty
502 mscfg_env%is_crystal = is_crystal
Types for all ALMO-based methods.
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 dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
DBCSR operations in CP2K.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Initialize a small environment for a particular calculation.
subroutine, public create_small_subsys(small_subsys, big_subsys, small_cell, small_para_env, sub_atom_index, sub_atom_kind_name, para_env, force_env_section, subsys_section, ignore_outside_box)
updates the molecule information of the given subsys
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_release(subsys)
releases a subsys (see doc/ReferenceCounting.html)
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell)
returns information about various attributes of the given subsys
Interface for the force calculations.
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
returns various attributes about the force environment
Define type storing the global information of a run. Keep the amount of stored data small....
Defines the basic variable types.
integer, parameter, public default_string_length
Interface to the message passing library MPI.
Define the data structure for the molecule information.
subroutine, public get_molecule_set_info(molecule_set, atom_to_mol, mol_to_first_atom, mol_to_last_atom, mol_to_nelectrons, mol_to_nbasis, mol_to_charge, mol_to_multiplicity)
returns information about molecules in the set.
Subroutines to perform calculations on molecules from a bigger system. Useful to generate a high-qual...
subroutine, public loop_over_molecules(globenv, force_env)
Prepare data for calculations on isolated molecules.
logical function, public do_mol_loop(force_env)
Is the loop over molecules requested?
Types used to generate the molecular SCF guess.
integer, parameter, public mscfg_max_moset_size
subroutine, public molecular_scf_guess_env_init(env, nfrags)
Allocates data.
represent a simple array based list of the given type
Perform a QUICKSTEP wavefunction optimization (single point).
subroutine, public qs_energies(qs_env, consistent_energies, calc_forces)
Driver routine for QUICKSTEP single point wavefunction optimization.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public qs_env_release(qs_env)
releases the given qs_env (see doc/ReferenceCounting.html)
subroutine, public qs_env_create(qs_env, globenv)
allocates and intitializes a qs_env
subroutine, public qs_init(qs_env, para_env, root_section, globenv, cp_subsys, kpoint_env, qmmm, qmmm_env_qm, force_env_section, subsys_section, use_motion_section, silent, multip, charge)
Read the input and the database files for the setup of the QUICKSTEP environment.
Definition and initialisation of the mo data type.
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.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represents a system: atoms, molecules, their pos,vel,...
wrapper to abstract the force evaluation of the various methods
contains the initially parsed file and the initial parallel environment
stores all the informations relevant to an mpi environment
represent a list of objects