/[MITgcm]/MITgcm/pkg/ecco/cost_generic.F
ViewVC logotype

Contents of /MITgcm/pkg/ecco/cost_generic.F

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


Revision 1.12 - (show annotations) (download)
Fri May 20 22:22:54 2011 UTC (13 years ago) by gforget
Branch: MAIN
CVS Tags: checkpoint63, checkpoint62z, checkpoint62y
Changes since 1.11: +5 -1 lines
ecco/ecco_readparms.F
  if no gencost_name then copy gencost_datafile to gencost_name
ecco/ecco_cost_final.F
  use gencost_name in print statements
ecco/ecco_cost_weights.F
  introduce ALLOW_WSALTLEV/WTHETALEV to force read of WSALTLEV/WTHETALEV
ecco/cost_generic.F
  introduce COST_GENERIC_ASSUME_CYCLIC
  to switch assumption in case we find no yearly files

1 C $Header: /u/gcmpack/MITgcm/pkg/ecco/cost_generic.F,v 1.11 2010/02/15 21:18:04 gforget Exp $
2 C $Name: $
3
4 #include "COST_CPPOPTIONS.h"
5
6
7 subroutine cost_generic(
8 & nnzbar, localbarfile, localbar, xx_localbar_mean_dummy,
9 & nnzobs, localobsfile, mult_local,
10 & nrecloc, localstartdate, localperiod,
11 & ylocmask, localweight,
12 & spminloc, spmaxloc, spzeroloc,
13 & objf_local, num_local,
14 & myiter, mytime, mythid )
15
16 c ==================================================================
17 c SUBROUTINE cost_generic
18 c ==================================================================
19 c
20 c o Generic routine for evaluating time-dependent
21 c cost function contribution
22 c
23 c ==================================================================
24 c SUBROUTINE cost_generic
25 c ==================================================================
26
27 implicit none
28
29 c == global variables ==
30
31 #include "EEPARAMS.h"
32 #include "SIZE.h"
33 #include "PARAMS.h"
34 #include "GRID.h"
35 #ifdef ALLOW_CAL
36 # include "cal.h"
37 #endif
38 #ifdef ALLOW_COST
39 # include "ecco_cost.h"
40 # include "optim.h"
41 # ifdef ALLOW_SEAICE
42 # include "SEAICE_COST.h"
43 # endif
44 #endif
45
46 c == routine arguments ==
47
48 integer nnzbar
49 integer nnzobs
50 integer nrecloc
51 integer myiter
52 integer mythid
53 integer localstartdate(4)
54
55 _RL localbar (1-olx:snx+olx,1-oly:sny+oly,nnzbar,nsx,nsy)
56 _RL localweight(1-olx:snx+olx,1-oly:sny+oly,nnzobs,nsx,nsy)
57 _RL xx_localbar_mean_dummy
58 _RL mult_local
59 _RL mytime
60 _RL localperiod
61 _RL spminloc
62 _RL spmaxloc
63 _RL spzeroloc
64 _RL objf_local(nsx,nsy)
65 _RL num_local(nsx,nsy)
66
67 character*(1) ylocmask
68 character*(MAX_LEN_FNAM) localbarfile
69 character*(MAX_LEN_FNAM) localobsfile
70
71 #ifdef ALLOW_COST
72 c == local variables ==
73
74 integer bi,bj
75 integer i,j,k
76 integer itlo,ithi
77 integer jtlo,jthi
78 integer jmin,jmax
79 integer imin,imax
80 integer irec
81 integer il
82 integer localrec
83 integer obsrec
84
85 logical doglobalread
86 logical ladinit
87
88 _RL spval
89 parameter (spval = -9999. )
90 _RL localwww
91 _RL localcost
92 _RL junk
93
94 _RL localmask (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
95 _RL localobs (1-olx:snx+olx,1-oly:sny+oly,nnzobs,nsx,nsy)
96 _RL cmask (1-olx:snx+olx,1-oly:sny+oly,nnzobs)
97
98 character*(128) fname1, fname2
99 character*(MAX_LEN_MBUF) msgbuf
100
101 cnew(
102 _RL daytime
103 _RL diffsecs
104 integer dayiter
105 integer daydate(4)
106 integer difftime(4)
107 integer middate(4)
108 integer yday, ymod
109 integer md, dd, sd, ld, wd
110 integer mody, modm
111 integer beginmodel, beginlocal
112 logical exst
113 cnew)
114
115 c == external functions ==
116
117 integer ilnblnk
118 external ilnblnk
119
120 c == end of interface ==
121
122 jtlo = mybylo(mythid)
123 jthi = mybyhi(mythid)
124 itlo = mybxlo(mythid)
125 ithi = mybxhi(mythid)
126 jmin = 1
127 jmax = sny
128 imin = 1
129 imax = snx
130
131 c-- Initialise local variables.
132
133 localwww = 0. _d 0
134
135 do bj = jtlo,jthi
136 do bi = itlo,ithi
137 objf_local(bi,bj) = 0. _d 0
138 num_local(bi,bj) = 0. _d 0
139 do k = 1,nnzobs
140 do j = jmin,jmax
141 do i = imin,imax
142 localobs(i,j,k,bi,bj) = 0. _d 0
143 enddo
144 enddo
145 enddo
146 enddo
147 enddo
148
149 c-- Assign mask
150 do bj = jtlo,jthi
151 do bi = itlo,ithi
152 do k = 1,Nr
153 do j = 1-oly,sny+oly
154 do i = 1-olx,snx+olx
155 if ( ylocmask .EQ. 'C' .OR. ylocmask .EQ. 'c' ) then
156 localmask(i,j,k,bi,bj) = maskC(i,j,k,bi,bj)
157 elseif ( ylocmask .EQ. 'S' .OR. ylocmask .EQ. 's' ) then
158 localmask(i,j,k,bi,bj) = maskS(i,j,k,bi,bj)
159 elseif ( ylocmask .EQ. 'W' .OR. ylocmask .EQ. 'w' ) then
160 localmask(i,j,k,bi,bj) = maskW(i,j,k,bi,bj)
161 else
162 STOP 'cost_generic: wrong ylocmask'
163 endif
164 enddo
165 enddo
166 enddo
167 enddo
168 enddo
169
170 c-- First, read tiled data.
171 doglobalread = .false.
172 ladinit = .false.
173
174 write(fname1(1:128),'(80a)') ' '
175 il=ilnblnk( localbarfile )
176 write(fname1(1:128),'(2a,i10.10)')
177 & localbarfile(1:il),'.',optimcycle
178
179 cph if ( .NOT. ( mult_local.EQ.0. .OR. localobsfile.EQ.' ' ) ) then
180 if ( .NOT. ( localobsfile.EQ.' ' ) ) then
181
182 c-- Loop over records for the second time.
183 do irec = 1, nrecloc
184
185 if ( nnzbar .EQ. 1 ) then
186 call active_read_xy( fname1, localbar, irec, doglobalread,
187 & ladinit, optimcycle, mythid,
188 & xx_localbar_mean_dummy )
189 else
190 call active_read_xyz( fname1, localbar, irec, doglobalread,
191 & ladinit, optimcycle, mythid,
192 & xx_localbar_mean_dummy )
193 endif
194
195 cnew(
196 if ( localperiod .EQ. 86400. ) then
197 c-- assume daily fields
198 obsrec = irec
199 daytime = FLOAT(secondsperday*(irec-1))
200 dayiter = hoursperday*(irec-1)
201 call cal_getdate( dayiter, daytime, daydate, mythid )
202 call cal_convdate( daydate,yday,md,dd,sd,ld,wd,mythid )
203 ymod = localstartdate(1)/10000
204 if ( ymod .EQ. yday ) then
205 middate(1) = modelstartdate(1)
206 else
207 middate(1) = yday*10000+100+1
208 endif
209 middate(2) = 0
210 middate(3) = modelstartdate(3)
211 middate(4) = modelstartdate(4)
212 call cal_TimePassed( middate, daydate, difftime, mythid )
213 call cal_ToSeconds( difftime, diffsecs, mythid )
214 localrec = int(diffsecs/localperiod) + 1
215 else
216 c-- assume monthly fields
217 beginlocal = localstartdate(1)/10000
218 beginmodel = modelstartdate(1)/10000
219 obsrec =
220 & ( beginmodel - beginlocal )*nmonthyear
221 & + ( mod(modelstartdate(1)/100,100)
222 & -mod(localstartdate(1)/100,100) )
223 & + irec
224 mody = modelstartdate(1)/10000
225 modm = modelstartdate(1)/100 - mody*100
226 yday = mody + INT((modm-1+irec-1)/12)
227 localrec = 1 + MOD(modm-1+irec-1,12)
228 endif
229
230 il=ilnblnk(localobsfile)
231 write(fname2(1:128),'(2a,i4)')
232 & localobsfile(1:il), '_', yday
233 inquire( file=fname2, exist=exst )
234 if (.NOT. exst) then
235 write(fname2(1:128),'(a)') localobsfile(1:il)
236 #ifndef COST_GENERIC_ASSUME_CYCLIC
237 c assume we have one big file, one year after the other
238 localrec = obsrec
239 c otherwise assume climatology, used for each year
240 #endif
241 endif
242
243 if ( localrec .GT. 0 ) then
244 call mdsreadfield( fname2, cost_iprec, cost_yftype, nnzobs,
245 & localobs, localrec, mythid )
246 else
247 do bj = jtlo,jthi
248 do bi = itlo,ithi
249 do k = 1,nnzobs
250 do j = jmin,jmax
251 do i = imin,imax
252 localobs(i,j,k,bi,bj) = spval
253 enddo
254 enddo
255 enddo
256 enddo
257 enddo
258 endif
259 cnew)
260
261 do bj = jtlo,jthi
262 do bi = itlo,ithi
263
264 localcost = 0. _d 0
265
266 c-- Determine the mask on weights
267 do k = 1,nnzobs
268 do j = jmin,jmax
269 do i = imin,imax
270 cmask(i,j,k) = cosphi(i,j,bi,bj)*localmask(i,j,k,bi,bj)
271 if ( localobs(i,j,k,bi,bj) .lt. spminloc .or.
272 & localobs(i,j,k,bi,bj) .gt. spmaxloc .or.
273 & localobs(i,j,k,bi,bj) .eq. spzeroloc ) then
274 cmask(i,j,k) = 0. _d 0
275 endif
276 enddo
277 enddo
278 enddo
279 c--
280 do k = 1,nnzobs
281 do j = jmin,jmax
282 do i = imin,imax
283 localwww = localweight(i,j,k,bi,bj)*cmask(i,j,k)
284 junk = ( localbar(i,j,k,bi,bj) -
285 & localobs(i,j,k,bi,bj) )
286 localcost = localcost + junk*junk*localwww
287 if ( localwww .ne. 0. )
288 & num_local(bi,bj) = num_local(bi,bj) + 1. _d 0
289 enddo
290 enddo
291 enddo
292
293 objf_local(bi,bj) = objf_local(bi,bj) + localcost
294
295 enddo
296 enddo
297
298 enddo
299 c-- End of second loop over records.
300
301 c-- End of mult_local or localobsfile
302 endif
303
304 #endif /* ifdef ALLOW_COST */
305
306 end

  ViewVC Help
Powered by ViewVC 1.1.22