1 |
C $Header: /u/gcmpack/MITgcm_contrib/mlosch/optim_m1qn3/testbed/offline_driver.F,v 1.1 2012/05/02 12:27:42 mlosch Exp $ |
2 |
C $Name: $ |
3 |
program offline_driver |
4 |
implicit none |
5 |
integer k |
6 |
integer optimcycle |
7 |
integer maxiter |
8 |
parameter (maxiter = 10) |
9 |
|
10 |
c parameters to be used in m1qn3 |
11 |
integer reverse |
12 |
integer n, nnn |
13 |
parameter (n = 7) |
14 |
integer impres,io,imode(3),omode,niter,nsim,iz(5),indic |
15 |
double precision x(n),f,g(n),dxmin,df1,epsg |
16 |
character*3 normtype |
17 |
c work arrays |
18 |
integer ndz, mupdate |
19 |
parameter (mupdate = 7) |
20 |
parameter (ndz=3*n + mupdate*(2*n + 1)) |
21 |
double precision dz(ndz), dz2(ndz) |
22 |
c extra dummy variables |
23 |
integer nn,i |
24 |
parameter (nn = 1) |
25 |
integer izs(nn) |
26 |
real rzs(nn) |
27 |
double precision dzs(nn) |
28 |
|
29 |
c m1qn3 start |
30 |
#include "m1qn3_common.h" |
31 |
#include "m1qn3a_common.h" |
32 |
#include "mlis3_common.h" |
33 |
c m1qn3 end |
34 |
|
35 |
character*(*) fname |
36 |
parameter ( fname = 'output_m1qn3.txt' ) |
37 |
|
38 |
external simul_rc,euclid,ctonbe,ctcabe |
39 |
|
40 |
c if (ndz.gt.1000) stop 'ndz >1000, increase dz' |
41 |
c initialization |
42 |
epsg = 1.d-8 |
43 |
impres = 6 |
44 |
io=98 |
45 |
optimcycle=0 |
46 |
normtype = 'two' |
47 |
f = 0. |
48 |
dxmin = 1.d-6 |
49 |
df1 = 10. |
50 |
c diagonal scaling mode |
51 |
imode(1) = 0 |
52 |
c cold start |
53 |
imode(2) = 0 |
54 |
c call simul with indic=1 every imode(3)th iteration |
55 |
imode(3) = 0 |
56 |
c set this output variable to check if anything is done to it in m1qn3 |
57 |
c value does not alter results |
58 |
omode=-1 |
59 |
reverse=1 |
60 |
niter = 1000 |
61 |
nsim = 1000 |
62 |
do k=1,5 |
63 |
iz(k)=0 |
64 |
enddo |
65 |
indic=4 |
66 |
do k=1,n |
67 |
x(k) = 0. |
68 |
g(k) = 0. |
69 |
enddo |
70 |
do k=1,nn |
71 |
izs(k)=0 |
72 |
rzs(k)=0. |
73 |
dzs(k)=0. |
74 |
enddo |
75 |
dzs(1) = 100. |
76 |
c restart stuff |
77 |
do k=1,ndz |
78 |
dz(k) = 0. |
79 |
enddo |
80 |
dz(:)=0. |
81 |
c end restart stuff |
82 |
do i=1,n |
83 |
x(i) = 0. |
84 |
enddo |
85 |
f=0. |
86 |
|
87 |
open(11,file='count.txt',status='old') |
88 |
read(11,*) optimcycle |
89 |
close(11) |
90 |
|
91 |
c first guess of x,f,g |
92 |
if ( optimcycle.eq.0 ) then |
93 |
c cold start |
94 |
print *, 'cold start' |
95 |
imode(2)=0 |
96 |
c first guess (izs=-1) |
97 |
call mysimul(indic,n,f,x,g,-1,rzs,dzs) |
98 |
df1 = f*0.1 |
99 |
reentry=0 |
100 |
open(io,file=fname,status='unknown') |
101 |
else |
102 |
c warm restart |
103 |
imode(2)=1 |
104 |
c read restart information |
105 |
call optim_store_m1qn3(ndz,iz,dz,niter,nsim,epsg,df1, |
106 |
I optimcycle, |
107 |
I .false.) |
108 |
open(99,file='model_out',status='old',form='unformatted') |
109 |
read(99) indic,nnn |
110 |
read(99) f |
111 |
if ( nnn.ne.n ) stop 'nnn .ne. n' |
112 |
read(99) (g(i),i=1,n) |
113 |
read(99) izs,rzs,dzs |
114 |
close(99) |
115 |
open(99,file='model_in',status='old',form='unformatted') |
116 |
read(99) indic,nnn |
117 |
read(99) (x(i),i=1,nnn) |
118 |
read(99) izs,rzs,dzs |
119 |
close(99) |
120 |
df1 = -2.e23 |
121 |
open(io,file=fname,status='old',position='append') |
122 |
endif |
123 |
|
124 |
reverse=1 |
125 |
call m1qn3_offline |
126 |
& (simul_rc,euclid,ctonbe,ctcabe,n,x,f,g,dxmin,df1, |
127 |
& epsg,normtype,impres,io,imode,omode,niter,nsim, |
128 |
& iz,dz,ndz,reverse,indic,izs,rzs,dzs) |
129 |
close(io) |
130 |
c write restart information |
131 |
call optim_store_m1qn3(ndz,iz,dz,niter,nsim,epsg,df1, |
132 |
I optimcycle, |
133 |
I .true.) |
134 |
|
135 |
open(99,file='model_in',status='unknown',form='unformatted') |
136 |
write(99) indic,n |
137 |
write(99) (x(i),i=1,n) |
138 |
write(99) izs,rzs,dzs |
139 |
close(99) |
140 |
|
141 |
|
142 |
if ( reverse .le. 0 ) then |
143 |
print *, 'stoptheloop' |
144 |
print *, 'ml-offline_driver: niter = ',niter |
145 |
print *, 'ml-offline_driver: nsim = ',nsim |
146 |
print *, 'ml-offline_driver: omode = ',omode |
147 |
endif |
148 |
stop 'NORMAL END' |
149 |
|
150 |
end |
151 |
|