/[MITgcm]/MITgcm_contrib/ecco_utils/lbfgs_jpl_version/lsopt.2/dgscale.F
ViewVC logotype

Annotation of /MITgcm_contrib/ecco_utils/lbfgs_jpl_version/lsopt.2/dgscale.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Wed Apr 3 23:36:06 2013 UTC (12 years, 4 months ago) by heimbach
Branch: MAIN
CVS Tags: HEAD
Add L-BFGS code adapted to ECCO Production by JPL

1 heimbach 1.1
2     subroutine dgscale( nn, gold, xdiff, diag, rmin )
3    
4    
5     c ==================================================================
6     c SUBROUTINE dgscale
7     c ==================================================================
8     c
9     c o computes new preconditioner and writes it to OPWARMD
10     c
11     c o started: ??? not reproducible
12     c
13     c o Version: 2.1.0, 02-Mar-2000: Patrick Heimbach, MIT/EAPS
14     c
15     c ==================================================================
16     c SUBROUTINE dgscale
17     c ==================================================================
18    
19     implicit none
20    
21     #include "blas1.h"
22     include 'mpif.h'
23    
24     integer nn
25     double precision gold(nn), xdiff(nn), diag(nn)
26    
27     integer i
28     double precision r1, rmin, den
29    
30     double precision temp
31     integer status(MPI_STATUS_SIZE),ierr
32     integer myid, nprocs,mystart,myend
33     common /mpi_parm/ myid,nprocs,mystart,myend
34    
35     c-----------------------------------------
36     c read diagonal
37     c-----------------------------------------
38     call dostore( nn, diag, .false., 3 )
39    
40     r1 = 0.
41     do i = 1, nn
42     r1 = r1 + gold(i)*gold(i)*diag(i)
43     end do
44    
45     temp = r1
46     call MPI_ALLREDUCE(temp,r1,1,MPI_DOUBLE_PRECISION,MPI_SUM,
47     & MPI_COMM_WORLD,ierr)
48     r1 = 1.0 / r1
49    
50     call DSCAL( nn, r1, diag, 1 )
51    
52     c-----------------------------------------
53     c update the diagonal
54     c (gg is used as an auxiliary vector)
55     c-----------------------------------------
56    
57     den = 0.0
58    
59     do i = 1, nn
60     cph(
61     if (diag(i).LE.0) then
62     cph print *, 'pathei-lsopt: in dgscale; diag = 0 for i=', i
63     diag(i) = rmin
64     end if
65     cph)
66     den = den + xdiff(i)*xdiff(i) / diag(i)
67     end do
68    
69     temp=den
70     call MPI_ALLREDUCE(temp,den,1,MPI_DOUBLE_PRECISION,MPI_SUM,
71     & MPI_COMM_WORLD,ierr)
72    
73     do i = 1, nn
74     diag(i) = 1./
75     $ (1./diag(i)+gold(i)**2-(xdiff(i)/diag(i))**2/den)
76     if (diag(i).le.0.) then
77     diag(i) = rmin
78     endif
79     end do
80    
81     c-----------------------------------------
82     c write diagonal
83     c-----------------------------------------
84     call dostore( nn, diag, .true., 3 )
85    
86     return
87     end

  ViewVC Help
Powered by ViewVC 1.1.22