9 USE ieee_arithmetic,
ONLY: ieee_positive_inf,&
25 LOGICAL :: curvature_valid, response_good, valid_response
26 REAL(kind=
dp) :: baseline_drop, damping_shift, infinity, &
28 measured_drop, not_a_number, predicted_drop, &
29 response_advantage, response_gain, response_quality, &
30 response_scale, response_weight, residual_ratio, &
31 secant_curvature, sy_damped, yy_damped
34 error stop
"Mermin Broyden did not restart a non-descent product history"
37 error stop
"Explicit Broyden history restart was ignored"
40 error stop
"Broyden history restarted for a descent direction"
43 error stop
"Orbital-only Broyden default behavior changed"
47 error stop
"Occupation-preconditioned CG retained unresolved free-energy history"
50 error stop
"Occupation-preconditioned CG discarded resolved free-energy history"
53 error stop
"Conventional CG history changed at an energy plateau"
56 32.0_dp*epsilon(1.0_dp)*1.0e6_dp, 1.0e6_dp))
THEN
57 error stop
"CG free-energy history restart is not scale aware"
61 IF (damping_shift /= 0.0_dp) error stop
"Well-conditioned L-BFGS curvature was damped"
64 IF (damping_shift <= 0.0_dp) error stop
"Weak L-BFGS curvature was not damped"
65 sy_damped = 0.1_dp + damping_shift
66 yy_damped = 1.0_dp + 2.0_dp*damping_shift*0.1_dp + damping_shift**2
67 IF (sy_damped <= 0.5_dp*sqrt(yy_damped))
THEN
68 error stop
"L-BFGS damping did not satisfy the relative-curvature bound"
72 IF (damping_shift <= 0.0_dp) error stop
"Negative L-BFGS curvature was not regularized"
75 error stop
"L-BFGS damping accepted a zero-length step"
79 error stop
"L-BFGS history restarted at the exact gradient-growth threshold"
82 error stop
"L-BFGS history did not restart above the gradient-growth threshold"
85 error stop
"L-BFGS gradient-growth restart is not scale invariant"
88 error stop
"L-BFGS history restarted without a valid preceding gradient"
92 error stop
"L-BFGS step restarted at the exact line-search collapse threshold"
95 error stop
"L-BFGS step did not restart below the line-search collapse threshold"
98 error stop
"L-BFGS step restart does not use the accepted-step magnitude"
101 error stop
"L-BFGS step restarted without a valid reference step"
105 1.0_dp, 4.0_dp, 2.0_dp, 9.0_dp, response_scale, response_weight, valid_response)
106 IF (.NOT. valid_response) error stop
"Valid L-BFGS response secant was rejected"
107 IF (abs(response_scale - 1.5_dp) > 1.0e-14_dp)
THEN
108 error stop
"L-BFGS response secant did not match the H0 direction norm"
110 IF (response_weight /= 1.0_dp) error stop
"Well-aligned L-BFGS response secant was damped"
113 0.01_dp, 4.0_dp, 2.0_dp, 9.0_dp, response_scale, response_weight, valid_response)
114 IF (.NOT. valid_response) error stop
"Dampable L-BFGS response secant was rejected"
115 mixed_curvature = response_weight*response_scale*0.01_dp + &
116 (1.0_dp - response_weight)*2.0_dp
117 IF (abs(mixed_curvature - 0.4_dp) > 1.0e-14_dp)
THEN
118 error stop
"L-BFGS response secant does not satisfy the Powell curvature bound"
120 IF (response_weight <= 0.0_dp .OR. response_weight >= 1.0_dp)
THEN
121 error stop
"Weak L-BFGS response secant was not convexly damped"
125 -1.0_dp, 4.0_dp, 2.0_dp, 9.0_dp, response_scale, response_weight, valid_response)
126 IF (valid_response) error stop
"Non-descent L-BFGS response secant was accepted"
127 IF (response_weight /= 0.0_dp) error stop
"Rejected L-BFGS response secant changed H0"
130 10.0_dp, 9.6_dp, 1.0_dp, 0.8_dp, 1.0_dp, 1.0_dp, 0.5_dp, 0.1_dp, &
131 predicted_drop, measured_drop, response_quality, residual_ratio, response_good)
132 IF (.NOT. response_good .OR. abs(predicted_drop - 0.375_dp) > 1.0e-14_dp .OR. &
133 abs(measured_drop - 0.4_dp) > 1.0e-14_dp .OR. &
134 abs(response_quality - 0.4_dp/0.375_dp) > 1.0e-14_dp .OR. &
135 abs(residual_ratio - 0.8_dp) > 1.0e-14_dp)
THEN
136 error stop
"Useful finite Mermin response sample was not accepted"
139 10.0_dp, 9.6_dp, 1.0_dp, 1.5_dp, 1.0_dp, 1.0_dp, 0.5_dp, 0.1_dp, &
140 predicted_drop, measured_drop, response_quality, residual_ratio, response_good)
141 IF (response_good) error stop
"Residual-growing finite response sample was accepted"
143 10.0_dp, 9.6_dp, 1.0_dp, 1.05_dp, 1.0_dp, 1.0_dp, 0.5_dp, 0.1_dp, &
144 predicted_drop, measured_drop, response_quality, residual_ratio, response_good)
145 IF (response_good) error stop
"Mildly residual-growing finite response sample was accepted"
147 10.0_dp, 9.6_dp, 1.0_dp, 0.8_dp, 0.1_dp, 10.0_dp, 1.0_dp, 0.1_dp, &
148 predicted_drop, measured_drop, response_quality, residual_ratio, response_good)
149 IF (response_good .OR. predicted_drop >= 0.0_dp)
THEN
150 error stop
"Indefinite non-descent response prediction was accepted"
153 10.0_dp, 9.6_dp, 1.0_dp, 0.8_dp, 1.0_dp, 1.0_dp, 1.0e-10_dp, 0.1_dp, &
154 predicted_drop, measured_drop, response_quality, residual_ratio, response_good)
155 IF (response_good) error stop
"Collapsed response line search was accepted"
158 secant_curvature, curvature_valid)
159 IF (.NOT. curvature_valid .OR. abs(secant_curvature - 0.8_dp) > 1.0e-14_dp)
THEN
160 error stop
"Accepted Mermin secant curvature was not recovered"
163 secant_curvature, curvature_valid)
164 IF (curvature_valid .OR. secant_curvature /= 0.0_dp)
THEN
165 error stop
"Collapsed Mermin secant produced a curvature"
169 10.0_dp, 9.6_dp, 1.0_dp, 0.8_dp, 1.0_dp, 1.0_dp, 0.5_dp, &
170 response_advantage, residual_ratio, response_good)
171 IF (.NOT. response_good .OR. response_advantage <= 0.0_dp .OR. &
172 abs(residual_ratio - 0.8_dp) > 1.0e-14_dp)
THEN
173 error stop
"Improved passive finite response prediction was not retained"
176 10.0_dp, 9.6_dp, 1.0_dp, 0.8_dp, 1.0_dp, -1.0_dp, 0.5_dp, &
177 response_advantage, residual_ratio, response_good)
178 IF (response_good .OR. response_advantage >= 0.0_dp)
THEN
179 error stop
"Worse passive finite response prediction was retained"
183 1.0_dp, 1.0_dp, 1.0_dp, 1.0_dp, 2.0_dp, 0.5_dp, &
184 baseline_drop, predicted_drop, response_gain, response_good)
185 IF (.NOT. response_good .OR. abs(baseline_drop - 0.25_dp) > 1.0e-14_dp .OR. &
186 abs(predicted_drop - 0.375_dp) > 1.0e-14_dp .OR. response_gain <= 0.0_dp)
THEN
187 error stop
"Better coupled Mermin candidate was not preferred"
190 1.0_dp, 1.0_dp, 3.0_dp, 1.0_dp, 2.0_dp, 0.5_dp, &
191 baseline_drop, predicted_drop, response_gain, response_good)
192 IF (response_good .OR. response_gain >= 0.0_dp)
THEN
193 error stop
"Worse coupled Mermin candidate was preferred"
196 4.0_dp, 4.0_dp, 4.0_dp, 4.0_dp, 8.0_dp, 0.5_dp, &
197 baseline_drop, predicted_drop, response_gain, response_good)
198 IF (.NOT. response_good .OR. abs(response_gain - 1.0_dp/3.0_dp) > 1.0e-14_dp)
THEN
199 error stop
"Coupled Mermin candidate comparison is not scale invariant"
202 1.0_dp, 1.0_dp, 1.0_dp, 0.0_dp, 2.0_dp, 0.5_dp, &
203 baseline_drop, predicted_drop, response_gain, response_good)
204 IF (response_good) error stop
"Coupled Mermin candidate ignored unresolved accepted curvature"
207 error stop
"Uncalibrated finite response probe was not scheduled"
210 error stop
"Finite response probe ignored passive accepted-step calibration"
213 error stop
"Uncalibrated finite response probe was scheduled too early"
216 error stop
"Calibrated finite response missed its one-step eligibility window"
219 error stop
"Calibrated finite response probe did not use the shorter interval"
222 error stop
"Finite response cooldown was ignored"
225 error stop
"Finite response was probed outside its local residual regime"
229 1.0_dp, 5, 3, 0, 6, .true.))
THEN
230 error stop
"Pending finite-response shadow was not completed"
233 5.0e-3_dp, 6, 2, 0, 0, .false.))
THEN
234 error stop
"Finite response was prepared outside its calibration residual regime"
237 3.0e-3_dp, 4, 2, 0, 0, .false.))
THEN
238 error stop
"Finite response did not prepare its initial shadow calibration"
241 1.0e-3_dp, 6, 3, 0, 0, .false.))
THEN
242 error stop
"Finite response did not seed the next sparse probe window"
245 1.0e-3_dp, 5, 3, 0, 0, .false.))
THEN
246 error stop
"Finite response was prepared between sparse probe windows"
249 1.0e-3_dp, 6, 3, 0, 2, .false.))
THEN
250 error stop
"Finite response preparation ignored an active cooldown"
254 error stop
"Finite response did not retain the probe-window seed shadow"
257 error stop
"Finite response did not retain the paired probe shadow"
260 error stop
"Finite response retained a shadow beyond its probe window"
263 error stop
"Finite response stopped before completing initial calibration"
267 error stop
"K-point REF refresh accepted insufficient history"
270 error stop
"K-point REF refresh accepted a line-search trial point"
273 error stop
"K-point REF refresh accepted a converged residual"
276 error stop
"K-point REF refresh accepted a residual outside the asymptotic window"
279 error stop
"K-point REF refresh rejected a mature asymptotic state"
282 error stop
"K-point REF refresh entered the exit window before a physical rebuild"
285 error stop
"K-point REF refresh rejected a mature exit-only state"
288 error stop
"K-point REF refresh rejected a stagnant post-rebuild tail"
291 error stop
"K-point REF refresh accepted a safely converged exit state"
298 error stop
"K-point REF refresh rejected a supported minimizer endpoint"
301 error stop
"K-point REF refresh counted a non-endpoint OT iteration"
304 infinity = ieee_value(0.0_dp, ieee_positive_inf)
305 not_a_number = ieee_value(0.0_dp, ieee_quiet_nan)
307 error stop
"L-BFGS history restarted for an infinite current gradient"
310 error stop
"L-BFGS history restarted for an infinite preceding gradient"
313 error stop
"L-BFGS history restarted for a NaN current gradient"
316 error stop
"L-BFGS history restarted for a NaN preceding gradient"
319 error stop
"L-BFGS step restarted for an infinite accepted step"
322 error stop
"L-BFGS step restarted for an infinite reference step"
325 error stop
"L-BFGS step restarted for a NaN accepted step"
328 error stop
"L-BFGS damping accepted NaN curvature"
331 not_a_number, 1.0_dp, 1.0_dp, 1.0_dp, response_scale, response_weight, valid_response)
332 IF (valid_response) error stop
"L-BFGS response secant accepted NaN curvature"
Defines the basic variable types.
integer, parameter, public dp
pure subroutine, public lbfgs_response_secant_parameters(g_dot_response, response_norm_sq, g_dot_h0_g, h0_g_norm_sq, response_scale, response_weight, valid)
Normalize and damp an occupation-response secant against the conventional H0 direction.
pure logical function, public ot_mermin_response_preparation_needed(residual, directions, shadow_good_samples, good_samples, cooldown, shadow_pending)
Decide whether the next accepted state needs the dense finite Mermin response.
pure logical function, public ot_mermin_response_probe(available, residual, directions, shadow_good_samples, good_samples, cooldown)
Select a sparse coupled-response probe from accepted-history evidence.
pure subroutine, public ot_mermin_response_assess(reference_energy, current_energy, reference_residual, current_residual, predicted_slope, predicted_curvature, position, default_step, predicted_drop, measured_drop, quality, residual_ratio, good)
Assess a finite-response candidate at its accepted Mermin endpoint.
pure logical function, public ot_mermin_response_shadow_followup(residual, directions, shadow_good_samples, good_samples, cooldown)
Decide whether a prepared conventional direction needs a shadow at its endpoint.
pure elemental logical function, public broyden_history_restart_required(non_descent, forget_history, do_ener)
Decide whether a non-descent Broyden step invalidates its secant history.
pure real(kind=dp) function, public lbfgs_curvature_damping_shift(sy, ss, yy, curvature_tol)
Returns the smallest shift y <- y + shift*s that meets relative L-BFGS curvature.
pure subroutine, public ot_mermin_response_candidate_preferred(baseline_slope, response_slope, response_curvature, accepted_slope, accepted_curvature, position, baseline_drop, response_drop, relative_gain, preferred)
Compare response and conventional directions in one accepted Mermin model.
pure logical function, public lbfgs_history_restart_required(current_gradient_norm_sq, previous_gradient_norm_sq)
Decides whether an L-BFGS history must be discarded after excessive gradient growth.
pure elemental logical function, public cg_history_restart_required(occupation_preconditioned, current_energy, reference_energy)
Decide whether an unresolved accepted energy change invalidates CG conjugacy.
pure subroutine, public ot_mermin_secant_curvature(reference_energy, current_energy, predicted_slope, position, curvature, valid)
Recover the total finite Mermin curvature of an accepted line-search secant.
pure subroutine, public ot_mermin_response_compare(reference_energy, current_energy, reference_residual, current_residual, predicted_slope, shadow_curvature, position, advantage, residual_ratio, good)
Compare an endpoint response shadow with the linear accepted-step model.
pure logical function, public lbfgs_step_restart_required(accepted_step, reference_step)
Decides whether L-BFGS must recover from a collapsed accepted line-search step.
Utility routines for qs_scf.
pure logical function, public qs_scf_kp_search_endpoint(method)
identify an accepted OT search endpoint from its iteration label
pure logical function, public qs_scf_kp_ref_refresh_ready(accepted_searches, residual, eps_scf, base_state, allow_exit_window)
decide whether a mature variable-occupation REF chart should be rebuilt
program qs_ot_minimizer_unittest