/[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.39 - (show annotations) (download)
Tue Mar 22 22:29:25 2016 UTC (8 years, 1 month ago) by gforget
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65v, checkpoint65w, HEAD
Changes since 1.38: +9 -1 lines
- cost_generic.F: add 'factor' preprocessing option.
- ecco_toolbox.F: add ecco_multfield to toolbox.

1 C $Header: /u/gcmpack/MITgcm/pkg/ecco/cost_generic.F,v 1.38 2016/03/01 23:05:15 gforget Exp $
2 C $Name: $
3
4 #include "ECCO_OPTIONS.h"
5
6 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7 CBOP
8 C !ROUTINE: cost_generic
9 C !INTERFACE:
10 subroutine cost_generic(
11 & nnzbar, localbarfile, dummy,
12 & nnzobs, localobsfile, localerrfile,
13 & mult_local, nrecloc, nrecobs,
14 & localstartdate, localperiod,
15 & ylocmask, spminloc, spmaxloc, spzeroloc,
16 & preproc, preproc_c, preproc_i, preproc_r,
17 & posproc, posproc_c, posproc_i, posproc_r,
18 & outlev, outname,
19 & objf_local, num_local,
20 & myiter, mytime, mythid )
21
22 C !DESCRIPTION: \bv
23 C Generic routine for evaluating time-dependent
24 c cost function contribution
25 C \ev
26
27 C !USES:
28 implicit none
29
30 c == global variables ==
31
32 #include "EEPARAMS.h"
33 #include "SIZE.h"
34 #include "PARAMS.h"
35 #include "GRID.h"
36 #ifdef ALLOW_CAL
37 # include "cal.h"
38 #endif
39 #ifdef ALLOW_ECCO
40 # include "ecco.h"
41 #endif
42 #ifdef ALLOW_SEAICE
43 # include "SEAICE_COST.h"
44 #endif
45
46 c == routine arguments ==
47
48 integer myiter
49 integer mythid
50 integer nnzbar, nnzobs
51 integer nrecloc, nrecobs
52 integer localstartdate(4)
53 integer outlev
54 integer preproc_i(NGENPPROC)
55 integer posproc_i(NGENPPROC)
56
57 _RL objf_local(nsx,nsy)
58 _RL num_local(nsx,nsy)
59 _RL dummy
60 _RL mult_local
61 _RL mytime
62 _RL localperiod
63 _RL spminloc
64 _RL spmaxloc
65 _RL spzeroloc
66 _RL preproc_r(NGENPPROC)
67 _RL posproc_r(NGENPPROC)
68
69 character*(1) ylocmask
70 character*(MAX_LEN_FNAM) localbarfile
71 character*(MAX_LEN_FNAM) localobsfile
72 character*(MAX_LEN_FNAM) localerrfile
73 character*(MAX_LEN_FNAM) preproc(NGENPPROC)
74 character*(MAX_LEN_FNAM) preproc_c(NGENPPROC)
75 character*(MAX_LEN_FNAM) posproc(NGENPPROC)
76 character*(MAX_LEN_FNAM) posproc_c(NGENPPROC)
77 character*(MAX_LEN_FNAM) outname
78
79 #ifdef ALLOW_ECCO
80
81 c == local variables ==
82
83 integer bi,bj,k2
84 integer itlo,ithi
85 integer jtlo,jthi
86 logical domean, doanom
87
88 _RL localdifmean1 (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
89 _RL localdifmean2 (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
90
91 CEOP
92
93 jtlo = mybylo(mythid)
94 jthi = mybyhi(mythid)
95 itlo = mybxlo(mythid)
96 ithi = mybxhi(mythid)
97
98 c-- Initialise local variables.
99
100 do bj = jtlo,jthi
101 do bi = itlo,ithi
102 objf_local(bi,bj) = 0. _d 0
103 num_local(bi,bj) = 0. _d 0
104 enddo
105 enddo
106
107 call ecco_zero(localdifmean1,Nr,zeroRL,myThid)
108 call ecco_zero(localdifmean2,Nr,zeroRL,myThid)
109
110 domean=.FALSE.
111 doanom=.FALSE.
112 do k2 = 1, NGENPPROC
113 if (preproc(k2).EQ.'mean') domean=.TRUE.
114 if (preproc(k2).EQ.'anom') doanom=.TRUE.
115 enddo
116
117 C Extra time loop to compute time-mean fields and costs
118 if ( (.NOT. ( localobsfile.EQ.' ' ) )
119 & .AND. ( domean .OR. doanom ) ) then
120 call cost_genloop(
121 & localdifmean1,localdifmean2,.FALSE.,
122 & nnzbar, localbarfile, dummy,
123 & nnzobs, localobsfile, localerrfile,
124 & mult_local, nrecloc, nrecobs,
125 & localstartdate, localperiod,
126 & ylocmask, spminloc, spmaxloc, spzeroloc,
127 & preproc, preproc_c, preproc_i, preproc_r,
128 & posproc, posproc_c, posproc_i, posproc_r,
129 & outlev, outname,
130 & objf_local, num_local,
131 & myiter, mytime, mythid )
132 endif
133
134 call ecco_zero(localdifmean1,Nr,zeroRL,myThid)
135
136 if ((.NOT.(localobsfile.EQ.' ')).AND.(.NOT.domean)) then
137 call cost_genloop(
138 & localdifmean2,localdifmean1,.TRUE.,
139 & nnzbar, localbarfile, dummy,
140 & nnzobs, localobsfile, localerrfile,
141 & mult_local, nrecloc, nrecobs,
142 & localstartdate, localperiod,
143 & ylocmask, spminloc, spmaxloc, spzeroloc,
144 & preproc, preproc_c, preproc_i, preproc_r,
145 & posproc, posproc_c, posproc_i, posproc_r,
146 & outlev, outname,
147 & objf_local, num_local,
148 & myiter, mytime, mythid )
149 endif
150
151 #endif /* ALLOW_ECCO */
152
153 return
154 end
155
156 C--------------
157
158 subroutine cost_genloop(
159 & localdifmeanIn,localdifmeanOut, addVariaCost,
160 & nnzbar, localbarfile, dummy,
161 & nnzobs, localobsfile, localerrfile,
162 & mult_local, nrecloc, nrecobs,
163 & localstartdate, localperiod,
164 & ylocmask, spminloc, spmaxloc, spzeroloc,
165 & preproc, preproc_c, preproc_i, preproc_r,
166 & posproc, posproc_c, posproc_i, posproc_r,
167 & outlev, outname,
168 & objf_local, num_local,
169 & myiter, mytime, mythid )
170
171 C !DESCRIPTION: \bv
172 C Generic routine for evaluating time-dependent
173 c cost function contribution
174 C \ev
175
176 C !USES:
177 implicit none
178
179 c == global variables ==
180
181 #include "EEPARAMS.h"
182 #include "SIZE.h"
183 #include "PARAMS.h"
184 #include "GRID.h"
185 #ifdef ALLOW_CAL
186 # include "cal.h"
187 #endif
188 #ifdef ALLOW_ECCO
189 # include "ecco.h"
190 #endif
191 #ifdef ALLOW_SEAICE
192 # include "SEAICE_COST.h"
193 #endif
194
195 c == routine arguments ==
196
197 integer myiter
198 integer mythid
199 integer nnzbar, nnzobs
200 integer nrecloc, nrecobs
201 integer localstartdate(4)
202 integer outlev
203 integer preproc_i(NGENPPROC)
204 integer posproc_i(NGENPPROC)
205
206 _RL objf_local(nsx,nsy)
207 _RL num_local(nsx,nsy)
208 _RL dummy
209 _RL mult_local
210 _RL mytime
211 _RL localperiod
212 _RL spminloc
213 _RL spmaxloc
214 _RL spzeroloc
215 _RL preproc_r(NGENPPROC)
216 _RL posproc_r(NGENPPROC)
217
218 character*(1) ylocmask
219 character*(MAX_LEN_FNAM) localbarfile
220 character*(MAX_LEN_FNAM) localobsfile
221 character*(MAX_LEN_FNAM) localerrfile
222 character*(MAX_LEN_FNAM) preproc(NGENPPROC)
223 character*(MAX_LEN_FNAM) preproc_c(NGENPPROC)
224 character*(MAX_LEN_FNAM) posproc(NGENPPROC)
225 character*(MAX_LEN_FNAM) posproc_c(NGENPPROC)
226 character*(MAX_LEN_FNAM) outname
227
228 logical addVariaCost
229 _RL localdifmeanIn (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
230 _RL localdifmeanOut (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
231
232 #ifdef ALLOW_ECCO
233
234 c == local variables ==
235
236 integer bi,bj
237 integer itlo,ithi
238 integer jtlo,jthi
239 integer irec, jrec
240 integer il, k2
241 integer localrec, obsrec
242 integer nrecloop, nrecclim, k2smooth
243 logical domean, doanom, dovarwei, doclim, dosmooth, dosumsq
244
245 _RL localmask (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
246
247 _RL localbar (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
248 _RL localweight(1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
249 _RL localtmp (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
250 _RL localobs (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
251 _RL localdif (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
252 _RL difmask (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
253
254 _RL localdifmsk (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
255 _RL localdifsum (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
256 _RL localdifnum (1-olx:snx+olx,1-oly:sny+oly,Nr,nsx,nsy)
257
258 _RL fac
259
260 character*(128) fname1, fname2, fname3
261 character*200 msgbuf
262
263 logical exst
264
265 c == external functions ==
266
267 integer ilnblnk
268 external ilnblnk
269
270 CEOP
271
272 call ecco_zero(localbar,Nr,zeroRL,myThid)
273 call ecco_zero(localweight,Nr,zeroRL,myThid)
274 call ecco_zero(localtmp,Nr,zeroRL,myThid)
275 call ecco_zero(localmask,Nr,zeroRL,myThid)
276
277 call ecco_zero(localobs,Nr,zeroRL,myThid)
278 call ecco_zero(localdif,Nr,zeroRL,myThid)
279 call ecco_zero(difmask,Nr,zeroRL,myThid)
280
281 call ecco_zero(localdifmsk,Nr,zeroRL,myThid)
282 call ecco_zero(localdifsum,Nr,zeroRL,myThid)
283 call ecco_zero(localdifnum,Nr,zeroRL,myThid)
284
285 dosumsq=.TRUE.
286 domean=.FALSE.
287 doanom=.FALSE.
288 dovarwei=.FALSE.
289 dosmooth=.FALSE.
290 k2smooth=1
291 doclim=.FALSE.
292 nrecclim=nrecloc
293 fac=oneRL
294
295 do k2 = 1, NGENPPROC
296 if (preproc(k2).EQ.'mean') domean=.TRUE.
297 if (preproc(k2).EQ.'anom') doanom=.TRUE.
298 if (preproc(k2).EQ.'variaweight') dovarwei=.TRUE.
299 if (preproc(k2).EQ.'nosumsq') dosumsq=.FALSE.
300 if (posproc(k2).EQ.'smooth') then
301 dosmooth=.TRUE.
302 k2smooth=k2
303 endif
304 if (preproc(k2).EQ.'clim') then
305 doclim=.TRUE.
306 nrecclim=preproc_i(k2)
307 endif
308 if (preproc(k2).EQ.'factor') then
309 fac=preproc_r(k2)
310 endif
311 enddo
312
313 c-- Assign mask
314 if ( ylocmask .EQ. 'C' .OR. ylocmask .EQ. 'c' ) then
315 call ecco_cprsrl(maskC,nr,localmask,nr,myThid)
316 elseif ( ylocmask .EQ. 'S' .OR. ylocmask .EQ. 's' ) then
317 call ecco_cprsrl(maskS,nr,localmask,nr,myThid)
318 elseif ( ylocmask .EQ. 'W' .OR. ylocmask .EQ. 'w' ) then
319 call ecco_cprsrl(maskW,nr,localmask,nr,myThid)
320 else
321 STOP 'cost_generic: wrong ylocmask'
322 endif
323
324 c-- set nrecloop to nrecloc
325 nrecloop=nrecloc
326
327 c-- reset nrecloop, if needed, according to preproc
328 if ( doclim ) nrecloop=MIN(nrecloop,nrecclim)
329
330 c-- loop over obsfile records
331 do irec = 1, nrecloop
332
333 c-- load weights
334 exst=.FALSE.
335 jrec=1
336 if( dovarwei ) jrec = irec
337 call cost_gencal(localbarfile, localerrfile,
338 & jrec, localstartdate, localperiod, fname1,
339 & fname3, localrec, obsrec, exst, mythid )
340 call ecco_zero(localweight,nnzobs,zeroRL,myThid)
341 if ( (localrec .GT. 0).AND.(obsrec .GT. 0).AND.(exst) )
342 & call ecco_readwei(fname3,localweight,localrec,nnzobs,mythid)
343
344 c-- determine records and file names
345 exst=.FALSE.
346 call cost_gencal(localbarfile, localobsfile,
347 & irec, localstartdate, localperiod, fname1,
348 & fname2, localrec, obsrec, exst, mythid )
349
350 c-- load model average and observed average
351 call ecco_zero(localbar,nnzbar,zeroRL,myThid)
352 call cost_genread( fname1, localbar, localtmp, irec, nnzbar,
353 & nrecloc, preproc, preproc_c, preproc_i, preproc_r,
354 & dummy, mythid )
355 call ecco_mult(localbar,nnzbar,fac,myThid)
356
357 call ecco_zero(localobs,nnzobs,spzeroloc,myThid)
358 if ( (localrec .GT. 0).AND.(obsrec .GT. 0).AND.(exst) )
359 & call mdsreadfield( fname2, cost_iprec, cost_yftype, nnzobs,
360 & localobs, localrec, mythid )
361
362 c-- Compute masked model-data difference
363 call ecco_diffmsk( localbar, nnzbar, localobs, nnzobs,
364 & localmask, spminloc, spmaxloc, spzeroloc,
365 & localdif, difmask, myThid )
366
367 if ( doanom ) call ecco_subtract( localdifmeanIn,
368 & nnzobs, localdif, nnzobs, myThid )
369
370 if ( domean.OR.doanom )
371 & call ecco_addmask(localdif,difmask, nnzobs,localdifsum,
372 & localdifnum, nnzobs,myThid)
373
374 if (addVariaCost) then
375
376 #ifdef ALLOW_SMOOTH
377 if ( useSMOOTH.AND.dosmooth.AND.
378 & (nnzbar.EQ.1).AND.(nnzobs.EQ.1) )
379 & call smooth_hetero2d(localdif,maskc,
380 & posproc_c(k2smooth),posproc_i(k2smooth),mythid)
381 #endif
382
383 c-- Compute normalized model-obs cost function
384 call ecco_addcost(
385 I localdif, localweight, difmask, nnzobs, dosumsq,
386 U objf_local, num_local,
387 I myThid
388 & )
389 c-- output model-data difference to disk
390 if ( outlev.GT.0 ) then
391 il=ilnblnk(outname)
392 write(fname3(1:128),'(2a)') 'misfit_', outname(1:il)
393 if ( nnzobs.EQ.1 ) CALL
394 & WRITE_REC_XY_RL( fname3, localdif,irec, eccoiter, mythid )
395 if ( nnzobs.EQ.nr ) CALL
396 & WRITE_REC_XYZ_RL( fname3, localdif,irec, eccoiter, mythid )
397 endif
398
399 endif
400
401 enddo
402 c-- End of loop over obsfile records.
403
404 call ecco_zero(localdifmeanOut,Nr,zeroRL,myThid)
405 call ecco_cp(localdifsum,nnzobs,localdifmeanOut,nnzobs,myThid)
406 call ecco_divfield(localdifmeanOut,nnzobs,localdifnum,myThid)
407 call ecco_cp(localdifnum,nnzobs,localdifmsk,nnzobs,myThid)
408 call ecco_divfield(localdifmsk,nnzobs,localdifnum,myThid)
409
410 if ( domean ) then
411 c-- Compute normalized model-obs cost function
412 call ecco_addcost(
413 I localdifmeanOut, localweight, localdifmsk, nnzobs, dosumsq,
414 U objf_local, num_local, myThid)
415
416 c-- output model-data difference to disk
417 if ( outlev.GT.0 ) then
418 il=ilnblnk(outname)
419 write(fname3(1:128),'(2a)') 'misfit_', outname(1:il)
420 if ( nnzobs.EQ.1 ) CALL
421 & WRITE_REC_XY_RL(fname3,localdifmeanOut,1,eccoiter,mythid)
422 if ( nnzobs.EQ.nr ) CALL
423 & WRITE_REC_XYZ_RL(fname3,localdifmeanOut,1,eccoiter,mythid)
424 endif
425 endif
426 if ( outlev.GT.1 ) then
427 il=ilnblnk(outname)
428 write(fname3(1:128),'(2a)') 'weight_', outname(1:il)
429 if ( nnzobs.EQ.1 ) CALL
430 & WRITE_REC_XY_RL( fname3, localweight,irec, eccoiter, mythid )
431 if ( nnzobs.EQ.nr ) CALL
432 & WRITE_REC_XYZ_RL( fname3, localweight,irec, eccoiter, mythid )
433 endif
434
435
436 #endif /* ALLOW_ECCO */
437
438 return
439 end
440
441

  ViewVC Help
Powered by ViewVC 1.1.22