64 coeff, step_multiplier, dh)
66 INTEGER :: output_unit, nwork, pwork
67 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: coeff, step_multiplier, dh
69 CHARACTER(len=15) :: fmt_code
75 NULLIFY (scf_env, scf_control, dft_control)
77 cpassert(
ASSOCIATED(qs_env))
79 scf_control=scf_control, &
80 dft_control=dft_control)
82 IF (
SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) /= 1 .AND. &
83 SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) /=
SIZE(scf_env%outer_scf%variables, 1))
THEN
84 CALL cp_abort(__location__, &
85 cp_to_string(
SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step))// &
86 " values passed to keyword JACOBIAN_STEP, expected 1 or "// &
90 ALLOCATE (dh(
SIZE(scf_env%outer_scf%variables, 1)))
91 IF (
SIZE(dh) /=
SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step))
THEN
93 dh(ivar) = scf_control%outer_scf%cdft_opt_control%jacobian_step(1)
96 dh(:) = scf_control%outer_scf%cdft_opt_control%jacobian_step
99 SELECT CASE (scf_control%outer_scf%cdft_opt_control%jacobian_type)
101 CALL cp_abort(__location__, &
102 "Unknown Jacobian type: "// &
103 cp_to_string(scf_control%outer_scf%cdft_opt_control%jacobian_type))
108 ALLOCATE (coeff(nwork:pwork), step_multiplier(nwork:pwork))
109 coeff(nwork) = -1.0_dp
110 coeff(pwork) = 1.0_dp
111 step_multiplier = 1.0_dp
116 ALLOCATE (coeff(nwork:pwork), step_multiplier(nwork:pwork))
117 coeff(nwork) = -1.0_dp
118 coeff(pwork) = 1.0_dp
119 step_multiplier = -1.0_dp
124 ALLOCATE (coeff(nwork:pwork), step_multiplier(nwork:pwork))
128 step_multiplier(0) = 0.0_dp
129 step_multiplier(1) = 1.0_dp
130 step_multiplier(2) = 2.0_dp
136 ALLOCATE (coeff(nwork:pwork), step_multiplier(nwork:pwork))
140 step_multiplier(0) = 0.0_dp
141 step_multiplier(-1) = -1.0_dp
142 step_multiplier(-2) = -2.0_dp
148 ALLOCATE (coeff(nwork:pwork), step_multiplier(nwork:pwork))
150 coeff(nwork) = -1.0_dp
151 coeff(pwork) = 1.0_dp
152 step_multiplier(0) = 0.0_dp
153 step_multiplier(nwork) = -1.0_dp
154 step_multiplier(pwork) = 1.0_dp
158 IF (output_unit > 0)
THEN
159 WRITE (output_unit, fmt=
"(/,A)") &
160 " ================================== JACOBIAN CALCULATION ================================="
161 WRITE (output_unit, fmt=
"(A)") &
162 " Evaluating inverse Jacobian using finite differences"
163 WRITE (output_unit,
'(A,I10,A,I10)') &
164 " Energy evaluation: ", dft_control%qs_control%cdft_control%ienergy, &
165 ", CDFT SCF iteration: ", scf_env%outer_scf%iter_count
166 SELECT CASE (scf_control%outer_scf%cdft_opt_control%jacobian_type)
168 WRITE (output_unit,
'(A)')
" Type : First order forward difference"
170 WRITE (output_unit,
'(A)')
" Type : First order backward difference"
172 WRITE (output_unit,
'(A)')
" Type : Second order forward difference"
174 WRITE (output_unit,
'(A)')
" Type : Second order backward difference"
176 WRITE (output_unit,
'(A)')
" Type : First order central difference"
178 CALL cp_abort(__location__,
"Unknown Jacobian type: "// &
179 cp_to_string(scf_control%outer_scf%cdft_opt_control%jacobian_type))
181 IF (
SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) == 1)
THEN
182 WRITE (output_unit,
'(A,ES12.4)')
" Step size : ", scf_control%outer_scf%cdft_opt_control%jacobian_step
184 WRITE (output_unit,
'(A,ES12.4,A)') &
185 " Step sizes : ", scf_control%outer_scf%cdft_opt_control%jacobian_step(1),
' (constraint 1)'
186 IF (
SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) < 10)
THEN
187 fmt_code =
'(ES34.4,A,I2,A)'
189 fmt_code =
'(ES34.4,A,I3,A)'
191 DO ivar = 2,
SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step)
192 WRITE (output_unit, fmt_code) scf_control%outer_scf%cdft_opt_control%jacobian_step(ivar),
" (constraint", ivar,
")"
207 LOGICAL :: used_history
209 INTEGER :: i, ihistory, nvar, outer_scf_ihistory
210 LOGICAL :: use_md_history
211 REAL(kind=
dp) :: inv_error
212 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: jacobian
213 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient_history, inv_jacobian, &
218 NULLIFY (scf_control, scf_env)
221 scf_control=scf_control, &
222 outer_scf_ihistory=outer_scf_ihistory)
223 ihistory = scf_env%outer_scf%iter_count
225 IF (outer_scf_ihistory >= 3 .AND. .NOT. used_history)
THEN
227 CALL get_qs_env(qs_env, gradient_history=gradient_history, &
228 variable_history=variable_history)
229 nvar =
SIZE(scf_env%outer_scf%variables, 1)
230 use_md_history = .true.
233 IF (abs(variable_history(i, 2) - variable_history(i, 1)) < 1.0e-12_dp)
THEN
234 use_md_history = .false.
237 IF (use_md_history)
THEN
238 ALLOCATE (jacobian(nvar, nvar))
240 jacobian(i, i) = (gradient_history(i, 2) - gradient_history(i, 1))/ &
241 (variable_history(i, 2) - variable_history(i, 1))
243 IF (.NOT.
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
THEN
244 ALLOCATE (scf_env%outer_scf%inv_jacobian(nvar, nvar))
246 inv_jacobian => scf_env%outer_scf%inv_jacobian
248 DEALLOCATE (jacobian)
251 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
253 used_history = .true.
256 IF (ihistory >= 2 .AND. .NOT.
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
THEN
258 nvar =
SIZE(scf_env%outer_scf%variables, 1)
259 IF (
SIZE(scf_env%outer_scf%gradient, 2) < 3)
THEN
260 CALL cp_abort(__location__, &
261 "Keyword EXTRAPOLATION_ORDER in section OUTER_SCF must be greater than or equal "// &
262 "to 3 for optimizers that build the Jacobian from SCF history.")
264 ALLOCATE (jacobian(nvar, nvar))
266 jacobian(i, i) = (scf_env%outer_scf%gradient(i, ihistory) - scf_env%outer_scf%gradient(i, ihistory - 1))/ &
267 (scf_env%outer_scf%variables(i, ihistory) - scf_env%outer_scf%variables(i, ihistory - 1))
269 IF (.NOT.
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
THEN
270 ALLOCATE (scf_env%outer_scf%inv_jacobian(nvar, nvar))
272 inv_jacobian => scf_env%outer_scf%inv_jacobian
274 DEALLOCATE (jacobian)
275 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
405 should_build, used_history)
408 LOGICAL :: explicit_jacobian, should_build, &
411 cpassert(
ASSOCIATED(scf_control))
412 cpassert(
ASSOCIATED(scf_env))
414 SELECT CASE (scf_control%outer_scf%optimizer)
416 cpabort(
"Noncompatible optimizer requested.")
418 cpassert(
ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
419 scf_control%outer_scf%cdft_opt_control%build_jacobian = .true.
420 explicit_jacobian = .true.
422 cpassert(
ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
423 SELECT CASE (scf_control%outer_scf%cdft_opt_control%broyden_type)
425 scf_control%outer_scf%cdft_opt_control%build_jacobian = .true.
426 explicit_jacobian = .false.
428 scf_control%outer_scf%cdft_opt_control%build_jacobian = .true.
429 explicit_jacobian = .true.
432 IF (scf_control%outer_scf%cdft_opt_control%build_jacobian)
THEN
434 IF (scf_env%outer_scf%iter_count == 1) scf_control%outer_scf%cdft_opt_control%ijacobian(1) = 0
436 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
THEN
438 IF (scf_control%outer_scf%cdft_opt_control%ijacobian(2) >= &
439 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) .AND. .NOT. used_history .AND. &
440 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) > 0)
THEN
441 should_build = .true.
443 scf_control%outer_scf%cdft_opt_control%ijacobian(:) = 0
445 ELSE IF (scf_control%outer_scf%cdft_opt_control%ijacobian(1) >= &
446 scf_control%outer_scf%cdft_opt_control%jacobian_freq(1) .AND. &
447 scf_control%outer_scf%cdft_opt_control%jacobian_freq(1) > 0)
THEN
448 should_build = .true.
450 scf_control%outer_scf%cdft_opt_control%ijacobian(1) = 0
452 IF (should_build)
DEALLOCATE (scf_env%outer_scf%inv_jacobian)
454 should_build = .true.
456 scf_control%outer_scf%cdft_opt_control%ijacobian(:) = 0
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.