* 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                             |

#+BEGIN_SRC f90 :comments org :tangle trust_region_rho.irp.f
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)
#+END_SRC

** 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) 

#+BEGIN_SRC f90 :comments org :tangle trust_region_rho.irp.f
  ! 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---'
  print*,''

end subroutine
#+END_SRC
