72 SUBROUTINE wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, &
73 unoccupied_orbs, scf_env, matrix_s, marked_states, for_rtp)
80 INTEGER :: output_unit
82 OPTIONAL,
POINTER :: unoccupied_orbs
84 TYPE(dbcsr_p_type),
DIMENSION(:),
OPTIONAL, &
86 INTEGER,
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: marked_states
87 LOGICAL,
OPTIONAL :: for_rtp
89 CHARACTER(len=*),
PARAMETER :: routinen =
'wfn_mix'
91 CHARACTER(LEN=default_path_length) :: read_file_name
92 INTEGER :: handle, i_rep, ispin, mark_ind, mark_number, n_rep, orig_mo_index, &
93 orig_spin_index, orig_type, restart_unit, result_mo_index, result_spin_index
94 LOGICAL :: explicit, is_file, my_for_rtp, &
96 REAL(kind=
dp) :: orig_scale, orthonormality, result_scale
99 TYPE(
mo_set_type),
ALLOCATABLE,
DIMENSION(:) :: mos_new, mos_orig_ext
102 CALL timeset(routinen, handle)
109 IF (
PRESENT(for_rtp))
THEN
115 IF (output_unit > 0)
THEN
116 WRITE (output_unit,
'()')
117 WRITE (output_unit,
'(T2,A)')
"Performing wfn mixing"
118 WRITE (output_unit,
'(T2,A)')
"====================="
121 ALLOCATE (mos_new(
SIZE(mos)))
122 DO ispin = 1,
SIZE(mos)
127 NULLIFY (fm_struct_vector)
128 CALL cp_fm_struct_create(fm_struct_vector, template_fmstruct=mos(1)%mo_coeff%matrix_struct, &
137 IF (.NOT. explicit) n_rep = 0
142 CALL section_vals_val_get(update_section,
"RESULT_MO_INDEX", i_rep_section=i_rep, i_val=result_mo_index)
143 CALL section_vals_val_get(update_section,
"RESULT_MARKED_STATE", i_rep_section=i_rep, i_val=mark_number)
144 CALL section_vals_val_get(update_section,
"RESULT_SPIN_INDEX", i_rep_section=i_rep, i_val=result_spin_index)
146 CALL section_vals_val_get(update_section,
"RESULT_SCALE", i_rep_section=i_rep, r_val=result_scale)
149 IF (mark_number .GT. 0) result_mo_index = marked_states(mark_number, result_spin_index, mark_ind)
154 CALL section_vals_val_get(update_section,
"ORIG_MO_INDEX", i_rep_section=i_rep, i_val=orig_mo_index)
155 CALL section_vals_val_get(update_section,
"ORIG_MARKED_STATE", i_rep_section=i_rep, i_val=mark_number)
156 CALL section_vals_val_get(update_section,
"ORIG_SPIN_INDEX", i_rep_section=i_rep, i_val=orig_spin_index)
161 IF (mark_number .GT. 0) orig_mo_index = marked_states(mark_number, orig_spin_index, mark_ind)
168 CALL cp_fm_to_fm(mos(orig_spin_index)%mo_coeff, matrix_x, 1, &
169 mos(orig_spin_index)%nmo - orig_mo_index + 1, 1)
173 IF (.NOT.
ASSOCIATED(unoccupied_orbs)) &
174 CALL cp_abort(__location__, &
175 "If ORIG_TYPE is set to VIRTUAL, the array unoccupied_orbs must be associated! "// &
176 "For instance, ask in the SCF section to compute virtual orbitals after the GS optimization.")
177 CALL cp_fm_to_fm(unoccupied_orbs(orig_spin_index), matrix_x, 1, orig_mo_index, 1)
182 c_val=read_file_name)
183 IF (read_file_name ==
"EMPTY") &
184 CALL cp_abort(__location__, &
185 "If ORIG_TYPE is set to EXTERNAL, a file name should be set in ORIG_EXT_FILE_NAME "// &
186 "so that it can be used as the orginal MO.")
188 ALLOCATE (mos_orig_ext(
SIZE(mos)))
189 DO ispin = 1,
SIZE(mos)
193 IF (para_env%is_source())
THEN
194 INQUIRE (file=trim(read_file_name), exist=is_file)
196 CALL cp_abort(__location__, &
197 "Reference file not found! Name of the file CP2K looked for: "//trim(read_file_name))
199 CALL open_file(file_name=read_file_name, &
200 file_action=
"READ", &
201 file_form=
"UNFORMATTED", &
203 unit_number=restart_unit)
206 particle_set=particle_set, natom=
SIZE(particle_set, 1), &
207 rst_unit=restart_unit)
208 IF (para_env%is_source())
CALL close_file(unit_number=restart_unit)
210 CALL cp_fm_to_fm(mos_orig_ext(orig_spin_index)%mo_coeff, matrix_x, 1, &
211 mos_orig_ext(orig_spin_index)%nmo - orig_mo_index + 1, 1)
213 DO ispin = 1,
SIZE(mos_orig_ext)
216 DEALLOCATE (mos_orig_ext)
220 CALL cp_fm_to_fm(mos_new(result_spin_index)%mo_coeff, matrix_y, &
221 1, mos_new(result_spin_index)%nmo - result_mo_index + 1, 1)
226 CALL cp_fm_to_fm(matrix_y, mos_new(result_spin_index)%mo_coeff, &
227 1, 1, mos_new(result_spin_index)%nmo - result_mo_index + 1)
234 DO ispin = 1,
SIZE(mos_new)
235 CALL cp_fm_to_fm(mos_new(ispin)%mo_coeff, mos(ispin)%mo_coeff)
236 IF (mos_new(1)%use_mo_coeff_b) &
238 IF (mos(1)%use_mo_coeff_b) &
248 IF (output_unit > 0)
THEN
249 WRITE (output_unit,
'()')
250 WRITE (output_unit,
'(T2,A,T61,E20.4)') &
251 "Maximum deviation from MO S-orthonormality", orthonormality
252 WRITE (output_unit,
'(T2,A)')
"Writing new MOs to file"
257 DO ispin = 1,
SIZE(mos_new)
258 IF (overwrite_mos)
THEN
259 CALL cp_fm_to_fm(mos_new(ispin)%mo_coeff, mos(ispin)%mo_coeff)
260 IF (mos_new(1)%use_mo_coeff_b) &
263 IF (mos(1)%use_mo_coeff_b) &
269 DO ispin = 1,
SIZE(mos_new)
276 CALL timestop(handle)
Define the data structure for the particle information.