1 |
C $Header: /u/gcmpack/MITgcm/pkg/ctrl/ctrl_map_ini_gentim2d.F,v 1.15 2017/03/06 20:03:46 gforget Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "CTRL_OPTIONS.h" |
5 |
#ifdef ALLOW_AUTODIFF |
6 |
# include "AUTODIFF_OPTIONS.h" |
7 |
#endif |
8 |
|
9 |
CBOP |
10 |
C !ROUTINE: CTRL_MAP_INI_GENTIM2D |
11 |
C !INTERFACE: |
12 |
SUBROUTINE CTRL_MAP_INI_GENTIM2D( myThid ) |
13 |
|
14 |
C !DESCRIPTION: \bv |
15 |
C *================================================================= |
16 |
C | SUBROUTINE CTRL_MAP_INI_GENTIM2D |
17 |
C | Dimensionalize and preprocess time variable controls. |
18 |
C *================================================================= |
19 |
C \ev |
20 |
|
21 |
C !USES: |
22 |
IMPLICIT NONE |
23 |
|
24 |
C == global variables == |
25 |
#include "SIZE.h" |
26 |
#include "EEPARAMS.h" |
27 |
#include "PARAMS.h" |
28 |
#include "GRID.h" |
29 |
#include "DYNVARS.h" |
30 |
#include "FFIELDS.h" |
31 |
#include "CTRL_SIZE.h" |
32 |
#include "ctrl.h" |
33 |
#include "optim.h" |
34 |
#include "ctrl_dummy.h" |
35 |
#include "CTRL_GENARR.h" |
36 |
#ifdef ALLOW_PTRACERS |
37 |
# include "PTRACERS_SIZE.h" |
38 |
# include "PTRACERS_FIELDS.h" |
39 |
#endif |
40 |
#ifdef ALLOW_AUTODIFF |
41 |
#include "tamc.h" |
42 |
#endif |
43 |
|
44 |
C !INPUT/OUTPUT PARAMETERS: |
45 |
C == routine arguments == |
46 |
INTEGER myThid |
47 |
|
48 |
#ifdef ALLOW_GENTIM2D_CONTROL |
49 |
C !LOCAL VARIABLES: |
50 |
C == local variables == |
51 |
integer iarr |
52 |
integer numsmo |
53 |
character*(80) fnamegenIn |
54 |
character*(80) fnamegenOut |
55 |
character*(80) fnamegenTmp |
56 |
character*(80) fnamebase |
57 |
integer startrec |
58 |
integer endrec |
59 |
integer diffrec |
60 |
integer irec, jrec, krec |
61 |
integer replicated_nrec |
62 |
integer replicated_ntimes |
63 |
logical doglobalread |
64 |
logical ladinit |
65 |
logical dowc01 |
66 |
logical dosmooth |
67 |
logical doscaling |
68 |
_RL xx_gen(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) |
69 |
_RS dummyRS(1) |
70 |
#ifdef ALLOW_ECCO |
71 |
_RL xx_gen_tmp(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) |
72 |
integer nyearsINT |
73 |
_RL nyearsRL |
74 |
#endif |
75 |
integer bi,bj |
76 |
integer i,j,k2 |
77 |
INTEGER ILNBLNK |
78 |
EXTERNAL ILNBLNK |
79 |
integer ilgen |
80 |
CEOP |
81 |
|
82 |
c-- Now, read the control vector. |
83 |
doglobalread = .false. |
84 |
ladinit = .false. |
85 |
|
86 |
DO bj=myByLo(myThid), myByHi(myThid) |
87 |
DO bi=myBxLo(myThid), myBxHi(myThid) |
88 |
DO j = 1-OLy,sNy+OLy |
89 |
DO i = 1-OLx,sNx+OLx |
90 |
xx_gen(i,j,bi,bj)=0. _d 0 |
91 |
ENDDO |
92 |
ENDDO |
93 |
ENDDO |
94 |
ENDDO |
95 |
|
96 |
C-- generic 2D control variables |
97 |
DO iarr = 1, maxCtrlTim2D |
98 |
|
99 |
diffrec=0 |
100 |
startrec=0 |
101 |
endrec=0 |
102 |
|
103 |
#ifndef ALLOW_OPENAD |
104 |
if (xx_gentim2d_weight(iarr).NE.' ') then |
105 |
#endif |
106 |
|
107 |
fnamebase = xx_gentim2d_file(iarr) |
108 |
call ctrl_init_rec ( fnamebase, |
109 |
I xx_gentim2d_startdate1(iarr), |
110 |
I xx_gentim2d_startdate2(iarr), |
111 |
I xx_gentim2d_period(iarr), |
112 |
I 1, |
113 |
O xx_gentim2d_startdate(1,iarr), |
114 |
O diffrec, startrec, endrec, |
115 |
I myThid ) |
116 |
|
117 |
dosmooth=.false. |
118 |
dowc01 = .false. |
119 |
doscaling=.true. |
120 |
|
121 |
numsmo=1 |
122 |
do k2 = 1, maxCtrlProc |
123 |
if (xx_gentim2d_preproc(k2,iarr).EQ.'WC01') then |
124 |
dowc01=.TRUE. |
125 |
if (xx_gentim2d_preproc_i(k2,iarr).NE.0) |
126 |
& numsmo=xx_gentim2d_preproc_i(k2,iarr) |
127 |
endif |
128 |
if ((.NOT.dowc01).AND. |
129 |
& (xx_gentim2d_preproc(k2,iarr).EQ.'smooth')) then |
130 |
dosmooth=.TRUE. |
131 |
if (xx_gentim2d_preproc_i(k2,iarr).NE.0) |
132 |
& numsmo=xx_gentim2d_preproc_i(k2,iarr) |
133 |
endif |
134 |
if (xx_gentim2d_preproc(k2,iarr).EQ.'noscaling') then |
135 |
doscaling=.FALSE. |
136 |
endif |
137 |
enddo |
138 |
|
139 |
fnamebase = xx_gentim2d_file(iarr) |
140 |
ilgen=ilnblnk( fnamebase ) |
141 |
write(fnamegenIn(1:80),'(2a,i10.10)') |
142 |
& fnamebase(1:ilgen),'.',optimcycle |
143 |
write(fnamegenOut(1:80),'(2a,i10.10)') |
144 |
& fnamebase(1:ilgen),'.effective.',optimcycle |
145 |
write(fnamegenTmp(1:80),'(2a,i10.10)') |
146 |
& fnamebase(1:ilgen),'.tmp.',optimcycle |
147 |
|
148 |
c-- docycle |
149 |
|
150 |
replicated_nrec=endrec |
151 |
replicated_ntimes=0 |
152 |
do k2 = 1, maxCtrlProc |
153 |
if (xx_gentim2d_preproc(k2,iarr).EQ.'docycle') then |
154 |
if (xx_gentim2d_preproc_i(k2,iarr).NE.0) then |
155 |
replicated_nrec=min(endrec,xx_gentim2d_preproc_i(k2,iarr)) |
156 |
replicated_ntimes= |
157 |
& int(float(endrec)/float(replicated_nrec)) |
158 |
if (replicated_ntimes*replicated_nrec.LT.endrec) |
159 |
& replicated_ntimes=replicated_ntimes+1 |
160 |
if (replicated_ntimes*replicated_nrec.GT.endrec) |
161 |
& replicated_ntimes=replicated_ntimes-1 |
162 |
endif |
163 |
endif |
164 |
enddo |
165 |
|
166 |
DO jrec = 1, replicated_ntimes+1 |
167 |
DO irec = 1, replicated_nrec |
168 |
#ifdef ALLOW_AUTODIFF |
169 |
CADJ STORE xx_gentim2d_dummy = ctrltape, key = 1 , kind = isbyte |
170 |
#endif |
171 |
krec=replicated_nrec*(jrec-1)+irec |
172 |
IF (krec.LE.endrec) THEN |
173 |
#ifdef ALLOW_AUTODIFF |
174 |
call active_read_xy( fnamegenIn, xx_gen, irec, |
175 |
& doglobalread, ladinit, optimcycle, |
176 |
& mythid, xx_gentim2d_dummy(iarr) ) |
177 |
#else |
178 |
CALL READ_REC_XY_RL( fnamegenIn, xx_gen, iRec, 1, myThid ) |
179 |
#endif |
180 |
#ifdef ALLOW_AUTODIFF |
181 |
call active_write_xy( fnamegenOut, xx_gen, krec, optimcycle, |
182 |
& mythid, xx_gentim2d_dummy(iarr) ) |
183 |
#else |
184 |
CALL WRITE_REC_XY_RL( fnamegenOut, xx_gen, iRec, 1, myThid ) |
185 |
#endif |
186 |
ENDIF |
187 |
ENDDO |
188 |
ENDDO |
189 |
|
190 |
c-- rmcycle |
191 |
#ifdef ALLOW_ECCO |
192 |
replicated_nrec=endrec |
193 |
replicated_ntimes=0 |
194 |
do k2 = 1, maxCtrlProc |
195 |
if (xx_gentim2d_preproc(k2,iarr).EQ.'rmcycle') then |
196 |
if (xx_gentim2d_preproc_i(k2,iarr).NE.0) then |
197 |
replicated_nrec=min(endrec,xx_gentim2d_preproc_i(k2,iarr)) |
198 |
replicated_ntimes= |
199 |
& int(float(endrec)/float(replicated_nrec)) |
200 |
if (replicated_ntimes*replicated_nrec.LT.endrec) |
201 |
& replicated_ntimes=replicated_ntimes+1 |
202 |
if (replicated_ntimes*replicated_nrec.GT.endrec) |
203 |
& replicated_ntimes=replicated_ntimes-1 |
204 |
endif |
205 |
endif |
206 |
enddo |
207 |
|
208 |
c print*,'endrec',endrec,replicated_ntimes,replicated_nrec |
209 |
|
210 |
IF (replicated_ntimes.GT.0) THEN |
211 |
|
212 |
c create cyclic average |
213 |
|
214 |
nyearsINT=1+int((endrec-replicated_nrec)/replicated_nrec) |
215 |
nyearsRL=float(nyearsINT) |
216 |
|
217 |
c print*,'nyearsINT',nyearsINT,nyearsRL |
218 |
|
219 |
DO irec = 1, replicated_nrec |
220 |
|
221 |
call ecco_zero(xx_gen,1,zeroRL,myThid) |
222 |
|
223 |
do jrec=1,nyearsINT |
224 |
#ifdef ALLOW_AUTODIFF |
225 |
CADJ STORE xx_gentim2d_dummy = ctrltape, key = 1 , kind = isbyte |
226 |
#endif |
227 |
krec=irec+(jrec-1)*replicated_nrec |
228 |
#ifdef ALLOW_AUTODIFF |
229 |
call active_read_xy( fnamegenOut, xx_gen_tmp, krec, |
230 |
& doglobalread, ladinit, optimcycle, |
231 |
& mythid, xx_gentim2d_dummy(iarr) ) |
232 |
#else |
233 |
CALL READ_REC_XY_RL( fnamegenOut, xx_gen_tmp, krec, |
234 |
& 1, myThid ) |
235 |
#endif |
236 |
call ecco_add(xx_gen_tmp,1,xx_gen,1,myThid) |
237 |
enddo |
238 |
|
239 |
call ecco_div(xx_gen,1,nyearsRL,myThid) |
240 |
|
241 |
#ifdef ALLOW_AUTODIFF |
242 |
CADJ STORE xx_gentim2d_dummy = ctrltape, key = 1 , kind = isbyte |
243 |
#endif |
244 |
|
245 |
#ifdef ALLOW_AUTODIFF |
246 |
call active_write_xy( fnamegenTmp, xx_gen, iRec, optimcycle, |
247 |
& mythid, xx_gentim2d_dummy(iarr) ) |
248 |
#else |
249 |
CALL WRITE_REC_XY_RL( fnamegenTmp, xx_gen, iRec, 1, myThid ) |
250 |
#endif |
251 |
|
252 |
ENDDO |
253 |
|
254 |
c subtract cyclic average |
255 |
DO jrec = 1, replicated_ntimes+1 |
256 |
DO irec = 1, replicated_nrec |
257 |
#ifdef ALLOW_AUTODIFF |
258 |
CADJ STORE xx_gentim2d_dummy = ctrltape, key = 1 , kind = isbyte |
259 |
#endif |
260 |
krec=replicated_nrec*(jrec-1)+irec |
261 |
IF (krec.LE.endrec) THEN |
262 |
#ifdef ALLOW_AUTODIFF |
263 |
CALL active_read_xy( fnamegenOut, xx_gen, kRec, |
264 |
& doglobalread, ladinit, optimcycle, |
265 |
& mythid, xx_gentim2d_dummy(iarr) ) |
266 |
#else |
267 |
CALL READ_REC_XY_RL( fnamegenOut, xx_gen, kRec, 1, myThid ) |
268 |
#endif |
269 |
#ifdef ALLOW_AUTODIFF |
270 |
CALL active_read_xy( fnamegenTmp, xx_gen_tmp, iRec, |
271 |
& doglobalread, ladinit, optimcycle, |
272 |
& mythid, xx_gentim2d_dummy(iarr) ) |
273 |
#else |
274 |
CALL READ_REC_XY_RL( fnamegenTmp, xx_gen_tmp, iRec, 1, myThid ) |
275 |
#endif |
276 |
CALL ecco_subtract(xx_gen_tmp,1,xx_gen,1,myThid) |
277 |
#ifdef ALLOW_AUTODIFF |
278 |
CALL active_write_xy( fnamegenOut, xx_gen, kRec, optimcycle, |
279 |
& mythid, xx_gentim2d_dummy(iarr) ) |
280 |
#else |
281 |
CALL WRITE_REC_XY_RL( fnamegenOut, xx_gen, kRec, 1, myThid ) |
282 |
#endif |
283 |
ENDIF |
284 |
ENDDO |
285 |
ENDDO |
286 |
|
287 |
ENDIF |
288 |
#endif /* ifdef ALLOW_ECCO */ |
289 |
|
290 |
c-- scaling and smoothing |
291 |
|
292 |
DO irec = 1, endrec |
293 |
#ifdef ALLOW_AUTODIFF |
294 |
CADJ STORE xx_gentim2d_dummy = ctrltape, key = 1 , kind = isbyte |
295 |
#endif |
296 |
|
297 |
#ifdef ALLOW_AUTODIFF |
298 |
call active_read_xy( fnamegenOut, xx_gen, irec, |
299 |
& doglobalread, ladinit, optimcycle, |
300 |
& mythid, xx_gentim2d_dummy(iarr) ) |
301 |
#else |
302 |
CALL READ_REC_XY_RL( fnamegenOut, xx_gen, iRec, 1, myThid ) |
303 |
#endif |
304 |
|
305 |
#ifndef ALLOW_OPENAD |
306 |
jrec=1 |
307 |
do k2 = 1, maxCtrlProc |
308 |
if (xx_gentim2d_preproc(k2,iarr).EQ.'variaweight') jrec=irec |
309 |
enddo |
310 |
CALL MDS_READ_FIELD( xx_gentim2d_weight(iarr),ctrlprec, |
311 |
& .FALSE.,'RL',1,1,1,wgentim2d(1-Olx,1-Oly,1,1,iarr), |
312 |
& dummyRS,jrec,myThid ) |
313 |
|
314 |
#ifdef ALLOW_SMOOTH |
315 |
IF (useSMOOTH) THEN |
316 |
IF (dowc01) call smooth_correl2d(xx_gen,maskC,numsmo,mythid) |
317 |
IF (dosmooth) call smooth2d(xx_gen,maskC,numsmo,mythid) |
318 |
ENDIF |
319 |
#endif /* ALLOW_SMOOTH */ |
320 |
|
321 |
IF (doscaling) then |
322 |
DO bj=myByLo(myThid), myByHi(myThid) |
323 |
DO bi=myBxLo(myThid), myBxHi(myThid) |
324 |
DO j = 1,sNy |
325 |
DO i = 1,sNx |
326 |
if ((maskC(i,j,1,bi,bj).NE.0.).AND. |
327 |
& (wgentim2d(i,j,bi,bj,iarr).GT.0.)) then |
328 |
xx_gen(i,j,bi,bj)=xx_gen(i,j,bi,bj) |
329 |
& /sqrt(wgentim2d(i,j,bi,bj,iarr)) |
330 |
else |
331 |
xx_gen(i,j,bi,bj)=0. _d 0 |
332 |
endif |
333 |
ENDDO |
334 |
ENDDO |
335 |
ENDDO |
336 |
ENDDO |
337 |
ENDIF ! IF (doscaling) then |
338 |
#endif /* ALLOW_OPENAD */ |
339 |
|
340 |
CALL CTRL_BOUND_2D(xx_gen,maskC, |
341 |
& xx_gentim2d_bounds(1,iarr),myThid) |
342 |
|
343 |
CALL EXCH_XY_RL ( xx_gen , myThid ) |
344 |
|
345 |
#ifdef ALLOW_AUTODIFF |
346 |
call active_write_xy( fnamegenOut, xx_gen, irec, optimcycle, |
347 |
& mythid, xx_gentim2d_dummy(iarr) ) |
348 |
#else |
349 |
CALL WRITE_REC_XY_RL( fnamegenOut, xx_gen, iRec, 1, myThid ) |
350 |
#endif |
351 |
|
352 |
c-- end irec loop |
353 |
ENDDO |
354 |
|
355 |
#ifndef ALLOW_OPENAD |
356 |
endif |
357 |
#endif |
358 |
|
359 |
c-- end iarr loop |
360 |
ENDDO |
361 |
|
362 |
#endif /* ALLOW_GENTIM2D_CONTROL */ |
363 |
|
364 |
RETURN |
365 |
END |
366 |
|