/[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.10 - (show annotations) (download)
Sat Feb 6 11:30:16 2010 UTC (14 years, 3 months ago) by heimbach
Branch: MAIN
Changes since 1.9: +16 -3 lines
More code for GENCOST.

1 C $Header: /u/gcmpack/MITgcm/pkg/ecco/cost_generic.F,v 1.9 2010/02/06 02:43:03 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 if ( ylocmask .EQ. 'C' .OR. ylocmask .EQ. 'c' ) then
151 localmask(:,:,:,:,:) = maskC(:,:,:,:,:)
152 elseif ( ylocmask .EQ. 'S' .OR. ylocmask .EQ. 's' ) then
153 localmask(:,:,:,:,:) = maskS(:,:,:,:,:)
154 elseif ( ylocmask .EQ. 'W' .OR. ylocmask .EQ. 'w' ) then
155 localmask(:,:,:,:,:) = maskW(:,:,:,:,:)
156 else
157 STOP 'cost_generic: wrong ylocmask'
158 endif
159
160 c-- First, read tiled data.
161 doglobalread = .false.
162 ladinit = .false.
163
164 write(fname1(1:128),'(80a)') ' '
165 il=ilnblnk( localbarfile )
166 write(fname1(1:128),'(2a,i10.10)')
167 & localbarfile(1:il),'.',optimcycle
168
169 cph if ( .NOT. ( mult_local.EQ.0. .OR. localobsfile.EQ.' ' ) ) then
170 if ( .NOT. ( localobsfile.EQ.' ' ) ) then
171
172 c-- Loop over records for the second time.
173 do irec = 1, nrecloc
174
175 if ( nnzbar .EQ. 1 ) then
176 call active_read_xy( fname1, localbar, irec, doglobalread,
177 & ladinit, optimcycle, mythid,
178 & xx_localbar_mean_dummy )
179 else
180 call active_read_xyz( fname1, localbar, irec, doglobalread,
181 & ladinit, optimcycle, mythid,
182 & xx_localbar_mean_dummy )
183 endif
184
185 cnew(
186 if ( localperiod .EQ. 86400. ) then
187 c-- assume daily fields
188 obsrec = irec
189 daytime = FLOAT(secondsperday*(irec-1))
190 dayiter = hoursperday*(irec-1)
191 call cal_getdate( dayiter, daytime, daydate, mythid )
192 call cal_convdate( daydate,yday,md,dd,sd,ld,wd,mythid )
193 ymod = localstartdate(1)/10000
194 if ( ymod .EQ. yday ) then
195 middate(1) = modelstartdate(1)
196 else
197 middate(1) = yday*10000+100+1
198 endif
199 middate(2) = 0
200 middate(3) = modelstartdate(3)
201 middate(4) = modelstartdate(4)
202 call cal_TimePassed( middate, daydate, difftime, mythid )
203 call cal_ToSeconds( difftime, diffsecs, mythid )
204 localrec = int(diffsecs/localperiod) + 1
205 else
206 c-- assume monthly fields
207 beginlocal = localstartdate(1)/10000
208 beginmodel = modelstartdate(1)/10000
209 obsrec =
210 & ( beginmodel - beginlocal )*nmonthyear
211 & + ( mod(modelstartdate(1)/100,100)
212 & -mod(localstartdate(1)/100,100) )
213 & + irec
214 mody = modelstartdate(1)/10000
215 modm = modelstartdate(1)/100 - mody*100
216 yday = mody + INT((modm-1+irec-1)/12)
217 localrec = 1 + MOD(modm-1+irec-1,12)
218 endif
219
220 il=ilnblnk(localobsfile)
221 write(fname2(1:128),'(2a,i4)')
222 & localobsfile(1:il), '_', yday
223 inquire( file=fname2, exist=exst )
224 if (.NOT. exst) then
225 write(fname2(1:128),'(a)') localobsfile(1:il)
226 localrec = obsrec
227 endif
228
229 if ( localrec .GT. 0 ) then
230 call mdsreadfield( fname2, cost_iprec, cost_yftype, nnzobs,
231 & localobs, localrec, mythid )
232 else
233 do bj = jtlo,jthi
234 do bi = itlo,ithi
235 do k = 1,nnzobs
236 do j = jmin,jmax
237 do i = imin,imax
238 localobs(i,j,k,bi,bj) = spval
239 enddo
240 enddo
241 enddo
242 enddo
243 enddo
244 endif
245 cnew)
246
247 do bj = jtlo,jthi
248 do bi = itlo,ithi
249
250 localcost = 0. _d 0
251
252 c-- Determine the mask on weights
253 do k = 1,nnzobs
254 do j = jmin,jmax
255 do i = imin,imax
256 cmask(i,j,k) = cosphi(i,j,bi,bj)*localmask(i,j,k,bi,bj)
257 if ( localobs(i,j,k,bi,bj) .lt. spminloc .or.
258 & localobs(i,j,k,bi,bj) .gt. spmaxloc .or.
259 & localobs(i,j,k,bi,bj) .eq. spzeroloc ) then
260 cmask(i,j,k) = 0. _d 0
261 endif
262 enddo
263 enddo
264 enddo
265 c--
266 do k = 1,nnzobs
267 do j = jmin,jmax
268 do i = imin,imax
269 localwww = localweight(i,j,k,bi,bj)*cmask(i,j,k)
270 junk = ( localbar(i,j,k,bi,bj) -
271 & localobs(i,j,k,bi,bj) )
272 localcost = localcost + junk*junk*localwww
273 if ( localwww .ne. 0. )
274 & num_local(bi,bj) = num_local(bi,bj) + 1. _d 0
275 enddo
276 enddo
277 enddo
278
279 objf_local(bi,bj) = objf_local(bi,bj) + localcost
280
281 enddo
282 enddo
283
284 enddo
285 c-- End of second loop over records.
286
287 c-- End of mult_local or localobsfile
288 endif
289
290 #endif /* ifdef ALLOW_COST */
291
292 end

  ViewVC Help
Powered by ViewVC 1.1.22