/[MITgcm]/MITgcm/pkg/ctrl/ctrl_map_ini_gentim2d.F
ViewVC logotype

Annotation of /MITgcm/pkg/ctrl/ctrl_map_ini_gentim2d.F

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


Revision 1.9 - (hide annotations) (download)
Wed May 27 18:33:43 2015 UTC (10 years, 1 month ago) by gforget
Branch: MAIN
Changes since 1.8: +3 -3 lines
- fix xx_gentim2d_preproc_r type
- rename 'replicate' as 'docycle'
- define 'doglomean' and 'documul' pre-processing option
- improve summary

1 gforget 1.9 C $Header: /u/gcmpack/MITgcm/pkg/ctrl/ctrl_map_ini_gentim2d.F,v 1.8 2015/05/26 21:34:42 gforget Exp $
2 gforget 1.1 C $Name: $
3    
4     #include "CTRL_OPTIONS.h"
5 gforget 1.3 #ifdef ALLOW_AUTODIFF
6     # include "AUTODIFF_OPTIONS.h"
7     #endif
8 gforget 1.1
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 gforget 1.3 #ifdef ALLOW_AUTODIFF
41     #include "tamc.h"
42     #endif
43 gforget 1.1
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 smoothOpNb
53     character*(80) fnamegenIn
54     character*(80) fnamegenOut
55 gforget 1.8 character*(80) fnamegenTmp
56 heimbach 1.5 character*(80) fnamebase
57 gforget 1.1 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     _RL xx_gen(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
66 gforget 1.8 #ifdef ALLOW_ECCO
67     _RL xx_gen_tmp(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
68     integer nyearsINT
69     _RL nyearsRL
70     #endif
71 gforget 1.1 integer bi,bj
72     integer i,j,k2
73     INTEGER ILNBLNK
74     EXTERNAL ILNBLNK
75     integer ilgen
76     CEOP
77    
78     c-- Now, read the control vector.
79     doglobalread = .false.
80     ladinit = .false.
81    
82     C-- generic 2D control variables
83     DO iarr = 1, maxCtrlTim2D
84    
85 gforget 1.3 diffrec=0
86     startrec=0
87     endrec=0
88    
89 heimbach 1.5 #ifndef ALLOW_OPENAD
90 gforget 1.1 if (xx_gentim2d_weight(iarr).NE.' ') then
91 heimbach 1.5 #endif
92 gforget 1.1
93 heimbach 1.5 fnamebase = xx_gentim2d_file(iarr)
94     call ctrl_init_rec ( fnamebase,
95 gforget 1.1 I xx_gentim2d_startdate1(iarr),
96     I xx_gentim2d_startdate2(iarr),
97     I xx_gentim2d_period(iarr),
98     I 1,
99     O xx_gentim2d_startdate(1,iarr),
100     O diffrec, startrec, endrec,
101     I myThid )
102    
103     smoothOpNb=1
104     do k2 = 1, maxCtrlProc
105     if (xx_gentim2d_preproc(k2,iarr).EQ.'smooth') then
106     if (xx_gentim2d_preproc_i(k2,iarr).NE.0)
107     & smoothOpNb=xx_gentim2d_preproc_i(k2,iarr)
108     endif
109     enddo
110    
111 gforget 1.8 fnamebase = xx_gentim2d_file(iarr)
112     ilgen=ilnblnk( fnamebase )
113     write(fnamegenIn(1:80),'(2a,i10.10)')
114     & fnamebase(1:ilgen),'.',optimcycle
115     write(fnamegenOut(1:80),'(2a,i10.10)')
116     & fnamebase(1:ilgen),'.effective.',optimcycle
117     write(fnamegenTmp(1:80),'(2a,i10.10)')
118     & fnamebase(1:ilgen),'.tmp.',optimcycle
119    
120 gforget 1.9 c-- docycle
121 gforget 1.8
122 gforget 1.1 replicated_nrec=endrec
123     replicated_ntimes=0
124     do k2 = 1, maxCtrlProc
125 gforget 1.9 if (xx_gentim2d_preproc(k2,iarr).EQ.'docycle') then
126 gforget 1.1 if (xx_gentim2d_preproc_i(k2,iarr).NE.0) then
127     replicated_nrec=min(endrec,xx_gentim2d_preproc_i(k2,iarr))
128     replicated_ntimes=
129     & int(float(endrec)/float(replicated_nrec))
130     if (replicated_ntimes*replicated_nrec.LT.endrec)
131     & replicated_ntimes=replicated_ntimes+1
132     if (replicated_ntimes*replicated_nrec.GT.endrec)
133     & replicated_ntimes=replicated_ntimes-1
134     endif
135     endif
136     enddo
137    
138 gforget 1.7 DO jrec = 1, replicated_ntimes+1
139 gforget 1.1 DO irec = 1, replicated_nrec
140 gforget 1.3 #ifdef ALLOW_AUTODIFF
141     CADJ STORE xx_gentim2d_dummy = ctrltape, key = 1 , kind = isbyte
142     #endif
143 gforget 1.7 krec=replicated_nrec*(jrec-1)+irec
144     IF (krec.LE.endrec) THEN
145     #ifdef ALLOW_AUTODIFF
146     call active_read_xy( fnamegenIn, xx_gen, irec,
147     & doglobalread, ladinit, optimcycle,
148     & mythid, xx_gentim2d_dummy(iarr) )
149     #else
150     CALL READ_REC_XY_RL( fnamegenIn, xx_gen, iRec, 1, myThid )
151     #endif
152     #ifdef ALLOW_AUTODIFF
153     call active_write_xy( fnamegenOut, xx_gen, krec, optimcycle,
154     & mythid, xx_gentim2d_dummy(iarr) )
155     #else
156     CALL WRITE_REC_XY_RL( fnamegenOut, xx_gen, iRec, 1, myThid )
157     #endif
158     ENDIF
159     ENDDO
160     ENDDO
161    
162 gforget 1.8 c-- rmcycle
163     #ifdef ALLOW_ECCO
164     replicated_nrec=endrec
165     replicated_ntimes=0
166     do k2 = 1, maxCtrlProc
167     if (xx_gentim2d_preproc(k2,iarr).EQ.'rmcycle') then
168     if (xx_gentim2d_preproc_i(k2,iarr).NE.0) then
169     replicated_nrec=min(endrec,xx_gentim2d_preproc_i(k2,iarr))
170     replicated_ntimes=
171     & int(float(endrec)/float(replicated_nrec))
172     if (replicated_ntimes*replicated_nrec.LT.endrec)
173     & replicated_ntimes=replicated_ntimes+1
174     if (replicated_ntimes*replicated_nrec.GT.endrec)
175     & replicated_ntimes=replicated_ntimes-1
176     endif
177     endif
178     enddo
179    
180     print*,'endrec',endrec,replicated_ntimes,replicated_nrec
181    
182     IF (replicated_ntimes.GT.0) THEN
183    
184     c create cyclic average
185    
186     nyearsINT=1+int((endrec-replicated_nrec)/replicated_nrec)
187     nyearsRL=float(nyearsINT)
188    
189     print*,'nyearsINT',nyearsINT,nyearsRL
190    
191     DO irec = 1, replicated_nrec
192    
193     call ecco_zero(xx_gen,1,zeroRL,myThid)
194    
195     do jrec=1,nyearsINT
196     #ifdef ALLOW_AUTODIFF
197     CADJ STORE xx_gentim2d_dummy = ctrltape, key = 1 , kind = isbyte
198     #endif
199     krec=irec+(jrec-1)*replicated_nrec
200     #ifdef ALLOW_AUTODIFF
201     call active_read_xy( fnamegenOut, xx_gen_tmp, krec,
202     & doglobalread, ladinit, optimcycle,
203     & mythid, xx_gentim2d_dummy(iarr) )
204     #else
205     CALL READ_REC_XY_RL( fnamegenOut, xx_gen_tmp, krec, 1, myThid )
206     #endif
207     call ecco_add(xx_gen_tmp,1,xx_gen,1,myThid)
208     enddo
209    
210     call ecco_div(xx_gen,1,nyearsRL,myThid)
211    
212     #ifdef ALLOW_AUTODIFF
213     CADJ STORE xx_gentim2d_dummy = ctrltape, key = 1 , kind = isbyte
214     #endif
215    
216     #ifdef ALLOW_AUTODIFF
217     call active_write_xy( fnamegenTmp, xx_gen, iRec, optimcycle,
218     & mythid, xx_gentim2d_dummy(iarr) )
219     #else
220     CALL WRITE_REC_XY_RL( fnamegenTmp, xx_gen, iRec, 1, myThid )
221     #endif
222    
223     ENDDO
224    
225     c subtract cyclic average
226     DO jrec = 1, replicated_ntimes+1
227     DO irec = 1, replicated_nrec
228     #ifdef ALLOW_AUTODIFF
229     CADJ STORE xx_gentim2d_dummy = ctrltape, key = 1 , kind = isbyte
230     #endif
231     krec=replicated_nrec*(jrec-1)+irec
232     IF (krec.LE.endrec) THEN
233     #ifdef ALLOW_AUTODIFF
234     CALL active_read_xy( fnamegenOut, xx_gen, kRec,
235     & doglobalread, ladinit, optimcycle,
236     & mythid, xx_gentim2d_dummy(iarr) )
237     #else
238     CALL READ_REC_XY_RL( fnamegenOut, xx_gen, kRec, 1, myThid )
239     #endif
240     #ifdef ALLOW_AUTODIFF
241     CALL active_read_xy( fnamegenTmp, xx_gen_tmp, iRec,
242     & doglobalread, ladinit, optimcycle,
243     & mythid, xx_gentim2d_dummy(iarr) )
244     #else
245     CALL READ_REC_XY_RL( fnamegenTmp, xx_gen_tmp, iRec, 1, myThid )
246     #endif
247     CALL ecco_subtract(xx_gen_tmp,1,xx_gen,1,myThid)
248     #ifdef ALLOW_AUTODIFF
249     CALL active_write_xy( fnamegenOut, xx_gen, kRec, optimcycle,
250     & mythid, xx_gentim2d_dummy(iarr) )
251     #else
252     CALL WRITE_REC_XY_RL( fnamegenOut, xx_gen, kRec, 1, myThid )
253     #endif
254     ENDIF
255     ENDDO
256     ENDDO
257    
258     ENDIF
259     #endif /* ifdef ALLOW_ECCO */
260    
261     c-- scaling and smoothing
262 gforget 1.7
263     DO irec = 1, endrec
264     #ifdef ALLOW_AUTODIFF
265     CADJ STORE xx_gentim2d_dummy = ctrltape, key = 1 , kind = isbyte
266     #endif
267 gforget 1.1
268 gforget 1.6 #ifdef ALLOW_AUTODIFF
269 gforget 1.8 call active_read_xy( fnamegenOut, xx_gen, irec,
270 gforget 1.1 & doglobalread, ladinit, optimcycle,
271     & mythid, xx_gentim2d_dummy(iarr) )
272 gforget 1.6 #else
273 gforget 1.8 CALL READ_REC_XY_RL( fnamegenOut, xx_gen, iRec, 1, myThid )
274 gforget 1.6 #endif
275 gforget 1.1
276 heimbach 1.5 #ifndef ALLOW_OPENAD
277 gforget 1.7 jrec=1
278 gforget 1.1 do k2 = 1, maxCtrlProc
279 gforget 1.7 if (xx_gentim2d_preproc(k2,iarr).EQ.'variaweight') jrec=irec
280 gforget 1.1 enddo
281 gforget 1.7 call mdsreadfield( xx_gentim2d_weight(iarr), ctrlprec, 'RL',
282     & 1, wgentim2d(1-Olx,1-Oly,1,1,iarr), jrec, myThid )
283 heimbach 1.5 #endif
284 gforget 1.1
285     #ifdef ALLOW_SMOOTH
286     IF ( ctrlSmoothCorrel2D ) THEN
287     IF ( useSMOOTH ) THEN
288     call smooth_correl2D(xx_gen,maskC,smoothOpNb,mythid)
289    
290     DO bj=myByLo(myThid), myByHi(myThid)
291     DO bi=myBxLo(myThid), myBxHi(myThid)
292     DO j = 1,sNy
293     DO i = 1,sNx
294     if ((maskC(i,j,1,bi,bj).NE.0.).AND.
295     & (wgentim2d(i,j,bi,bj,iarr).GT.0.)) then
296     xx_gen(i,j,bi,bj)=xx_gen(i,j,bi,bj)
297     & /sqrt(wgentim2d(i,j,bi,bj,iarr))
298     else
299     xx_gen(i,j,bi,bj)=0. _d 0
300     endif
301     ENDDO
302     ENDDO
303     ENDDO
304     ENDDO
305    
306 gforget 1.4 CALL EXCH_XY_RL ( xx_gen , myThid )
307 gforget 1.1 ENDIF
308     ENDIF
309     #endif /* ALLOW_SMOOTH */
310    
311 gforget 1.6
312     #ifdef ALLOW_AUTODIFF
313 gforget 1.1 call active_write_xy( fnamegenOut, xx_gen, irec, optimcycle,
314     & mythid, xx_gentim2d_dummy(iarr) )
315 gforget 1.6 #else
316     CALL WRITE_REC_XY_RL( fnamegenOut, xx_gen, iRec, 1, myThid )
317     #endif
318 gforget 1.1
319     c-- end irec loop
320     ENDDO
321    
322 heimbach 1.5 #ifndef ALLOW_OPENAD
323 gforget 1.1 endif
324 heimbach 1.5 #endif
325 gforget 1.1
326     c-- end iarr loop
327     ENDDO
328    
329     #endif /* ALLOW_GENTIM2D_CONTROL */
330    
331     RETURN
332     END
333    

  ViewVC Help
Powered by ViewVC 1.1.22