mirror of
https://github.com/QuantumPackage/qp2.git
synced 2024-12-26 05:13:30 +01:00
121 lines
3.7 KiB
Fortran
121 lines
3.7 KiB
Fortran
! Agreement with the model: Rho
|
|
|
|
! *Compute the ratio : rho = (prev_energy - energy) / (prev_energy - e_model)*
|
|
|
|
! Rho represents the agreement between the model (the predicted energy
|
|
! by the Taylor expansion truncated at the 2nd order) and the real
|
|
! energy :
|
|
|
|
! \begin{equation}
|
|
! \rho^{k+1} = \frac{E^{k} - E^{k+1}}{E^{k} - m^{k+1}}
|
|
! \end{equation}
|
|
! With :
|
|
! $E^{k}$ the energy at the previous iteration
|
|
! $E^{k+1}$ the energy at the actual iteration
|
|
! $m^{k+1}$ the predicted energy for the actual iteration
|
|
! (cf. trust_e_model)
|
|
|
|
! If $\rho \approx 1$, the agreement is good, contrary to $\rho \approx 0$.
|
|
! If $\rho \leq 0$ the previous energy is lower than the actual
|
|
! energy. We have to cancel the last step and use a smaller trust
|
|
! region.
|
|
! Here we cancel the last step if $\rho < 0.1$, because even if
|
|
! the energy decreases, the agreement is bad, i.e., the Taylor expansion
|
|
! truncated at the second order doesn't represent correctly the energy
|
|
! landscape. So it's better to cancel the step and restart with a
|
|
! smaller trust region.
|
|
|
|
! Provided in qp_edit:
|
|
! | thresh_rho |
|
|
|
|
! Input:
|
|
! | prev_energy | double precision | previous energy (energy before the rotation) |
|
|
! | e_model | double precision | predicted energy after the rotation |
|
|
|
|
! Output:
|
|
! | rho | double precision | the agreement between the model (predicted) and the real energy |
|
|
! | prev_energy | double precision | if rho >= 0.1 the actual energy becomes the previous energy |
|
|
! | | | else the previous energy doesn't change |
|
|
|
|
! Internal:
|
|
! | energy | double precision | energy (real) after the rotation |
|
|
! | i | integer | index |
|
|
! | t* | double precision | time |
|
|
|
|
|
|
subroutine trust_region_rho(prev_energy, energy,e_model,rho)
|
|
|
|
include 'pi.h'
|
|
|
|
!BEGIN_DOC
|
|
! Compute rho, the agreement between the predicted criterion/energy and the real one
|
|
!END_DOC
|
|
|
|
implicit none
|
|
|
|
! Variables
|
|
|
|
! In
|
|
double precision, intent(inout) :: prev_energy
|
|
double precision, intent(in) :: e_model, energy
|
|
|
|
! Out
|
|
double precision, intent(out) :: rho
|
|
|
|
! Internal
|
|
double precision :: t1, t2, t3
|
|
integer :: i
|
|
|
|
print*,''
|
|
print*,'---Rho_model---'
|
|
|
|
!call wall_time(t1)
|
|
|
|
! Rho
|
|
! \begin{equation}
|
|
! \rho^{k+1} = \frac{E^{k} - E^{k+1}}{E^{k} - m^{k+1}}
|
|
! \end{equation}
|
|
|
|
! In function of $\rho$ th step can be accepted or cancelled.
|
|
|
|
! If we cancel the last step (k+1), the previous energy (k) doesn't
|
|
! change!
|
|
! If the step (k+1) is accepted, then the "previous energy" becomes E(k+1)
|
|
|
|
|
|
! Already done in an other subroutine
|
|
!if (ABS(prev_energy - e_model) < 1d-12) then
|
|
! print*,'WARNING: prev_energy - e_model < 1d-12'
|
|
! print*,'=> rho will tend toward infinity'
|
|
! print*,'Check you convergence criterion !'
|
|
!endif
|
|
|
|
rho = (prev_energy - energy) / (prev_energy - e_model)
|
|
|
|
!print*, 'previous energy, prev_energy:', prev_energy
|
|
!print*, 'predicted energy, e_model:', e_model
|
|
!print*, 'real energy, energy:', energy
|
|
!print*, 'prev_energy - energy:', prev_energy - energy
|
|
!print*, 'prev_energy - e_model:', prev_energy - e_model
|
|
print*, 'Rho:', rho
|
|
!print*, 'Threshold for rho:', thresh_rho
|
|
|
|
! Modification of prev_energy in function of rho
|
|
if (rho < thresh_rho) then !0.1) then
|
|
! the step is cancelled
|
|
print*, 'Rho <', thresh_rho,', the previous energy does not changed'
|
|
!print*, 'prev_energy :', prev_energy
|
|
else
|
|
! the step is accepted
|
|
prev_energy = energy
|
|
print*, 'Rho >=', thresh_rho,', energy -> prev_energy:', energy
|
|
endif
|
|
|
|
!call wall_time(t2)
|
|
!t3 = t2 - t1
|
|
!print*,'Time in rho model:', t3
|
|
|
|
print*,'---End rho_model---'
|
|
|
|
end subroutine
|