26 USE dbcsr_api,
ONLY: dbcsr_p_type
47 #include "./base/base_uses.f90"
53 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_wfn_mix'
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)
75 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
76 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
77 TYPE(section_vals_type),
POINTER :: dft_section
78 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
79 TYPE(mp_para_env_type),
POINTER :: para_env
80 INTEGER :: output_unit
81 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN), &
82 OPTIONAL,
POINTER :: unoccupied_orbs
83 TYPE(qs_scf_env_type),
OPTIONAL,
POINTER :: scf_env
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
97 TYPE(cp_fm_struct_type),
POINTER :: fm_struct_vector
98 TYPE(cp_fm_type) :: matrix_x, matrix_y
99 TYPE(mo_set_type),
ALLOCATABLE,
DIMENSION(:) :: mos_new, mos_orig_ext
100 TYPE(section_vals_type),
POINTER :: update_section, wfn_mix_section
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)
230 CALL cp_fm_release(matrix_x)
231 CALL cp_fm_release(matrix_y)
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)
DBCSR operations in CP2K.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
basic linear algebra operations for full matrices
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
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
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_path_length
Interface to the message passing library MPI.
Define the data structure for the particle information.
Define the quickstep kind type and their sub types.
Definition and initialisation of the mo data type.
subroutine, public write_mo_set_to_restart(mo_array, particle_set, dft_section, qs_kind_set)
...
subroutine, public read_mos_restart_low(mos, para_env, qs_kind_set, particle_set, natom, rst_unit, multiplicity, rt_mos, natom_mismatch)
Reading the mos from apreviously defined restart file.
collects routines that perform operations directly related to MOs
subroutine, public calculate_orthonormality(orthonormality, mo_array, matrix_s)
...
Definition and initialisation of the mo data type.
subroutine, public duplicate_mo_set(mo_set_new, mo_set_old)
allocate a new mo_set, and copy the old data
subroutine, public deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
module that contains the definitions of the scf types
integer, parameter, public special_diag_method_nr
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, unoccupied_orbs, scf_env, matrix_s, marked_states, for_rtp)
writes a new 'mixed' set of mos to restart file, without touching the current MOs