root / src / Hupdate_all.f90 @ 2
Historique | Voir | Annoter | Télécharger (2,24 ko)
1 | 1 | equemene | subroutine hupdate_all(n, ds, dgrad, Hess) |
---|---|---|---|
2 | 1 | equemene | |
3 | 1 | equemene | use Path_module, only : hesupd,Hinv |
4 | 1 | equemene | use Io_module, only : IoOut |
5 | 1 | equemene | |
6 | 1 | equemene | IMPLICIT NONE |
7 | 1 | equemene | |
8 | 1 | equemene | INTEGER, PARAMETER :: KINT=KIND(1) |
9 | 1 | equemene | INTEGER, PARAMETER :: KREAL=KIND(1.0D0) |
10 | 1 | equemene | |
11 | 1 | equemene | INTEGER(KINT), INTENT(IN) :: n |
12 | 1 | equemene | real(KREAL), INTENT(IN) :: ds(n), dgrad(n) |
13 | 1 | equemene | REAL(KREAL),INTENT(INOUT) :: Hess(n:n) |
14 | 1 | equemene | |
15 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
16 | 1 | equemene | ! |
17 | 1 | equemene | ! This subroutine is a drive for the update of the Hessian |
18 | 1 | equemene | ! in the Quasi-Newton optimization step. |
19 | 1 | equemene | ! We propose mostly update of the inverse Hessian. |
20 | 1 | equemene | ! |
21 | 1 | equemene | ! input: |
22 | 1 | equemene | ! - n: number of coordinates |
23 | 1 | equemene | ! - ds: GeomOld-Geom (expressed in the optimization coord.) |
24 | 1 | equemene | ! - dgrad: GradOld-Grad (expressed in the optimization coord.) |
25 | 1 | equemene | ! |
26 | 1 | equemene | ! input/output: |
27 | 1 | equemene | ! - Hess: old Hessian in input, replaced by updated Hessian on output |
28 | 1 | equemene | ! |
29 | 1 | equemene | !!!!!!!!!!!!!!!! |
30 | 1 | equemene | ! |
31 | 1 | equemene | ! For now, we propose : |
32 | 1 | equemene | ! - For update of inverser Hessian: |
33 | 1 | equemene | ! - BFGS |
34 | 1 | equemene | ! |
35 | 1 | equemene | ! - For update of hessian: |
36 | 1 | equemene | ! - Bofill (combination of Murtagh-Sargent and Powell-symmetric-Broyden |
37 | 1 | equemene | ! - Murtagh-Sargent |
38 | 1 | equemene | ! |
39 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
40 | 1 | equemene | |
41 | 1 | equemene | |
42 | 1 | equemene | |
43 | 1 | equemene | interface |
44 | 1 | equemene | function valid(string) result (isValid) |
45 | 1 | equemene | logical :: isValid |
46 | 1 | equemene | character(*), intent(in) :: string |
47 | 1 | equemene | end function valid |
48 | 1 | equemene | |
49 | 1 | equemene | end interface |
50 | 1 | equemene | |
51 | 1 | equemene | ! ====================================================================== |
52 | 1 | equemene | LOGICAL :: Debug |
53 | 1 | equemene | |
54 | 1 | equemene | ! ====================================================================== |
55 | 1 | equemene | |
56 | 1 | equemene | debug = valid ('DEBUG HESS') .OR. Valid('DEBUG HUPDATE') |
57 | 1 | equemene | |
58 | 1 | equemene | if (debug) WRITE(*,*) "================================= Entering Hupdate_all ===============" |
59 | 1 | equemene | |
60 | 1 | equemene | SELECT CASE (Hinv) |
61 | 1 | equemene | CASE (.TRUE.) |
62 | 1 | equemene | SELECT CASE (HesUpd) |
63 | 1 | equemene | CASE ("BFGS") |
64 | 1 | equemene | Call Hinvup_BFGS(n,ds,dgrad,hess) |
65 | 1 | equemene | CASE DEFAULT |
66 | 1 | equemene | WRITE(*,*) Trim(HesUpd) // " not known: using BFGS" |
67 | 1 | equemene | Call Hinvup_BFGS(n,ds,dgrad,hess) |
68 | 1 | equemene | END SELECT |
69 | 1 | equemene | CASE (.FALSE.) |
70 | 1 | equemene | SELECT CASE (HesUpd) |
71 | 1 | equemene | CASE ("BOFILL") |
72 | 1 | equemene | Call Hupdate_Bofill(n,ds,dgrad,hess) |
73 | 1 | equemene | CASE ("MS") |
74 | 1 | equemene | Call Hupdate_MS(n,ds,dgrad,hess) |
75 | 1 | equemene | CASE DEFAULT |
76 | 1 | equemene | WRITE(*,*) Trim(HesUpd) // " not known: using Bofill" |
77 | 1 | equemene | Call Hupdate_Bofill(n,ds,dgrad,hess) |
78 | 1 | equemene | END SELECT |
79 | 1 | equemene | END SELECT |
80 | 1 | equemene | |
81 | 1 | equemene | end subroutine hupdate_all |