Line data Source code
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 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Routines to somehow generate an initial guess
10 : !> \par History
11 : !> 2006.03 Moved here from qs_scf.F [Joost VandeVondele]
12 : ! **************************************************************************************************
13 : MODULE qs_initial_guess
14 : USE atom_kind_orbitals, ONLY: calculate_atomic_orbitals
15 : USE atomic_kind_types, ONLY: atomic_kind_type,&
16 : get_atomic_kind,&
17 : get_atomic_kind_set
18 : USE basis_set_types, ONLY: get_gto_basis_set,&
19 : gto_basis_set_type
20 : USE cp_control_types, ONLY: dft_control_type
21 : USE cp_dbcsr_api, ONLY: &
22 : dbcsr_checksum, dbcsr_copy, dbcsr_dot, dbcsr_filter, dbcsr_get_diag, dbcsr_get_num_blocks, &
23 : dbcsr_get_occupation, dbcsr_iterator_blocks_left, dbcsr_iterator_next_block, &
24 : dbcsr_iterator_start, dbcsr_iterator_stop, dbcsr_iterator_type, dbcsr_multiply, &
25 : dbcsr_nfullrows_total, dbcsr_p_type, dbcsr_release, dbcsr_scale, dbcsr_set, &
26 : dbcsr_set_diag, dbcsr_type, dbcsr_verify_matrix
27 : USE cp_dbcsr_operations, ONLY: copy_dbcsr_to_fm,&
28 : copy_fm_to_dbcsr,&
29 : cp_dbcsr_sm_fm_multiply,&
30 : cp_fm_to_dbcsr_row_template
31 : USE cp_fm_cholesky, ONLY: cp_fm_cholesky_decompose
32 : USE cp_fm_struct, ONLY: cp_fm_struct_create,&
33 : cp_fm_struct_get,&
34 : cp_fm_struct_release,&
35 : cp_fm_struct_type
36 : USE cp_fm_types, ONLY: &
37 : cp_fm_create, cp_fm_get_info, cp_fm_get_submatrix, cp_fm_init_random, cp_fm_release, &
38 : cp_fm_set_all, cp_fm_set_submatrix, cp_fm_to_fm, cp_fm_type
39 : USE cp_log_handling, ONLY: cp_get_default_logger,&
40 : cp_logger_get_default_io_unit,&
41 : cp_logger_type,&
42 : cp_to_string
43 : USE cp_output_handling, ONLY: cp_print_key_finished_output,&
44 : cp_print_key_unit_nr
45 : USE external_potential_types, ONLY: all_potential_type,&
46 : gth_potential_type,&
47 : sgp_potential_type
48 : USE hfx_types, ONLY: hfx_type
49 : USE input_constants, ONLY: atomic_guess,&
50 : core_guess,&
51 : history_guess,&
52 : mopac_guess,&
53 : no_guess,&
54 : random_guess,&
55 : restart_guess,&
56 : sparse_guess
57 : USE input_cp2k_hfx, ONLY: ri_mo
58 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
59 : section_vals_type,&
60 : section_vals_val_get
61 : USE kinds, ONLY: default_path_length,&
62 : dp
63 : USE kpoint_io, ONLY: read_kpoints_restart
64 : USE kpoint_types, ONLY: kpoint_type
65 : USE message_passing, ONLY: mp_para_env_type
66 : USE particle_methods, ONLY: get_particle_set
67 : USE particle_types, ONLY: particle_type
68 : USE qs_atomic_block, ONLY: calculate_atomic_block_dm
69 : USE qs_density_matrices, ONLY: calculate_density_matrix
70 : USE qs_dftb_utils, ONLY: get_dftb_atom_param
71 : USE qs_environment_types, ONLY: get_qs_env,&
72 : qs_environment_type
73 : USE qs_kind_types, ONLY: get_qs_kind,&
74 : get_qs_kind_set,&
75 : qs_kind_type
76 : USE qs_mo_io, ONLY: read_mo_set_from_restart,&
77 : wfn_restart_file_name
78 : USE qs_mo_methods, ONLY: make_basis_lowdin,&
79 : make_basis_simple,&
80 : make_basis_sm
81 : USE qs_mo_occupation, ONLY: set_mo_occupation
82 : USE qs_mo_types, ONLY: get_mo_set,&
83 : mo_set_restrict,&
84 : mo_set_type,&
85 : reassign_allocated_mos
86 : USE qs_mom_methods, ONLY: do_mom_guess
87 : USE qs_rho_methods, ONLY: qs_rho_update_rho
88 : USE qs_rho_types, ONLY: qs_rho_get,&
89 : qs_rho_type
90 : USE qs_scf_methods, ONLY: eigensolver,&
91 : eigensolver_simple
92 : USE qs_scf_types, ONLY: block_davidson_diag_method_nr,&
93 : block_krylov_diag_method_nr,&
94 : general_diag_method_nr,&
95 : ot_diag_method_nr,&
96 : qs_scf_env_type
97 : USE qs_wf_history_methods, ONLY: wfi_update
98 : USE scf_control_types, ONLY: scf_control_type
99 : USE util, ONLY: sort
100 : USE xtb_types, ONLY: get_xtb_atom_param,&
101 : xtb_atom_type
102 : #include "./base/base_uses.f90"
103 :
104 : IMPLICIT NONE
105 :
106 : PRIVATE
107 :
108 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_initial_guess'
109 :
110 : PUBLIC :: calculate_first_density_matrix, calculate_mopac_dm
111 : PUBLIC :: calculate_atomic_fock_matrix
112 :
113 : TYPE atom_matrix_type
114 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: mat => NULL()
115 : END TYPE atom_matrix_type
116 :
117 : CONTAINS
118 :
119 : ! **************************************************************************************************
120 : !> \brief can use a variety of methods to come up with an initial
121 : !> density matrix and optionally an initial wavefunction
122 : !> \param scf_env SCF environment information
123 : !> \param qs_env QS environment
124 : !> \par History
125 : !> 03.2006 moved here from qs_scf [Joost VandeVondele]
126 : !> 06.2007 allow to skip the initial guess [jgh]
127 : !> 08.2014 kpoints [JGH]
128 : !> 10.2019 tot_corr_zeff, switch_surf_dip [SGh]
129 : !> \note
130 : !> badly needs to be split in subroutines each doing one of the possible
131 : !> schemes
132 : ! **************************************************************************************************
133 6117 : SUBROUTINE calculate_first_density_matrix(scf_env, qs_env)
134 :
135 : TYPE(qs_scf_env_type), POINTER :: scf_env
136 : TYPE(qs_environment_type), POINTER :: qs_env
137 :
138 : CHARACTER(LEN=*), PARAMETER :: routineN = 'calculate_first_density_matrix'
139 :
140 : CHARACTER(LEN=default_path_length) :: file_name, filename
141 : INTEGER :: atom_a, blk, density_guess, handle, homo, i, iatom, ic, icol, id_nr, ikind, irow, &
142 : iseed(4), ispin, istart_col, istart_row, j, last_read, n, n_cols, n_rows, nao, natom, &
143 : natoms, natoms_tmp, nblocks, nelectron, nmo, nmo_tmp, not_read, nsgf, nspin, nvec, ounit, &
144 : safe_density_guess, size_atomic_kind_set, z
145 6117 : INTEGER, ALLOCATABLE, DIMENSION(:) :: first_sgf, kind_of, last_sgf
146 : INTEGER, DIMENSION(2) :: nelectron_spin
147 6117 : INTEGER, DIMENSION(:), POINTER :: atom_list, elec_conf, nelec_kind, &
148 6117 : sort_kind
149 : LOGICAL :: did_guess, do_hfx_ri_mo, do_kpoints, do_std_diag, exist, has_unit_metric, &
150 : natom_mismatch, need_mos, need_wm, ofgpw, owns_ortho, print_history_log, print_log
151 6117 : REAL(dp), ALLOCATABLE, DIMENSION(:, :) :: buff, buff2
152 6117 : REAL(dp), DIMENSION(:, :), POINTER :: pdata
153 : REAL(KIND=dp) :: checksum, eps, length, maxocc, occ, &
154 : rscale, tot_corr_zeff, trps1, zeff
155 : REAL(KIND=dp), DIMENSION(0:3) :: edftb
156 6117 : TYPE(atom_matrix_type), DIMENSION(:), POINTER :: pmat
157 6117 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
158 : TYPE(atomic_kind_type), POINTER :: atomic_kind
159 : TYPE(cp_fm_struct_type), POINTER :: ao_ao_struct, ao_mo_struct
160 : TYPE(cp_fm_type) :: sv
161 6117 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: work1
162 : TYPE(cp_fm_type), POINTER :: mo_coeff, moa, mob, ortho, work2
163 : TYPE(cp_logger_type), POINTER :: logger
164 : TYPE(dbcsr_iterator_type) :: iter
165 6117 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: h_core_sparse, matrix_ks, p_rmpv, &
166 6117 : s_sparse
167 6117 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_h_kp, matrix_ks_kp, matrix_s_kp, &
168 6117 : rho_ao_kp
169 : TYPE(dbcsr_type) :: mo_dbcsr, mo_tmp_dbcsr
170 : TYPE(dft_control_type), POINTER :: dft_control
171 : TYPE(gto_basis_set_type), POINTER :: orb_basis_set
172 6117 : TYPE(hfx_type), DIMENSION(:, :), POINTER :: x_data
173 : TYPE(kpoint_type), POINTER :: kpoints
174 6117 : TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array, mos_last_converged
175 : TYPE(mp_para_env_type), POINTER :: para_env
176 6117 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
177 6117 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
178 : TYPE(qs_kind_type), POINTER :: qs_kind
179 : TYPE(qs_rho_type), POINTER :: rho
180 : TYPE(scf_control_type), POINTER :: scf_control
181 : TYPE(section_vals_type), POINTER :: dft_section, input, subsys_section
182 :
183 12234 : logger => cp_get_default_logger()
184 6117 : NULLIFY (atomic_kind, qs_kind, mo_coeff, orb_basis_set, atomic_kind_set, &
185 6117 : qs_kind_set, particle_set, ortho, work2, work1, mo_array, s_sparse, &
186 6117 : scf_control, dft_control, p_rmpv, para_env, h_core_sparse, matrix_ks, rho, &
187 6117 : mos_last_converged)
188 6117 : NULLIFY (dft_section, input, subsys_section)
189 6117 : NULLIFY (matrix_s_kp, matrix_h_kp, matrix_ks_kp, rho_ao_kp)
190 6117 : NULLIFY (moa, mob)
191 6117 : NULLIFY (atom_list, elec_conf, kpoints)
192 : edftb = 0.0_dp
193 6117 : tot_corr_zeff = 0.0_dp
194 :
195 6117 : CALL timeset(routineN, handle)
196 :
197 : CALL get_qs_env(qs_env, &
198 : atomic_kind_set=atomic_kind_set, &
199 : qs_kind_set=qs_kind_set, &
200 : particle_set=particle_set, &
201 : mos=mo_array, &
202 : matrix_s_kp=matrix_s_kp, &
203 : matrix_h_kp=matrix_h_kp, &
204 : matrix_ks_kp=matrix_ks_kp, &
205 : input=input, &
206 : scf_control=scf_control, &
207 : dft_control=dft_control, &
208 : has_unit_metric=has_unit_metric, &
209 : do_kpoints=do_kpoints, &
210 : kpoints=kpoints, &
211 : rho=rho, &
212 : nelectron_spin=nelectron_spin, &
213 : para_env=para_env, &
214 6117 : x_data=x_data)
215 :
216 6117 : CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
217 :
218 6117 : IF (dft_control%switch_surf_dip) THEN
219 2 : CALL get_qs_env(qs_env, mos_last_converged=mos_last_converged)
220 : END IF
221 :
222 : ! just initialize the first image, the other density are set to zero
223 13649 : DO ispin = 1, dft_control%nspins
224 87705 : DO ic = 1, SIZE(rho_ao_kp, 2)
225 81588 : CALL dbcsr_set(rho_ao_kp(ispin, ic)%matrix, 0.0_dp)
226 : END DO
227 : END DO
228 6117 : s_sparse => matrix_s_kp(:, 1)
229 6117 : h_core_sparse => matrix_h_kp(:, 1)
230 6117 : matrix_ks => matrix_ks_kp(:, 1)
231 6117 : p_rmpv => rho_ao_kp(:, 1)
232 :
233 6117 : work1 => scf_env%scf_work1
234 6117 : work2 => scf_env%scf_work2
235 6117 : ortho => scf_env%ortho
236 :
237 6117 : dft_section => section_vals_get_subs_vals(input, "DFT")
238 :
239 6117 : nspin = dft_control%nspins
240 6117 : ofgpw = dft_control%qs_control%ofgpw
241 6117 : density_guess = scf_control%density_guess
242 6117 : do_std_diag = .FALSE.
243 :
244 6117 : do_hfx_ri_mo = .FALSE.
245 6117 : IF (ASSOCIATED(x_data)) THEN
246 1200 : IF (x_data(1, 1)%do_hfx_ri) THEN
247 114 : IF (x_data(1, 1)%ri_data%flavor == ri_mo) do_hfx_ri_mo = .TRUE.
248 : END IF
249 : END IF
250 :
251 6117 : IF (ASSOCIATED(scf_env%krylov_space)) do_std_diag = (scf_env%krylov_space%eps_std_diag > 0.0_dp)
252 :
253 : need_mos = scf_control%use_ot .OR. scf_env%method == ot_diag_method_nr .OR. &
254 : (scf_env%method == block_krylov_diag_method_nr .AND. .NOT. do_std_diag) &
255 : .OR. dft_control%do_admm .OR. scf_env%method == block_davidson_diag_method_nr &
256 6117 : .OR. do_hfx_ri_mo
257 :
258 6117 : safe_density_guess = atomic_guess
259 6117 : IF (dft_control%qs_control%semi_empirical .OR. dft_control%qs_control%dftb) THEN
260 802 : IF (density_guess == atomic_guess) density_guess = mopac_guess
261 : safe_density_guess = mopac_guess
262 : END IF
263 6117 : IF (dft_control%qs_control%xtb) THEN
264 440 : IF (do_kpoints) THEN
265 220 : IF (density_guess == atomic_guess) density_guess = mopac_guess
266 : safe_density_guess = mopac_guess
267 : ELSE
268 220 : IF (density_guess == atomic_guess) density_guess = core_guess
269 : safe_density_guess = core_guess
270 : END IF
271 : END IF
272 :
273 6117 : IF (scf_control%use_ot .AND. &
274 : (.NOT. ((density_guess == random_guess) .OR. &
275 : (density_guess == atomic_guess) .OR. &
276 : (density_guess == core_guess) .OR. &
277 : (density_guess == mopac_guess) .OR. &
278 : (density_guess == sparse_guess) .OR. &
279 : (((density_guess == restart_guess) .OR. &
280 : (density_guess == history_guess)) .AND. &
281 : (scf_control%level_shift == 0.0_dp))))) THEN
282 : CALL cp_abort(__LOCATION__, &
283 0 : "OT needs GUESS ATOMIC / CORE / RANDOM / SPARSE / RESTART / HISTORY RESTART: other options NYI")
284 : END IF
285 :
286 : ! if a restart was requested, check that the file exists,
287 : ! if not we fall back to an atomic guess. No kidding, the file name should remain
288 : ! in sync with read_mo_set_from_restart
289 0 : id_nr = 0
290 6117 : IF (density_guess == restart_guess) THEN
291 : ! only check existence on I/O node, otherwise if file exists there but
292 : ! not on compute nodes, everything goes crazy even though only I/O
293 : ! node actually reads the file
294 564 : IF (do_kpoints) THEN
295 8 : IF (para_env%is_source()) THEN
296 4 : CALL wfn_restart_file_name(file_name, exist, dft_section, logger, kp=.TRUE.)
297 : END IF
298 : ELSE
299 556 : IF (para_env%is_source()) THEN
300 292 : CALL wfn_restart_file_name(file_name, exist, dft_section, logger)
301 : END IF
302 : END IF
303 564 : CALL para_env%bcast(exist)
304 564 : CALL para_env%bcast(file_name)
305 564 : IF (.NOT. exist) THEN
306 : CALL cp_warn(__LOCATION__, &
307 : "User requested to restart the wavefunction from the file named: "// &
308 : TRIM(file_name)//". This file does not exist. Please check the existence of"// &
309 : " the file or change properly the value of the keyword WFN_RESTART_FILE_NAME."// &
310 86 : " Calculation continues using ATOMIC GUESS. ")
311 86 : density_guess = safe_density_guess
312 : END IF
313 5553 : ELSE IF (density_guess == history_guess) THEN
314 2 : IF (do_kpoints) THEN
315 0 : CPABORT("calculate_first_density_matrix: history_guess not implemented for k-points")
316 : END IF
317 2 : IF (para_env%is_source()) THEN
318 1 : CALL wfn_restart_file_name(file_name, exist, dft_section, logger)
319 : END IF
320 2 : CALL para_env%bcast(exist)
321 2 : CALL para_env%bcast(file_name)
322 2 : nvec = qs_env%wf_history%memory_depth
323 2 : not_read = nvec + 1
324 : ! At this level we read the saved backup RESTART files..
325 6 : DO i = 1, nvec
326 4 : j = i - 1
327 4 : filename = TRIM(file_name)
328 4 : IF (j /= 0) THEN
329 2 : filename = TRIM(file_name)//".bak-"//ADJUSTL(cp_to_string(j))
330 : END IF
331 4 : IF (para_env%is_source()) &
332 2 : INQUIRE (FILE=filename, exist=exist)
333 4 : CALL para_env%bcast(exist)
334 6 : IF ((.NOT. exist) .AND. (i < not_read)) THEN
335 : not_read = i
336 : END IF
337 : END DO
338 2 : IF (not_read == 1) THEN
339 0 : density_guess = restart_guess
340 0 : filename = TRIM(file_name)
341 0 : IF (para_env%is_source()) INQUIRE (FILE=filename, exist=exist)
342 0 : CALL para_env%bcast(exist)
343 0 : IF (.NOT. exist) THEN
344 : CALL cp_warn(__LOCATION__, &
345 : "User requested to restart the wavefunction from a series of restart files named: "// &
346 : TRIM(file_name)//" with extensions (.bak-n). These files do not exist."// &
347 : " Even trying to switch to a plain restart wave-function failes because the"// &
348 : " file named: "//TRIM(file_name)//" does not exist. Please check the existence of"// &
349 : " the file or change properly the value of the keyword WFN_RESTART_FILE_NAME."// &
350 0 : " Calculation continues using ATOMIC GUESS. ")
351 0 : density_guess = safe_density_guess
352 : END IF
353 : END IF
354 2 : last_read = not_read - 1
355 : END IF
356 :
357 6117 : did_guess = .FALSE.
358 :
359 6117 : IF (dft_control%correct_el_density_dip) THEN
360 4 : tot_corr_zeff = qs_env%total_zeff_corr
361 : !WRITE(*,*) "tot_corr_zeff = ", tot_corr_zeff
362 4 : IF ((ABS(tot_corr_zeff) > 0.0_dp) .AND. (density_guess /= restart_guess)) THEN
363 : CALL cp_warn(__LOCATION__, &
364 : "Use SCF_GUESS RESTART in conjunction with "// &
365 : "CORE_CORRECTION /= 0.0 and SURFACE_DIPOLE_CORRECTION TRUE. "// &
366 : "It is always advisable to perform SURFACE_DIPOLE_CORRECTION "// &
367 : "after a simulation without the surface dipole correction "// &
368 4 : "and using the ensuing wavefunction restart file. ")
369 : END IF
370 : END IF
371 :
372 6117 : ounit = -1
373 6117 : print_log = .FALSE.
374 6117 : print_history_log = .FALSE.
375 6117 : IF (para_env%is_source()) THEN
376 : CALL section_vals_val_get(dft_section, &
377 : "SCF%PRINT%RESTART%LOG_PRINT_KEY", &
378 3096 : l_val=print_log)
379 : CALL section_vals_val_get(dft_section, &
380 : "SCF%PRINT%RESTART_HISTORY%LOG_PRINT_KEY", &
381 3096 : l_val=print_history_log)
382 3096 : IF (print_log .OR. print_history_log) THEN
383 13 : ounit = cp_logger_get_default_io_unit(logger)
384 : END IF
385 : END IF
386 :
387 6117 : IF (density_guess == restart_guess) THEN
388 478 : IF (ounit > 0) THEN
389 : WRITE (UNIT=ounit, FMT="(/,T2,A)") &
390 4 : "WFN_RESTART| Reading restart file"
391 : END IF
392 478 : IF (do_kpoints) THEN
393 6 : natoms = SIZE(particle_set)
394 : CALL read_kpoints_restart(rho_ao_kp, kpoints, work1, &
395 6 : natoms, para_env, id_nr, dft_section, natom_mismatch)
396 6 : IF (natom_mismatch) density_guess = safe_density_guess
397 : ELSE
398 : CALL read_mo_set_from_restart(mo_array, atomic_kind_set, qs_kind_set, particle_set, para_env, &
399 : id_nr=id_nr, multiplicity=dft_control%multiplicity, dft_section=dft_section, &
400 472 : natom_mismatch=natom_mismatch, out_unit=ounit)
401 :
402 472 : IF (natom_mismatch) THEN
403 : density_guess = safe_density_guess
404 : ELSE
405 1258 : DO ispin = 1, nspin
406 806 : IF (scf_control%level_shift /= 0.0_dp) THEN
407 0 : CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff)
408 0 : CALL cp_fm_to_fm(mo_coeff, ortho)
409 : END IF
410 :
411 : ! make all nmo vectors present orthonormal
412 : CALL get_mo_set(mo_set=mo_array(ispin), &
413 806 : mo_coeff=mo_coeff, nmo=nmo, homo=homo)
414 :
415 806 : IF (has_unit_metric) THEN
416 4 : CALL make_basis_simple(mo_coeff, nmo)
417 802 : ELSEIF (dft_control%smear) THEN
418 : CALL make_basis_lowdin(vmatrix=mo_coeff, ncol=nmo, &
419 104 : matrix_s=s_sparse(1)%matrix)
420 : ELSE
421 : ! ortho so that one can restart for different positions (basis sets?)
422 698 : CALL make_basis_sm(mo_coeff, homo, s_sparse(1)%matrix)
423 : END IF
424 : ! only alpha spin is kept for restricted
425 2064 : IF (dft_control%restricted) EXIT
426 : END DO
427 472 : IF (dft_control%restricted) CALL mo_set_restrict(mo_array)
428 :
429 472 : IF (.NOT. scf_control%diagonalization%mom) THEN
430 456 : IF (dft_control%correct_surf_dip) THEN
431 0 : IF (ABS(tot_corr_zeff) > 0.0_dp) THEN
432 : CALL set_mo_occupation(mo_array, smear=qs_env%scf_control%smear, &
433 0 : tot_zeff_corr=tot_corr_zeff)
434 : ELSE
435 0 : CALL set_mo_occupation(mo_array, smear=qs_env%scf_control%smear)
436 : END IF
437 : ELSE
438 456 : CALL set_mo_occupation(mo_array, smear=qs_env%scf_control%smear)
439 : END IF
440 : END IF
441 :
442 1298 : DO ispin = 1, nspin
443 :
444 826 : IF (scf_control%use_ot .OR. scf_env%method == ot_diag_method_nr) THEN !fm->dbcsr
445 : CALL copy_fm_to_dbcsr(mo_array(ispin)%mo_coeff, &
446 562 : mo_array(ispin)%mo_coeff_b) !fm->dbcsr
447 : END IF !fm->dbcsr
448 :
449 : CALL calculate_density_matrix(mo_array(ispin), &
450 1298 : p_rmpv(ispin)%matrix)
451 : END DO
452 : END IF ! natom_mismatch
453 :
454 : END IF
455 :
456 : ! Maximum Overlap Method
457 478 : IF (scf_control%diagonalization%mom) THEN
458 16 : CALL do_mom_guess(nspin, mo_array, scf_control, p_rmpv)
459 : END IF
460 :
461 : did_guess = .TRUE.
462 : END IF
463 :
464 6117 : IF (density_guess == history_guess) THEN
465 2 : IF (not_read > 1) THEN
466 2 : IF (ounit > 0) THEN
467 : WRITE (UNIT=ounit, FMT="(/,T2,A)") &
468 1 : "WFN_RESTART| Reading restart file history"
469 : END IF
470 6 : DO i = 1, last_read
471 4 : j = last_read - i
472 : CALL read_mo_set_from_restart(mo_array, atomic_kind_set, qs_kind_set, particle_set, para_env, &
473 : id_nr=j, multiplicity=dft_control%multiplicity, &
474 4 : dft_section=dft_section, out_unit=ounit)
475 :
476 8 : DO ispin = 1, nspin
477 4 : IF (scf_control%level_shift /= 0.0_dp) THEN
478 0 : CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff)
479 0 : CALL cp_fm_to_fm(mo_coeff, ortho)
480 : END IF
481 :
482 : ! make all nmo vectors present orthonormal
483 4 : CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff, nmo=nmo, homo=homo)
484 :
485 4 : IF (has_unit_metric) THEN
486 0 : CALL make_basis_simple(mo_coeff, nmo)
487 : ELSE
488 : ! ortho so that one can restart for different positions (basis sets?)
489 4 : CALL make_basis_sm(mo_coeff, homo, s_sparse(1)%matrix)
490 : END IF
491 : ! only alpha spin is kept for restricted
492 12 : IF (dft_control%restricted) EXIT
493 : END DO
494 4 : IF (dft_control%restricted) CALL mo_set_restrict(mo_array)
495 :
496 8 : DO ispin = 1, nspin
497 : CALL set_mo_occupation(mo_set=mo_array(ispin), &
498 8 : smear=qs_env%scf_control%smear)
499 : END DO
500 :
501 8 : DO ispin = 1, nspin
502 4 : IF (scf_control%use_ot .OR. scf_env%method == ot_diag_method_nr) THEN !fm->dbcsr
503 : CALL copy_fm_to_dbcsr(mo_array(ispin)%mo_coeff, &
504 4 : mo_array(ispin)%mo_coeff_b) !fm->dbcsr
505 : END IF !fm->dbcsr
506 8 : CALL calculate_density_matrix(mo_array(ispin), p_rmpv(ispin)%matrix)
507 : END DO
508 :
509 : ! Write to extrapolation pipeline
510 6 : CALL wfi_update(wf_history=qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
511 : END DO
512 : END IF
513 :
514 : did_guess = .TRUE.
515 : END IF
516 :
517 6117 : IF (density_guess == random_guess) THEN
518 :
519 52 : DO ispin = 1, nspin
520 : CALL get_mo_set(mo_set=mo_array(ispin), &
521 30 : mo_coeff=mo_coeff, nmo=nmo)
522 30 : CALL cp_fm_init_random(mo_coeff, nmo)
523 30 : IF (has_unit_metric) THEN
524 2 : CALL make_basis_simple(mo_coeff, nmo)
525 : ELSE
526 28 : CALL make_basis_sm(mo_coeff, nmo, s_sparse(1)%matrix)
527 : END IF
528 : ! only alpha spin is kept for restricted
529 82 : IF (dft_control%restricted) EXIT
530 : END DO
531 22 : IF (dft_control%restricted) CALL mo_set_restrict(mo_array)
532 :
533 52 : DO ispin = 1, nspin
534 : CALL set_mo_occupation(mo_set=mo_array(ispin), &
535 52 : smear=qs_env%scf_control%smear)
536 : END DO
537 :
538 52 : DO ispin = 1, nspin
539 :
540 30 : IF (scf_control%use_ot .OR. scf_env%method == ot_diag_method_nr) THEN !fm->dbcsr
541 : CALL copy_fm_to_dbcsr(mo_array(ispin)%mo_coeff, &
542 22 : mo_array(ispin)%mo_coeff_b) !fm->dbcsr
543 : END IF !fm->dbcsr
544 :
545 52 : CALL calculate_density_matrix(mo_array(ispin), p_rmpv(ispin)%matrix)
546 : END DO
547 :
548 : did_guess = .TRUE.
549 : END IF
550 :
551 6117 : IF (density_guess == core_guess) THEN
552 :
553 158 : IF (do_kpoints) THEN
554 0 : CPABORT("calculate_first_density_matrix: core_guess not implemented for k-points")
555 : END IF
556 :
557 158 : owns_ortho = .FALSE.
558 158 : IF (.NOT. ASSOCIATED(work1)) THEN
559 42 : need_wm = .TRUE.
560 42 : CPASSERT(.NOT. ASSOCIATED(work2))
561 42 : CPASSERT(.NOT. ASSOCIATED(ortho))
562 : ELSE
563 116 : need_wm = .FALSE.
564 116 : CPASSERT(ASSOCIATED(work2))
565 116 : IF (.NOT. ASSOCIATED(ortho)) THEN
566 6 : ALLOCATE (ortho)
567 6 : owns_ortho = .TRUE.
568 : END IF
569 : END IF
570 :
571 158 : IF (need_wm) THEN
572 42 : CALL get_mo_set(mo_set=mo_array(1), mo_coeff=moa)
573 42 : CALL cp_fm_get_info(moa, matrix_struct=ao_mo_struct)
574 42 : CALL cp_fm_struct_get(ao_mo_struct, nrow_global=nao, nrow_block=nblocks)
575 : CALL cp_fm_struct_create(fmstruct=ao_ao_struct, &
576 : nrow_block=nblocks, &
577 : ncol_block=nblocks, &
578 : nrow_global=nao, &
579 : ncol_global=nao, &
580 42 : template_fmstruct=ao_mo_struct)
581 84 : ALLOCATE (work1(1))
582 42 : ALLOCATE (work2, ortho)
583 42 : CALL cp_fm_create(work1(1), ao_ao_struct)
584 42 : CALL cp_fm_create(work2, ao_ao_struct)
585 42 : CALL cp_fm_create(ortho, ao_ao_struct)
586 42 : CALL copy_dbcsr_to_fm(matrix_s_kp(1, 1)%matrix, ortho)
587 42 : CALL cp_fm_cholesky_decompose(ortho)
588 126 : CALL cp_fm_struct_release(ao_ao_struct)
589 : END IF
590 :
591 158 : ispin = 1
592 : ! Load core Hamiltonian into work matrix
593 158 : CALL copy_dbcsr_to_fm(h_core_sparse(1)%matrix, work1(ispin))
594 :
595 : ! Diagonalize the core Hamiltonian matrix and retrieve a first set of
596 : ! molecular orbitals (MOs)
597 158 : IF (has_unit_metric) THEN
598 : CALL eigensolver_simple(matrix_ks=work1(ispin), &
599 : mo_set=mo_array(ispin), &
600 : work=work2, &
601 : do_level_shift=.FALSE., &
602 : level_shift=0.0_dp, &
603 6 : use_jacobi=.FALSE., jacobi_threshold=0._dp)
604 : ELSE
605 : CALL eigensolver(matrix_ks_fm=work1(ispin), &
606 : mo_set=mo_array(ispin), &
607 : ortho=ortho, &
608 : work=work2, &
609 : cholesky_method=scf_env%cholesky_method, &
610 : do_level_shift=.FALSE., &
611 : level_shift=0.0_dp, &
612 152 : use_jacobi=.FALSE.)
613 : END IF
614 :
615 : ! Open shell case: copy alpha MOs to beta MOs
616 158 : IF (nspin == 2) THEN
617 22 : CALL get_mo_set(mo_set=mo_array(1), mo_coeff=moa)
618 22 : CALL get_mo_set(mo_set=mo_array(2), mo_coeff=mob, nmo=nmo)
619 22 : CALL cp_fm_to_fm(moa, mob, nmo)
620 : END IF
621 :
622 : ! Build an initial density matrix (for each spin in the case of
623 : ! an open shell calculation) from the first MOs set
624 338 : DO ispin = 1, nspin
625 180 : CALL set_mo_occupation(mo_set=mo_array(ispin), smear=scf_control%smear)
626 338 : CALL calculate_density_matrix(mo_array(ispin), p_rmpv(ispin)%matrix)
627 : END DO
628 :
629 : ! release intermediate matrices
630 158 : IF (need_wm) THEN
631 42 : CALL cp_fm_release(ortho)
632 42 : CALL cp_fm_release(work2)
633 42 : CALL cp_fm_release(work1(1))
634 42 : DEALLOCATE (ortho, work2)
635 42 : DEALLOCATE (work1)
636 42 : NULLIFY (work1, work2, ortho)
637 116 : ELSE IF (owns_ortho) THEN
638 6 : DEALLOCATE (ortho)
639 : END IF
640 :
641 : did_guess = .TRUE.
642 : END IF
643 :
644 6117 : IF (density_guess == atomic_guess) THEN
645 :
646 4331 : subsys_section => section_vals_get_subs_vals(input, "SUBSYS")
647 4331 : ounit = cp_print_key_unit_nr(logger, subsys_section, "PRINT%KINDS", extension=".Log")
648 4331 : IF (ounit > 0) THEN
649 : WRITE (UNIT=ounit, FMT="(/,(T2,A))") &
650 981 : "Atomic guess: The first density matrix is obtained in terms of atomic orbitals", &
651 1962 : " and electronic configurations assigned to each atomic kind"
652 : END IF
653 :
654 : CALL calculate_atomic_block_dm(p_rmpv, s_sparse(1)%matrix, atomic_kind_set, qs_kind_set, &
655 4331 : nspin, nelectron_spin, ounit, para_env)
656 :
657 9615 : DO ispin = 1, nspin
658 :
659 : ! The orbital transformation method (OT) requires not only an
660 : ! initial density matrix, but also an initial wavefunction (MO set)
661 9615 : IF (ofgpw .AND. (scf_control%use_ot .OR. scf_env%method == ot_diag_method_nr)) THEN
662 : ! get orbitals later
663 : ELSE
664 5284 : IF (need_mos) THEN
665 :
666 2066 : IF (dft_control%restricted .AND. (ispin == 2)) THEN
667 22 : CALL mo_set_restrict(mo_array)
668 : ELSE
669 : CALL get_mo_set(mo_set=mo_array(ispin), &
670 : mo_coeff=mo_coeff, &
671 2044 : nmo=nmo, nao=nao, homo=homo)
672 :
673 2044 : CALL cp_fm_set_all(mo_coeff, 0.0_dp)
674 2044 : CALL cp_fm_init_random(mo_coeff, nmo)
675 :
676 2044 : CALL cp_fm_create(sv, mo_coeff%matrix_struct, "SV")
677 : ! multiply times PS
678 2044 : IF (has_unit_metric) THEN
679 0 : CALL cp_fm_to_fm(mo_coeff, sv)
680 : ELSE
681 : ! PS*C(:,1:nomo)+C(:,nomo+1:nmo) (nomo=NINT(nelectron/maxocc))
682 2044 : CALL cp_dbcsr_sm_fm_multiply(s_sparse(1)%matrix, mo_coeff, sv, nmo)
683 : END IF
684 2044 : CALL cp_dbcsr_sm_fm_multiply(p_rmpv(ispin)%matrix, sv, mo_coeff, homo)
685 :
686 2044 : CALL cp_fm_release(sv)
687 : ! and ortho the result
688 2044 : IF (has_unit_metric) THEN
689 0 : CALL make_basis_simple(mo_coeff, nmo)
690 : ELSE
691 2044 : CALL make_basis_sm(mo_coeff, nmo, s_sparse(1)%matrix)
692 : END IF
693 : END IF
694 :
695 : CALL set_mo_occupation(mo_set=mo_array(ispin), &
696 2066 : smear=qs_env%scf_control%smear)
697 :
698 : CALL copy_fm_to_dbcsr(mo_array(ispin)%mo_coeff, &
699 2066 : mo_array(ispin)%mo_coeff_b) !fm->dbcsr
700 :
701 : CALL calculate_density_matrix(mo_array(ispin), &
702 2066 : p_rmpv(ispin)%matrix)
703 : END IF
704 : ! adjust el_density in case surface_dipole_correction is switched
705 : ! on and CORE_CORRECTION is non-zero
706 5284 : IF (scf_env%method == general_diag_method_nr) THEN
707 3458 : IF (dft_control%correct_surf_dip) THEN
708 8 : IF (ABS(tot_corr_zeff) > 0.0_dp) THEN
709 : CALL get_mo_set(mo_set=mo_array(ispin), &
710 : mo_coeff=mo_coeff, &
711 6 : nmo=nmo, nao=nao, homo=homo)
712 :
713 6 : CALL cp_fm_set_all(mo_coeff, 0.0_dp)
714 6 : CALL cp_fm_init_random(mo_coeff, nmo)
715 :
716 6 : CALL cp_fm_create(sv, mo_coeff%matrix_struct, "SV")
717 : ! multiply times PS
718 6 : IF (has_unit_metric) THEN
719 0 : CALL cp_fm_to_fm(mo_coeff, sv)
720 : ELSE
721 : ! PS*C(:,1:nomo)+C(:,nomo+1:nmo) (nomo=NINT(nelectron/maxocc))
722 6 : CALL cp_dbcsr_sm_fm_multiply(s_sparse(1)%matrix, mo_coeff, sv, nmo)
723 : END IF
724 6 : CALL cp_dbcsr_sm_fm_multiply(p_rmpv(ispin)%matrix, sv, mo_coeff, homo)
725 :
726 6 : CALL cp_fm_release(sv)
727 : ! and ortho the result
728 6 : IF (has_unit_metric) THEN
729 0 : CALL make_basis_simple(mo_coeff, nmo)
730 : ELSE
731 6 : CALL make_basis_sm(mo_coeff, nmo, s_sparse(1)%matrix)
732 : END IF
733 :
734 : CALL set_mo_occupation(mo_set=mo_array(ispin), smear=qs_env%scf_control%smear, &
735 6 : tot_zeff_corr=tot_corr_zeff)
736 :
737 : CALL calculate_density_matrix(mo_array(ispin), &
738 6 : p_rmpv(ispin)%matrix)
739 : END IF
740 : END IF
741 : END IF
742 :
743 : END IF
744 :
745 : END DO
746 :
747 4331 : IF (ofgpw .AND. (scf_control%use_ot .OR. scf_env%method == ot_diag_method_nr)) THEN
748 : ! We fit a function to the square root of the density
749 0 : CALL qs_rho_update_rho(rho, qs_env)
750 4331 : CPASSERT(1 == 0)
751 : ! CALL cp_fm_create(sv,mo_coeff%matrix_struct,"SV")
752 : ! DO ispin=1,nspin
753 : ! CALL integrate_ppl_rspace(qs%rho%rho_r(ispin),qs_env)
754 : ! CALL cp_cfm_solve(overlap,mos)
755 : ! CALL get_mo_set(mo_set=mo_array(ispin),&
756 : ! mo_coeff=mo_coeff, nmo=nmo, nao=nao)
757 : ! CALL cp_fm_init_random(mo_coeff,nmo)
758 : ! END DO
759 : ! CALL cp_fm_release(sv)
760 : END IF
761 :
762 4331 : IF (scf_control%diagonalization%mom) THEN
763 4 : CALL do_mom_guess(nspin, mo_array, scf_control, p_rmpv)
764 : END IF
765 :
766 : CALL cp_print_key_finished_output(ounit, logger, subsys_section, &
767 4331 : "PRINT%KINDS")
768 :
769 4331 : did_guess = .TRUE.
770 : END IF
771 :
772 6117 : IF (density_guess == sparse_guess) THEN
773 :
774 0 : IF (ofgpw) CPABORT("SPARSE_GUESS not implemented for OFGPW")
775 0 : IF (.NOT. scf_control%use_ot) CPABORT("OT needed!")
776 0 : IF (do_kpoints) THEN
777 0 : CPABORT("calculate_first_density_matrix: sparse_guess not implemented for k-points")
778 : END IF
779 :
780 0 : eps = 1.0E-5_dp
781 :
782 0 : ounit = cp_logger_get_default_io_unit(logger)
783 0 : natoms = SIZE(particle_set)
784 0 : ALLOCATE (kind_of(natoms))
785 0 : ALLOCATE (first_sgf(natoms), last_sgf(natoms))
786 :
787 0 : checksum = dbcsr_checksum(s_sparse(1)%matrix)
788 0 : i = dbcsr_get_num_blocks(s_sparse(1)%matrix); CALL para_env%sum(i)
789 0 : IF (ounit > 0) WRITE (ounit, *) 'S nblks', i, ' checksum', checksum
790 0 : CALL dbcsr_filter(s_sparse(1)%matrix, eps)
791 0 : checksum = dbcsr_checksum(s_sparse(1)%matrix)
792 0 : i = dbcsr_get_num_blocks(s_sparse(1)%matrix); CALL para_env%sum(i)
793 0 : IF (ounit > 0) WRITE (ounit, *) 'S nblks', i, ' checksum', checksum
794 :
795 : CALL get_particle_set(particle_set, qs_kind_set, first_sgf=first_sgf, &
796 0 : last_sgf=last_sgf)
797 0 : CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
798 :
799 0 : ALLOCATE (pmat(SIZE(atomic_kind_set)))
800 :
801 0 : rscale = 1._dp
802 0 : IF (nspin == 2) rscale = 0.5_dp
803 0 : DO ikind = 1, SIZE(atomic_kind_set)
804 0 : atomic_kind => atomic_kind_set(ikind)
805 0 : qs_kind => qs_kind_set(ikind)
806 0 : NULLIFY (pmat(ikind)%mat)
807 0 : CALL calculate_atomic_orbitals(atomic_kind, qs_kind, pmat=pmat(ikind)%mat)
808 0 : NULLIFY (atomic_kind)
809 : END DO
810 :
811 0 : DO ispin = 1, nspin
812 : CALL get_mo_set(mo_set=mo_array(ispin), &
813 : maxocc=maxocc, &
814 0 : nelectron=nelectron)
815 : !
816 0 : CALL dbcsr_iterator_start(iter, p_rmpv(ispin)%matrix)
817 0 : DO WHILE (dbcsr_iterator_blocks_left(iter))
818 0 : CALL dbcsr_iterator_next_block(iter, irow, icol, pdata, blk)
819 0 : ikind = kind_of(irow)
820 0 : IF (icol .EQ. irow) THEN
821 0 : IF (ispin == 1) THEN
822 : pdata(:, :) = pmat(ikind)%mat(:, :, 1)*rscale + &
823 0 : pmat(ikind)%mat(:, :, 2)*rscale
824 : ELSE
825 : pdata(:, :) = pmat(ikind)%mat(:, :, 1)*rscale - &
826 0 : pmat(ikind)%mat(:, :, 2)*rscale
827 : END IF
828 : END IF
829 : END DO
830 0 : CALL dbcsr_iterator_stop(iter)
831 :
832 : !CALL dbcsr_verify_matrix(p_rmpv(ispin)%matrix)
833 0 : checksum = dbcsr_checksum(p_rmpv(ispin)%matrix)
834 0 : occ = dbcsr_get_occupation(p_rmpv(ispin)%matrix)
835 0 : IF (ounit > 0) WRITE (ounit, *) 'P_init occ', occ, ' checksum', checksum
836 : ! so far p needs to have the same sparsity as S
837 : !CALL dbcsr_filter(p_rmpv(ispin)%matrix, eps)
838 : !CALL dbcsr_verify_matrix(p_rmpv(ispin)%matrix)
839 0 : checksum = dbcsr_checksum(p_rmpv(ispin)%matrix)
840 0 : occ = dbcsr_get_occupation(p_rmpv(ispin)%matrix)
841 0 : IF (ounit > 0) WRITE (ounit, *) 'P_init occ', occ, ' checksum', checksum
842 :
843 0 : CALL dbcsr_dot(p_rmpv(ispin)%matrix, s_sparse(1)%matrix, trps1)
844 0 : rscale = REAL(nelectron, dp)/trps1
845 0 : CALL dbcsr_scale(p_rmpv(ispin)%matrix, rscale)
846 :
847 : !CALL dbcsr_verify_matrix(p_rmpv(ispin)%matrix)
848 0 : checksum = dbcsr_checksum(p_rmpv(ispin)%matrix)
849 0 : occ = dbcsr_get_occupation(p_rmpv(ispin)%matrix)
850 0 : IF (ounit > 0) WRITE (ounit, *) 'P occ', occ, ' checksum', checksum
851 : !
852 : ! The orbital transformation method (OT) requires not only an
853 : ! initial density matrix, but also an initial wavefunction (MO set)
854 0 : IF (dft_control%restricted .AND. (ispin == 2)) THEN
855 0 : CALL mo_set_restrict(mo_array)
856 : ELSE
857 : CALL get_mo_set(mo_set=mo_array(ispin), &
858 : mo_coeff=mo_coeff, &
859 0 : nmo=nmo, nao=nao, homo=homo)
860 0 : CALL cp_fm_set_all(mo_coeff, 0.0_dp)
861 :
862 0 : n = MAXVAL(last_sgf - first_sgf) + 1
863 0 : size_atomic_kind_set = SIZE(atomic_kind_set)
864 :
865 0 : ALLOCATE (buff(n, n), sort_kind(size_atomic_kind_set), &
866 0 : nelec_kind(size_atomic_kind_set))
867 : !
868 : ! sort kind vs nbr electron
869 0 : DO ikind = 1, size_atomic_kind_set
870 0 : atomic_kind => atomic_kind_set(ikind)
871 0 : qs_kind => qs_kind_set(ikind)
872 : CALL get_atomic_kind(atomic_kind=atomic_kind, &
873 : natom=natom, &
874 : atom_list=atom_list, &
875 0 : z=z)
876 : CALL get_qs_kind(qs_kind, nsgf=nsgf, elec_conf=elec_conf, &
877 0 : basis_set=orb_basis_set, zeff=zeff)
878 0 : nelec_kind(ikind) = SUM(elec_conf)
879 : END DO
880 0 : CALL sort(nelec_kind, size_atomic_kind_set, sort_kind)
881 : !
882 : ! a -very- naive sparse guess
883 0 : nmo_tmp = nmo
884 0 : natoms_tmp = natoms
885 0 : istart_col = 1
886 0 : iseed(1) = 4; iseed(2) = 3; iseed(3) = 2; iseed(4) = 1 ! set the seed for dlarnv
887 0 : DO i = 1, size_atomic_kind_set
888 0 : ikind = sort_kind(i)
889 0 : atomic_kind => atomic_kind_set(ikind)
890 : CALL get_atomic_kind(atomic_kind=atomic_kind, &
891 0 : natom=natom, atom_list=atom_list)
892 0 : DO iatom = 1, natom
893 : !
894 0 : atom_a = atom_list(iatom)
895 0 : istart_row = first_sgf(atom_a)
896 0 : n_rows = last_sgf(atom_a) - first_sgf(atom_a) + 1
897 : !
898 : ! compute the "potential" nbr of states for this atom
899 0 : n_cols = MAX(INT(REAL(nmo_tmp, dp)/REAL(natoms_tmp, dp)), 1)
900 0 : IF (n_cols .GT. n_rows) n_cols = n_rows
901 : !
902 0 : nmo_tmp = nmo_tmp - n_cols
903 0 : natoms_tmp = natoms_tmp - 1
904 0 : IF (nmo_tmp .LT. 0 .OR. natoms_tmp .LT. 0) THEN
905 0 : CPABORT("Wrong1!")
906 : END IF
907 0 : DO j = 1, n_cols
908 0 : CALL dlarnv(1, iseed, n_rows, buff(1, j))
909 : END DO
910 : CALL cp_fm_set_submatrix(mo_coeff, buff, istart_row, istart_col, &
911 0 : n_rows, n_cols)
912 0 : istart_col = istart_col + n_cols
913 : END DO
914 : END DO
915 :
916 0 : IF (istart_col .LE. nmo) THEN
917 0 : CPABORT("Wrong2!")
918 : END IF
919 :
920 0 : DEALLOCATE (buff, nelec_kind, sort_kind)
921 :
922 : IF (.FALSE.) THEN
923 : ALLOCATE (buff(nao, 1), buff2(nao, 1))
924 : DO i = 1, nmo
925 : CALL cp_fm_get_submatrix(mo_coeff, buff, 1, i, nao, 1)
926 : IF (SUM(buff**2) .LT. 1E-10_dp) THEN
927 : WRITE (*, *) 'wrong', i, SUM(buff**2)
928 : END IF
929 : length = SQRT(DOT_PRODUCT(buff(:, 1), buff(:, 1)))
930 : buff(:, :) = buff(:, :)/length
931 : DO j = i + 1, nmo
932 : CALL cp_fm_get_submatrix(mo_coeff, buff2, 1, j, nao, 1)
933 : length = SQRT(DOT_PRODUCT(buff2(:, 1), buff2(:, 1)))
934 : buff2(:, :) = buff2(:, :)/length
935 : IF (ABS(DOT_PRODUCT(buff(:, 1), buff2(:, 1)) - 1.0_dp) .LT. 1E-10_dp) THEN
936 : WRITE (*, *) 'wrong2', i, j, DOT_PRODUCT(buff(:, 1), buff2(:, 1))
937 : DO ikind = 1, nao
938 : IF (ABS(mo_coeff%local_data(ikind, i)) .GT. 1e-10_dp) THEN
939 : WRITE (*, *) 'c1', ikind, mo_coeff%local_data(ikind, i)
940 : END IF
941 : IF (ABS(mo_coeff%local_data(ikind, j)) .GT. 1e-10_dp) THEN
942 : WRITE (*, *) 'c2', ikind, mo_coeff%local_data(ikind, j)
943 : END IF
944 : END DO
945 : CPABORT("")
946 : END IF
947 : END DO
948 : END DO
949 : DEALLOCATE (buff, buff2)
950 :
951 : END IF
952 : !
953 0 : CALL cp_fm_to_dbcsr_row_template(mo_dbcsr, mo_coeff, s_sparse(1)%matrix)
954 : !CALL dbcsr_verify_matrix(mo_dbcsr)
955 0 : checksum = dbcsr_checksum(mo_dbcsr)
956 :
957 0 : occ = dbcsr_get_occupation(mo_dbcsr)
958 0 : IF (ounit > 0) WRITE (ounit, *) 'C occ', occ, ' checksum', checksum
959 0 : CALL dbcsr_filter(mo_dbcsr, eps)
960 : !CALL dbcsr_verify_matrix(mo_dbcsr)
961 0 : occ = dbcsr_get_occupation(mo_dbcsr)
962 0 : checksum = dbcsr_checksum(mo_dbcsr)
963 0 : IF (ounit > 0) WRITE (ounit, *) 'C occ', occ, ' checksum', checksum
964 : !
965 : ! multiply times PS
966 0 : IF (has_unit_metric) THEN
967 0 : CPABORT("has_unit_metric will be removed soon")
968 : END IF
969 : !
970 : ! S*C
971 0 : CALL dbcsr_copy(mo_tmp_dbcsr, mo_dbcsr, name="mo_tmp")
972 : CALL dbcsr_multiply("N", "N", 1.0_dp, s_sparse(1)%matrix, mo_dbcsr, &
973 : 0.0_dp, mo_tmp_dbcsr, &
974 0 : retain_sparsity=.TRUE.)
975 : !CALL dbcsr_verify_matrix(mo_tmp_dbcsr)
976 0 : checksum = dbcsr_checksum(mo_tmp_dbcsr)
977 0 : occ = dbcsr_get_occupation(mo_tmp_dbcsr)
978 0 : IF (ounit > 0) WRITE (ounit, *) 'S*C occ', occ, ' checksum', checksum
979 0 : CALL dbcsr_filter(mo_tmp_dbcsr, eps)
980 : !CALL dbcsr_verify_matrix(mo_tmp_dbcsr)
981 0 : checksum = dbcsr_checksum(mo_tmp_dbcsr)
982 0 : occ = dbcsr_get_occupation(mo_tmp_dbcsr)
983 0 : IF (ounit > 0) WRITE (ounit, *) 'S*C occ', occ, ' checksum', checksum
984 : !
985 : ! P*SC
986 : ! the destroy is needed for the moment to avoid memory leaks !
987 : ! This one is not needed because _destroy takes care of zeroing.
988 : CALL dbcsr_multiply("N", "N", 1.0_dp, p_rmpv(ispin)%matrix, &
989 0 : mo_tmp_dbcsr, 0.0_dp, mo_dbcsr)
990 : IF (.FALSE.) CALL dbcsr_verify_matrix(mo_dbcsr)
991 0 : checksum = dbcsr_checksum(mo_dbcsr)
992 0 : occ = dbcsr_get_occupation(mo_dbcsr)
993 0 : IF (ounit > 0) WRITE (ounit, *) 'P*SC occ', occ, ' checksum', checksum
994 0 : CALL dbcsr_filter(mo_dbcsr, eps)
995 : !CALL dbcsr_verify_matrix(mo_dbcsr)
996 0 : checksum = dbcsr_checksum(mo_dbcsr)
997 0 : occ = dbcsr_get_occupation(mo_dbcsr)
998 0 : IF (ounit > 0) WRITE (ounit, *) 'P*SC occ', occ, ' checksum', checksum
999 : !
1000 0 : CALL copy_dbcsr_to_fm(mo_dbcsr, mo_coeff)
1001 :
1002 0 : CALL dbcsr_release(mo_dbcsr)
1003 0 : CALL dbcsr_release(mo_tmp_dbcsr)
1004 :
1005 : ! and ortho the result
1006 0 : CALL make_basis_sm(mo_coeff, nmo, s_sparse(1)%matrix)
1007 : END IF
1008 :
1009 : CALL set_mo_occupation(mo_set=mo_array(ispin), &
1010 0 : smear=qs_env%scf_control%smear)
1011 :
1012 : CALL copy_fm_to_dbcsr(mo_array(ispin)%mo_coeff, &
1013 0 : mo_array(ispin)%mo_coeff_b) !fm->dbcsr
1014 :
1015 : CALL calculate_density_matrix(mo_array(ispin), &
1016 0 : p_rmpv(ispin)%matrix)
1017 0 : DO ikind = 1, SIZE(atomic_kind_set)
1018 0 : IF (ASSOCIATED(pmat(ikind)%mat)) THEN
1019 0 : DEALLOCATE (pmat(ikind)%mat)
1020 : END IF
1021 : END DO
1022 : END DO
1023 :
1024 0 : DEALLOCATE (pmat)
1025 :
1026 0 : DEALLOCATE (kind_of)
1027 :
1028 0 : DEALLOCATE (first_sgf, last_sgf)
1029 :
1030 0 : did_guess = .TRUE.
1031 : END IF
1032 6117 : IF (density_guess == mopac_guess) THEN
1033 :
1034 : CALL calculate_mopac_dm(p_rmpv, s_sparse(1)%matrix, has_unit_metric, dft_control, &
1035 826 : particle_set, atomic_kind_set, qs_kind_set, nspin, nelectron_spin, para_env)
1036 :
1037 1722 : DO ispin = 1, nspin
1038 : ! The orbital transformation method (OT) requires not only an
1039 : ! initial density matrix, but also an initial wavefunction (MO set)
1040 1722 : IF (need_mos) THEN
1041 224 : IF (dft_control%restricted .AND. (ispin == 2)) THEN
1042 2 : CALL mo_set_restrict(mo_array)
1043 : ELSE
1044 : CALL get_mo_set(mo_set=mo_array(ispin), &
1045 : mo_coeff=mo_coeff, &
1046 222 : nmo=nmo, homo=homo)
1047 222 : CALL cp_fm_init_random(mo_coeff, nmo)
1048 222 : CALL cp_fm_create(sv, mo_coeff%matrix_struct, "SV")
1049 : ! multiply times PS
1050 222 : IF (has_unit_metric) THEN
1051 178 : CALL cp_fm_to_fm(mo_coeff, sv)
1052 : ELSE
1053 44 : CALL cp_dbcsr_sm_fm_multiply(s_sparse(1)%matrix, mo_coeff, sv, nmo)
1054 : END IF
1055 : ! here we could easily multiply with the diag that we actually have replicated already
1056 222 : CALL cp_dbcsr_sm_fm_multiply(p_rmpv(ispin)%matrix, sv, mo_coeff, homo)
1057 222 : CALL cp_fm_release(sv)
1058 : ! and ortho the result
1059 222 : IF (has_unit_metric) THEN
1060 178 : CALL make_basis_simple(mo_coeff, nmo)
1061 : ELSE
1062 44 : CALL make_basis_sm(mo_coeff, nmo, s_sparse(1)%matrix)
1063 : END IF
1064 : END IF
1065 :
1066 : CALL set_mo_occupation(mo_set=mo_array(ispin), &
1067 224 : smear=qs_env%scf_control%smear)
1068 : CALL copy_fm_to_dbcsr(mo_array(ispin)%mo_coeff, &
1069 224 : mo_array(ispin)%mo_coeff_b)
1070 :
1071 : CALL calculate_density_matrix(mo_array(ispin), &
1072 224 : p_rmpv(ispin)%matrix)
1073 : END IF
1074 : END DO
1075 :
1076 : did_guess = .TRUE.
1077 : END IF
1078 : ! switch_surf_dip [SGh]
1079 6117 : IF (dft_control%switch_surf_dip) THEN
1080 4 : DO ispin = 1, nspin
1081 : CALL reassign_allocated_mos(mos_last_converged(ispin), &
1082 4 : mo_array(ispin))
1083 : END DO
1084 : END IF
1085 :
1086 6117 : IF (density_guess == no_guess) THEN
1087 : did_guess = .TRUE.
1088 : END IF
1089 :
1090 5817 : IF (.NOT. did_guess) THEN
1091 0 : CPABORT("An invalid keyword for the initial density guess was specified")
1092 : END IF
1093 :
1094 6117 : CALL timestop(handle)
1095 :
1096 12234 : END SUBROUTINE calculate_first_density_matrix
1097 :
1098 : ! **************************************************************************************************
1099 : !> \brief returns a block diagonal fock matrix.
1100 : !> \param matrix_f ...
1101 : !> \param atomic_kind_set ...
1102 : !> \param qs_kind_set ...
1103 : !> \param ounit ...
1104 : ! **************************************************************************************************
1105 96 : SUBROUTINE calculate_atomic_fock_matrix(matrix_f, atomic_kind_set, qs_kind_set, ounit)
1106 : TYPE(dbcsr_type), INTENT(INOUT) :: matrix_f
1107 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1108 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1109 : INTEGER, INTENT(IN) :: ounit
1110 :
1111 : CHARACTER(LEN=*), PARAMETER :: routineN = 'calculate_atomic_fock_matrix'
1112 :
1113 : INTEGER :: handle, icol, ikind, irow
1114 96 : INTEGER, ALLOCATABLE, DIMENSION(:) :: kind_of
1115 96 : REAL(dp), DIMENSION(:, :), POINTER :: block
1116 96 : TYPE(atom_matrix_type), ALLOCATABLE, DIMENSION(:) :: fmat
1117 : TYPE(atomic_kind_type), POINTER :: atomic_kind
1118 : TYPE(dbcsr_iterator_type) :: iter
1119 : TYPE(qs_kind_type), POINTER :: qs_kind
1120 :
1121 96 : CALL timeset(routineN, handle)
1122 :
1123 96 : CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
1124 422 : ALLOCATE (fmat(SIZE(atomic_kind_set)))
1125 :
1126 : ! precompute the atomic blocks for each atomic-kind
1127 230 : DO ikind = 1, SIZE(atomic_kind_set)
1128 134 : atomic_kind => atomic_kind_set(ikind)
1129 134 : qs_kind => qs_kind_set(ikind)
1130 134 : NULLIFY (fmat(ikind)%mat)
1131 134 : IF (ounit > 0) WRITE (UNIT=ounit, FMT="(/,T2,A)") &
1132 67 : "Calculating atomic Fock matrix for atomic kind: "//TRIM(atomic_kind%name)
1133 :
1134 : !Currently only ispin=1 is supported
1135 : CALL calculate_atomic_orbitals(atomic_kind, qs_kind, iunit=ounit, &
1136 230 : fmat=fmat(ikind)%mat)
1137 : END DO
1138 :
1139 : ! zero result matrix
1140 96 : CALL dbcsr_set(matrix_f, 0.0_dp)
1141 :
1142 : ! copy precomputed blocks onto diagonal of result matrix
1143 96 : CALL dbcsr_iterator_start(iter, matrix_f)
1144 209 : DO WHILE (dbcsr_iterator_blocks_left(iter))
1145 113 : CALL dbcsr_iterator_next_block(iter, irow, icol, block)
1146 113 : ikind = kind_of(irow)
1147 6445 : IF (icol .EQ. irow) block(:, :) = fmat(ikind)%mat(:, :, 1)
1148 : END DO
1149 96 : CALL dbcsr_iterator_stop(iter)
1150 :
1151 : ! cleanup
1152 230 : DO ikind = 1, SIZE(atomic_kind_set)
1153 230 : DEALLOCATE (fmat(ikind)%mat)
1154 : END DO
1155 96 : DEALLOCATE (fmat)
1156 :
1157 96 : CALL timestop(handle)
1158 :
1159 288 : END SUBROUTINE calculate_atomic_fock_matrix
1160 :
1161 : ! **************************************************************************************************
1162 : !> \brief returns a block diagonal density matrix. Blocks correspond to the mopac initial guess.
1163 : !> \param pmat ...
1164 : !> \param matrix_s ...
1165 : !> \param has_unit_metric ...
1166 : !> \param dft_control ...
1167 : !> \param particle_set ...
1168 : !> \param atomic_kind_set ...
1169 : !> \param qs_kind_set ...
1170 : !> \param nspin ...
1171 : !> \param nelectron_spin ...
1172 : !> \param para_env ...
1173 : ! **************************************************************************************************
1174 902 : SUBROUTINE calculate_mopac_dm(pmat, matrix_s, has_unit_metric, &
1175 : dft_control, particle_set, atomic_kind_set, qs_kind_set, &
1176 902 : nspin, nelectron_spin, para_env)
1177 : TYPE(dbcsr_p_type), DIMENSION(:), INTENT(INOUT) :: pmat
1178 : TYPE(dbcsr_type), INTENT(INOUT) :: matrix_s
1179 : LOGICAL :: has_unit_metric
1180 : TYPE(dft_control_type), POINTER :: dft_control
1181 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1182 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1183 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1184 : INTEGER, INTENT(IN) :: nspin
1185 : INTEGER, DIMENSION(:), INTENT(IN) :: nelectron_spin
1186 : TYPE(mp_para_env_type) :: para_env
1187 :
1188 : CHARACTER(LEN=*), PARAMETER :: routineN = 'calculate_mopac_dm'
1189 :
1190 : INTEGER :: atom_a, handle, iatom, ikind, iset, &
1191 : isgf, isgfa, ishell, ispin, la, maxl, &
1192 : maxll, na, nao, natom, ncount, nset, &
1193 : nsgf, z
1194 : INTEGER, ALLOCATABLE, DIMENSION(:) :: first_sgf
1195 : INTEGER, DIMENSION(25) :: laox, naox
1196 : INTEGER, DIMENSION(5) :: occupation
1197 902 : INTEGER, DIMENSION(:), POINTER :: atom_list, elec_conf, nshell
1198 902 : INTEGER, DIMENSION(:, :), POINTER :: first_sgfa, l, last_sgfa
1199 : LOGICAL :: has_pot
1200 : REAL(KIND=dp) :: maxocc, my_sum, nelec, occ, paa, rscale, &
1201 : trps1, trps2, yy, zeff
1202 902 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: econf, pdiag, sdiag
1203 : REAL(KIND=dp), DIMENSION(0:3) :: edftb
1204 : TYPE(all_potential_type), POINTER :: all_potential
1205 : TYPE(dbcsr_type), POINTER :: matrix_p
1206 : TYPE(gth_potential_type), POINTER :: gth_potential
1207 : TYPE(gto_basis_set_type), POINTER :: orb_basis_set
1208 : TYPE(sgp_potential_type), POINTER :: sgp_potential
1209 : TYPE(xtb_atom_type), POINTER :: xtb_kind
1210 :
1211 902 : CALL timeset(routineN, handle)
1212 :
1213 1874 : DO ispin = 1, nspin
1214 972 : matrix_p => pmat(ispin)%matrix
1215 1874 : CALL dbcsr_set(matrix_p, 0.0_dp)
1216 : END DO
1217 :
1218 902 : natom = SIZE(particle_set)
1219 902 : nao = dbcsr_nfullrows_total(pmat(1)%matrix)
1220 902 : IF (nspin == 1) THEN
1221 : maxocc = 2.0_dp
1222 : ELSE
1223 70 : maxocc = 1.0_dp
1224 : END IF
1225 :
1226 2706 : ALLOCATE (first_sgf(natom))
1227 :
1228 902 : CALL get_particle_set(particle_set, qs_kind_set, first_sgf=first_sgf)
1229 902 : CALL get_qs_kind_set(qs_kind_set, maxlgto=maxl)
1230 :
1231 2706 : ALLOCATE (econf(0:maxl))
1232 :
1233 2706 : ALLOCATE (pdiag(nao))
1234 33714 : pdiag(:) = 0.0_dp
1235 :
1236 1804 : ALLOCATE (sdiag(nao))
1237 :
1238 33714 : sdiag(:) = 0.0_dp
1239 902 : IF (has_unit_metric) THEN
1240 12560 : sdiag(:) = 1.0_dp
1241 : ELSE
1242 540 : CALL dbcsr_get_diag(matrix_s, sdiag)
1243 540 : CALL para_env%sum(sdiag)
1244 : END IF
1245 :
1246 : ncount = 0
1247 33714 : trps1 = 0.0_dp
1248 33714 : trps2 = 0.0_dp
1249 33714 : pdiag(:) = 0.0_dp
1250 :
1251 2706 : IF (SUM(nelectron_spin) /= 0) THEN
1252 2974 : DO ikind = 1, SIZE(atomic_kind_set)
1253 :
1254 2086 : CALL get_atomic_kind(atomic_kind_set(ikind), natom=natom, atom_list=atom_list)
1255 : CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set, &
1256 : all_potential=all_potential, &
1257 : gth_potential=gth_potential, &
1258 2086 : sgp_potential=sgp_potential)
1259 2086 : has_pot = ASSOCIATED(all_potential) .OR. ASSOCIATED(gth_potential) .OR. ASSOCIATED(sgp_potential)
1260 :
1261 2086 : IF (dft_control%qs_control%dftb) THEN
1262 : CALL get_dftb_atom_param(qs_kind_set(ikind)%dftb_parameter, &
1263 588 : lmax=maxll, occupation=edftb)
1264 588 : maxll = MIN(maxll, maxl)
1265 1764 : econf(0:maxl) = edftb(0:maxl)
1266 1498 : ELSEIF (dft_control%qs_control%xtb) THEN
1267 462 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
1268 462 : CALL get_xtb_atom_param(xtb_kind, z=z, natorb=nsgf, nao=naox, lao=laox, occupation=occupation)
1269 1036 : ELSEIF (has_pot) THEN
1270 1036 : CALL get_atomic_kind(atomic_kind_set(ikind), z=z)
1271 1036 : CALL get_qs_kind(qs_kind_set(ikind), nsgf=nsgf, elec_conf=elec_conf, zeff=zeff)
1272 1036 : maxll = MIN(SIZE(elec_conf) - 1, maxl)
1273 3324 : econf(:) = 0.0_dp
1274 3262 : econf(0:maxll) = 0.5_dp*maxocc*REAL(elec_conf(0:maxll), dp)
1275 : ELSE
1276 : CYCLE
1277 : END IF
1278 :
1279 : ! MOPAC TYPE GUESS
1280 5060 : IF (dft_control%qs_control%dftb) THEN
1281 4038 : DO iatom = 1, natom
1282 3450 : atom_a = atom_list(iatom)
1283 3450 : isgfa = first_sgf(atom_a)
1284 8738 : DO la = 0, maxll
1285 3450 : SELECT CASE (la)
1286 : CASE (0)
1287 3450 : pdiag(isgfa) = econf(0)
1288 : CASE (1)
1289 1250 : pdiag(isgfa + 1) = econf(1)/3._dp
1290 1250 : pdiag(isgfa + 2) = econf(1)/3._dp
1291 1250 : pdiag(isgfa + 3) = econf(1)/3._dp
1292 : CASE (2)
1293 0 : pdiag(isgfa + 4) = econf(2)/5._dp
1294 0 : pdiag(isgfa + 5) = econf(2)/5._dp
1295 0 : pdiag(isgfa + 6) = econf(2)/5._dp
1296 0 : pdiag(isgfa + 7) = econf(2)/5._dp
1297 0 : pdiag(isgfa + 8) = econf(2)/5._dp
1298 : CASE (3)
1299 0 : pdiag(isgfa + 9) = econf(3)/7._dp
1300 0 : pdiag(isgfa + 10) = econf(3)/7._dp
1301 0 : pdiag(isgfa + 11) = econf(3)/7._dp
1302 0 : pdiag(isgfa + 12) = econf(3)/7._dp
1303 0 : pdiag(isgfa + 13) = econf(3)/7._dp
1304 0 : pdiag(isgfa + 14) = econf(3)/7._dp
1305 0 : pdiag(isgfa + 15) = econf(3)/7._dp
1306 : CASE DEFAULT
1307 4700 : CPABORT("")
1308 : END SELECT
1309 : END DO
1310 : END DO
1311 1498 : ELSEIF (dft_control%qs_control%xtb) THEN
1312 2930 : DO iatom = 1, natom
1313 2468 : atom_a = atom_list(iatom)
1314 2468 : isgfa = first_sgf(atom_a)
1315 2930 : IF (z == 1 .AND. nsgf == 2) THEN
1316 : ! Hydrogen 2s basis
1317 1450 : pdiag(isgfa) = 1.0_dp
1318 1450 : pdiag(isgfa + 1) = 0.0_dp
1319 : ELSE
1320 6152 : DO isgf = 1, nsgf
1321 5134 : na = naox(isgf)
1322 5134 : la = laox(isgf)
1323 5134 : occ = REAL(occupation(la + 1), dp)/REAL(2*la + 1, dp)
1324 6152 : pdiag(isgfa + isgf - 1) = occ
1325 : END DO
1326 : END IF
1327 : END DO
1328 1036 : ELSEIF (dft_control%qs_control%semi_empirical) THEN
1329 962 : yy = REAL(dft_control%charge, KIND=dp)/REAL(nao, KIND=dp)
1330 5482 : DO iatom = 1, natom
1331 4520 : atom_a = atom_list(iatom)
1332 4520 : isgfa = first_sgf(atom_a)
1333 962 : SELECT CASE (nsgf)
1334 : CASE (1) ! s-basis
1335 2188 : pdiag(isgfa) = (zeff - yy)*0.5_dp*maxocc
1336 : CASE (4) ! sp-basis
1337 2206 : IF (z == 1) THEN
1338 : ! special case: hydrogen with sp basis
1339 136 : pdiag(isgfa) = (zeff - yy)*0.5_dp*maxocc
1340 136 : pdiag(isgfa + 1) = 0._dp
1341 136 : pdiag(isgfa + 2) = 0._dp
1342 136 : pdiag(isgfa + 3) = 0._dp
1343 : ELSE
1344 2070 : pdiag(isgfa) = (zeff*0.25_dp - yy)*0.5_dp*maxocc
1345 2070 : pdiag(isgfa + 1) = (zeff*0.25_dp - yy)*0.5_dp*maxocc
1346 2070 : pdiag(isgfa + 2) = (zeff*0.25_dp - yy)*0.5_dp*maxocc
1347 2070 : pdiag(isgfa + 3) = (zeff*0.25_dp - yy)*0.5_dp*maxocc
1348 : END IF
1349 : CASE (9) ! spd-basis
1350 126 : IF (z < 21 .OR. z > 30 .AND. z < 39 .OR. z > 48 .AND. z < 57) THEN
1351 : ! Main Group Element: The "d" shell is formally empty.
1352 92 : pdiag(isgfa) = (zeff*0.25_dp - yy)*0.5_dp*maxocc
1353 92 : pdiag(isgfa + 1) = (zeff*0.25_dp - yy)*0.5_dp*maxocc
1354 92 : pdiag(isgfa + 2) = (zeff*0.25_dp - yy)*0.5_dp*maxocc
1355 92 : pdiag(isgfa + 3) = (zeff*0.25_dp - yy)*0.5_dp*maxocc
1356 92 : pdiag(isgfa + 4) = (-yy)*0.5_dp*maxocc
1357 92 : pdiag(isgfa + 5) = (-yy)*0.5_dp*maxocc
1358 92 : pdiag(isgfa + 6) = (-yy)*0.5_dp*maxocc
1359 92 : pdiag(isgfa + 7) = (-yy)*0.5_dp*maxocc
1360 92 : pdiag(isgfa + 8) = (-yy)*0.5_dp*maxocc
1361 34 : ELSE IF (z < 99) THEN
1362 34 : my_sum = zeff - 9.0_dp*yy
1363 : ! First, put 2 electrons in the 's' shell
1364 34 : pdiag(isgfa) = (MAX(0.0_dp, MIN(my_sum, 2.0_dp)))*0.5_dp*maxocc
1365 34 : my_sum = my_sum - 2.0_dp
1366 34 : IF (my_sum > 0.0_dp) THEN
1367 : ! Now put as many electrons as possible into the 'd' shell
1368 30 : pdiag(isgfa + 4) = (MAX(0.0_dp, MIN(my_sum*0.2_dp, 2.0_dp)))*0.5_dp*maxocc
1369 30 : pdiag(isgfa + 5) = (MAX(0.0_dp, MIN(my_sum*0.2_dp, 2.0_dp)))*0.5_dp*maxocc
1370 30 : pdiag(isgfa + 6) = (MAX(0.0_dp, MIN(my_sum*0.2_dp, 2.0_dp)))*0.5_dp*maxocc
1371 30 : pdiag(isgfa + 7) = (MAX(0.0_dp, MIN(my_sum*0.2_dp, 2.0_dp)))*0.5_dp*maxocc
1372 30 : pdiag(isgfa + 8) = (MAX(0.0_dp, MIN(my_sum*0.2_dp, 2.0_dp)))*0.5_dp*maxocc
1373 30 : my_sum = MAX(0.0_dp, my_sum - 10.0_dp)
1374 : ! Put the remaining electrons in the 'p' shell
1375 30 : pdiag(isgfa + 1) = (my_sum/3.0_dp)*0.5_dp*maxocc
1376 30 : pdiag(isgfa + 2) = (my_sum/3.0_dp)*0.5_dp*maxocc
1377 30 : pdiag(isgfa + 3) = (my_sum/3.0_dp)*0.5_dp*maxocc
1378 : END IF
1379 : END IF
1380 : CASE DEFAULT
1381 4520 : CPABORT("")
1382 : END SELECT
1383 : END DO
1384 : ELSE
1385 : CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
1386 : nset=nset, &
1387 : nshell=nshell, &
1388 : l=l, &
1389 : first_sgf=first_sgfa, &
1390 74 : last_sgf=last_sgfa)
1391 :
1392 202 : DO iset = 1, nset
1393 504 : DO ishell = 1, nshell(iset)
1394 302 : la = l(ishell, iset)
1395 302 : nelec = maxocc*REAL(2*la + 1, dp)
1396 430 : IF (econf(la) > 0.0_dp) THEN
1397 140 : IF (econf(la) >= nelec) THEN
1398 66 : paa = maxocc
1399 66 : econf(la) = econf(la) - nelec
1400 : ELSE
1401 74 : paa = maxocc*econf(la)/nelec
1402 74 : econf(la) = 0.0_dp
1403 : ncount = ncount + NINT(nelec/maxocc)
1404 : END IF
1405 412 : DO isgfa = first_sgfa(ishell, iset), last_sgfa(ishell, iset)
1406 2624 : DO iatom = 1, natom
1407 2212 : atom_a = atom_list(iatom)
1408 2212 : isgf = first_sgf(atom_a) + isgfa - 1
1409 2212 : pdiag(isgf) = paa
1410 2484 : IF (paa == maxocc) THEN
1411 550 : trps1 = trps1 + paa*sdiag(isgf)
1412 : ELSE
1413 1662 : trps2 = trps2 + paa*sdiag(isgf)
1414 : END IF
1415 : END DO
1416 : END DO
1417 : END IF
1418 : END DO ! ishell
1419 : END DO ! iset
1420 : END IF
1421 : END DO ! ikind
1422 :
1423 888 : IF (trps2 == 0.0_dp) THEN
1424 28212 : DO isgf = 1, nao
1425 28212 : IF (sdiag(isgf) > 0.0_dp) pdiag(isgf) = pdiag(isgf)/sdiag(isgf)
1426 : END DO
1427 1728 : DO ispin = 1, nspin
1428 1728 : IF (nelectron_spin(ispin) /= 0) THEN
1429 892 : matrix_p => pmat(ispin)%matrix
1430 892 : CALL dbcsr_set_diag(matrix_p, pdiag)
1431 : END IF
1432 : END DO
1433 : ELSE
1434 116 : DO ispin = 1, nspin
1435 116 : IF (nelectron_spin(ispin) /= 0) THEN
1436 60 : rscale = (REAL(nelectron_spin(ispin), dp) - trps1)/trps2
1437 5856 : DO isgf = 1, nao
1438 5856 : IF (pdiag(isgf) < maxocc) pdiag(isgf) = rscale*pdiag(isgf)
1439 : END DO
1440 60 : matrix_p => pmat(ispin)%matrix
1441 60 : CALL dbcsr_set_diag(matrix_p, pdiag)
1442 5856 : DO isgf = 1, nao
1443 5856 : IF (pdiag(isgf) < maxocc) pdiag(isgf) = pdiag(isgf)/rscale
1444 : END DO
1445 : END IF
1446 : END DO
1447 : END IF
1448 : END IF
1449 :
1450 902 : DEALLOCATE (econf)
1451 :
1452 902 : DEALLOCATE (first_sgf)
1453 :
1454 902 : DEALLOCATE (pdiag)
1455 :
1456 902 : DEALLOCATE (sdiag)
1457 :
1458 902 : CALL timestop(handle)
1459 :
1460 1804 : END SUBROUTINE calculate_mopac_dm
1461 :
1462 0 : END MODULE qs_initial_guess
|