/[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.11 - (show annotations) (download)
Mon Feb 15 21:18:04 2010 UTC (14 years, 3 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint62c, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62x
Changes since 1.10: +14 -4 lines
bug fix

1 C $Header: /u/gcmpack/MITgcm/pkg/ecco/cost_generic.F,v 1.10 2010/02/06 11:30:16 heimbach 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 localrec = obsrec
237 endif
238
239 if ( localrec .GT. 0 ) then
240 call mdsreadfield( fname2, cost_iprec, cost_yftype, nnzobs,
241 & localobs, localrec, mythid )
242 else
243 do bj = jtlo,jthi
244 do bi = itlo,ithi
245 do k = 1,nnzobs
246 do j = jmin,jmax
247 do i = imin,imax
248 localobs(i,j,k,bi,bj) = spval
249 enddo
250 enddo
251 enddo
252 enddo
253 enddo
254 endif
255 cnew)
256
257 do bj = jtlo,jthi
258 do bi = itlo,ithi
259
260 localcost = 0. _d 0
261
262 c-- Determine the mask on weights
263 do k = 1,nnzobs
264 do j = jmin,jmax
265 do i = imin,imax
266 cmask(i,j,k) = cosphi(i,j,bi,bj)*localmask(i,j,k,bi,bj)
267 if ( localobs(i,j,k,bi,bj) .lt. spminloc .or.
268 & localobs(i,j,k,bi,bj) .gt. spmaxloc .or.
269 & localobs(i,j,k,bi,bj) .eq. spzeroloc ) then
270 cmask(i,j,k) = 0. _d 0
271 endif
272 enddo
273 enddo
274 enddo
275 c--
276 do k = 1,nnzobs
277 do j = jmin,jmax
278 do i = imin,imax
279 localwww = localweight(i,j,k,bi,bj)*cmask(i,j,k)
280 junk = ( localbar(i,j,k,bi,bj) -
281 & localobs(i,j,k,bi,bj) )
282 localcost = localcost + junk*junk*localwww
283 if ( localwww .ne. 0. )
284 & num_local(bi,bj) = num_local(bi,bj) + 1. _d 0
285 enddo
286 enddo
287 enddo
288
289 objf_local(bi,bj) = objf_local(bi,bj) + localcost
290
291 enddo
292 enddo
293
294 enddo
295 c-- End of second loop over records.
296
297 c-- End of mult_local or localobsfile
298 endif
299
300 #endif /* ifdef ALLOW_COST */
301
302 end

  ViewVC Help
Powered by ViewVC 1.1.22