/[MITgcm]/MITgcm_contrib/quarter_degree_global/code_srdiags_call/srdiags_f77.F
ViewVC logotype

Annotation of /MITgcm_contrib/quarter_degree_global/code_srdiags_call/srdiags_f77.F

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


Revision 1.1 - (hide annotations) (download)
Fri Jul 28 22:12:12 2006 UTC (19 years ago) by cnh
Branch: MAIN
Mods to call sub-region diags

1 cnh 1.1 #include "CPP_OPTIONS.h"
2    
3     SUBROUTINE SRDIAGS_F77_INIT( myThid )
4    
5     C == Global declarations ==
6     USE SRDIAGS
7     IMPLICIT NONE
8    
9     #include "SIZE.h"
10     #include "EEPARAMS.h"
11     #include "EESUPPORT.h"
12     #include "SRDIAG.h"
13    
14     C == Routine arguments ==
15     INTEGER myThid
16    
17     C == Local variables ==
18     CHARACTER*512 srFnamePref
19     REAL*8 ap
20     TYPE(SRDIAG_SPEC), POINTER :: diagVar
21     INTEGER I, J
22     INTEGER iG, jG, bi, bj
23    
24     CALL SRDIAG_INIT( myThid )
25    
26     C Sub-region 1, 4 hourly averaged diagnostic field
27     C Sub-region 2, 12 hourly averaged open boundary fields for rerun
28     DO I=1, 2
29     WRITE( srFnamePref, '(A,I4.4,A,I6.6)' )
30     & 'srdiag.',I,'.',myProcId
31     IF ( I .EQ. 1 ) THEN
32     ap = 3600. _d 0 * 4. _d 0
33     ap = 3600. _d 0 * 24. _d 0 * 2. _d 0
34     ENDIF
35     IF ( I .EQ. 2 ) THEN
36     ap = 3600. _d 0 * 12. _d 0
37     ap = 3600. _d 0 * 24. _d 0 * 5. _d 0
38     ENDIF
39     IF ( I.EQ.1) THEN
40     CALL SRDIAG_CREATE( dv1, ap, srFnamePref, myThid )
41     ENDIF
42     IF ( I.EQ.2) THEN
43     CALL SRDIAG_CREATE( dv2, ap, srFnamePref, myThid )
44     ENDIF
45     ENDDO
46     C
47     C Add regions
48     C sr 1
49     diagVar => dv1
50     DO bj=myByLo(myThid),myByHi(myThid)
51     DO bi=myBxLo(myThid),myBxHi(myThid)
52     C-- "Global" index (place holder)
53     jG = myYGlobalLo + (bj-1)*sNy
54     iG = myXGlobalLo + (bi-1)*sNx
55     C-- North Atlantic
56     CALL SRDIAG_ADD_REGION(
57     I iG, jG, 1,
58     I sNx, sNy, Nr,
59     I 65, 18, 1,
60     I 26, 20, 10,
61     U diagVar,
62     I myThid )
63     CALL SRDIAG_ADD_REGION(
64     I iG, jG, 1,
65     I sNx, sNy, Nr,
66     I 1, 18, 1,
67     I 6, 20, 10,
68     U diagVar,
69     I myThid )
70     C-- Hawaii
71     CALL SRDIAG_ADD_REGION(
72     I iG, jG, 1,
73     I sNx, sNy, Nr,
74     I 46, 20, 1,
75     I 6, 6, 10,
76     U diagVar,
77     I myThid )
78     C-- Kuroishio
79     CALL SRDIAG_ADD_REGION(
80     I iG, jG, 1,
81     I sNx, sNy, Nr,
82     I 32, 22, 1,
83     I 10, 6, 10,
84     U diagVar,
85     I myThid )
86     C-- Drake passage
87     CALL SRDIAG_ADD_REGION(
88     I iG, jG, 1,
89     I sNx, sNy, Nr,
90     I 60, 3, 1,
91     I 23, 7, 10,
92     U diagVar,
93     I myThid )
94     ENDDO
95     ENDDO
96     C sr 2
97     diagVar => dv2
98     C full depth slice every ten cells
99     DO bj=myByLo(myThid),myByHi(myThid)
100     DO bi=myBxLo(myThid),myBxHi(myThid)
101     C-- "Global" index (place holder)
102     jG = myYGlobalLo + (bj-1)*sNy
103     iG = myXGlobalLo + (bi-1)*sNx
104     C-- constant I lines
105     DO I=iG,iG+sNx-1
106     IF ( INT(I/10)*10 .EQ. I ) THEN
107     CALL SRDIAG_ADD_REGION(
108     I iG, jG, 1,
109     I sNx, sNy, Nr,
110     I I, jG, 1,
111     I 1, sNy, Nr,
112     U diagVar,
113     I myThid )
114     ENDIF
115     ENDDO
116     C-- constant J lines
117     DO J=jG,jG+sNy-1
118     IF ( INT(J/10)*10 .EQ. J ) THEN
119     CALL SRDIAG_ADD_REGION(
120     I iG, jG, 1,
121     I sNx, sNy, Nr,
122     I iG, J, 1,
123     I sNx, 1, Nr,
124     U diagVar,
125     I myThid )
126     ENDIF
127     ENDDO
128     ENDDO
129     ENDDO
130    
131     RETURN
132     END
133    
134     SUBROUTINE SRDIAGS_F77_ADDCODES( myThid )
135    
136     C == Global declarations ==
137     USE SRDIAGS
138     IMPLICIT NONE
139    
140     #include "SIZE.h"
141     #include "EEPARAMS.h"
142     #include "EESUPPORT.h"
143     #include "PARAMS.h"
144     #include "SRDIAG.h"
145    
146     C == Routine arguments ==
147     INTEGER myThid
148    
149     C == Local variables ==
150     CHARACTER*512 fCode
151     INTEGER bi, bj, iG, jG
152     TYPE(SRDIAG_SPEC), POINTER :: diagVar
153     INTEGER I
154    
155     DO I=1, 2
156     IF ( I.EQ. 1 ) THEN
157     diagVar => dv1
158     ENDIF
159     IF ( I.EQ. 2 ) THEN
160     diagVar => dv2
161     ENDIF
162     DO bj=myByLo(myThid),myByHi(myThid)
163     DO bi=myBxLo(myThid),myBxHi(myThid)
164    
165     WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'ETAN:',bi,':',bj
166     jG = myYGlobalLo + (bj-1)*sNy
167     iG = myXGlobalLo + (bi-1)*sNx
168     CALL SRDIAG_ADD_FCODE(fCode, (/iG-1, jG-1, 0/),
169     I 'XYZ',diagVar, deltatClock, myThid )
170    
171     WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'UVEL:',bi,':',bj
172     jG = myYGlobalLo + (bj-1)*sNy
173     iG = myXGlobalLo + (bi-1)*sNx
174     CALL SRDIAG_ADD_FCODE(fCode, (/iG-1, jG-1, 0/),
175     I 'XYZ',diagVar, deltatClock, myThid )
176    
177     WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'VVEL:',bi,':',bj
178     jG = myYGlobalLo + (bj-1)*sNy
179     iG = myXGlobalLo + (bi-1)*sNx
180     CALL SRDIAG_ADD_FCODE(fCode, (/iG-1, jG-1, 0/),
181     I 'XYZ',diagVar, deltatClock, myThid )
182    
183     WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'WVEL:',bi,':',bj
184     jG = myYGlobalLo + (bj-1)*sNy
185     iG = myXGlobalLo + (bi-1)*sNx
186     CALL SRDIAG_ADD_FCODE(fCode, (/iG-1, jG-1, 0/),
187     I 'XYZ',diagVar, deltatClock, myThid )
188    
189     WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'SALTanom:',bi,':',bj
190     jG = myYGlobalLo + (bj-1)*sNy
191     iG = myXGlobalLo + (bi-1)*sNx
192     CALL SRDIAG_ADD_FCODE(fCode, (/iG-1, jG-1, 0/),
193     I 'XYZ',diagVar, deltatClock, myThid )
194    
195     WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'SALT:',bi,':',bj
196     jG = myYGlobalLo + (bj-1)*sNy
197     iG = myXGlobalLo + (bi-1)*sNx
198     CALL SRDIAG_ADD_FCODE(fCode, (/iG-1, jG-1, 0/),
199     I 'XYZ',diagVar, deltatClock, myThid )
200    
201     WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'THETA:',bi,':',bj
202     jG = myYGlobalLo + (bj-1)*sNy
203     iG = myXGlobalLo + (bi-1)*sNx
204     CALL SRDIAG_ADD_FCODE(fCode, (/iG-1, jG-1, 0/),
205     I 'XYZ',diagVar, deltatClock, myThid )
206    
207     WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'WVELMASS:',bi,':',bj
208     jG = myYGlobalLo + (bj-1)*sNy
209     iG = myXGlobalLo + (bi-1)*sNx
210     CALL SRDIAG_ADD_FCODE(fCode, (/iG-1, jG-1, 0/),
211     I 'XYZ',diagVar, deltatClock, myThid )
212    
213     WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'RHOAnoma:',bi,':',bj
214     jG = myYGlobalLo + (bj-1)*sNy
215     iG = myXGlobalLo + (bi-1)*sNx
216     CALL SRDIAG_ADD_FCODE(fCode, (/iG-1, jG-1, 0/),
217     I 'XYZ',diagVar, deltatClock, myThid )
218    
219     ENDDO
220     ENDDO
221     ENDDO
222    
223     RETURN
224     END
225    
226     ! CALL SRDIAGS_F77_FILL( charDiag,
227     ! I inpFld, iFldParms, biArg, bjArg,
228     ! I myThid)
229    
230     SUBROUTINE SRDIAGS_F77_FILL( fName,
231     I inpFld, iFldParms, biArg, bjArg,
232     I myThid )
233    
234     C == Global declarations ==
235     USE SRDIAGS
236     IMPLICIT NONE
237    
238     #include "SIZE.h"
239     #include "EEPARAMS.h"
240     #include "EESUPPORT.h"
241     #include "DYNVARS.h"
242     #include "SRDIAG.h"
243    
244     C == Routine arguments ==
245     CHARACTER*8 fName
246     _RL inpFld(*)
247     INTEGER iFldParms(8)
248     INTEGER biArg
249     INTEGER bjArg
250     INTEGER myThid
251    
252     C == Local variables ==
253     REAL*8, POINTER :: srBuf( :,:,:,:,:)
254     REAL*8, POINTER :: srTemp( :,:,:)
255     REAL*8, POINTER :: tempBuf(:,:,:,:,:)
256     INTEGER iLo, iHi, jLo, jHi, srK, biLo, biHi, bjLo, bjHi
257     INTEGER kLev, mynR, mynTx, mynTy
258     INTEGER iLoInp, iHiInp, jLoInp, jHiInp, srKLo, srKHi
259     INTEGER I,J,K,bi,bj,iB
260    
261     CHARACTER*512 fCode
262     TYPE(SRDIAG_SPEC), POINTER :: diagVar
263    
264     ! PRINT *, 'SRDIAGS_FILE fName ', fName
265     ! PRINT *, ' iLo, iHi, jLo, jHi',
266     ! & iFldParms(1), iFldParms(2), iFldParms(3), iFldParms(4)
267     ! PRINT *, ' nR, kLev ', iFldParms(5), iFldParms(8)
268     ! PRINT *, ' nTx, nTy ', iFldParms(6), iFldParms(7)
269     ! PRINT *, ' biArg, bjArg ', biArg, bjArg
270    
271     C Figure out dimensions of buffer to use
272     C Horiz extents
273     iLo = 1
274     iHi = sNx
275     jLo = 1
276     jHi = sNy
277     iLoInp = iFldParms(1)
278     iHiInp = iFldParms(2)
279     jLoInp = iFldParms(3)
280     jHiInp = iFldParms(4)
281     C Vertical
282     kLev = iFldParms(8)
283     mynR = iFldParms(5)
284     IF ( kLev .EQ. 0 ) THEN
285     C All levels have been given
286     srKLo = 1
287     srKHi = mynR
288     ENDIF
289     IF ( kLev .GT. 0 ) THEN
290     C A specific level has been given
291     srKLo = kLev
292     srKHi = kLev
293     ENDIF
294     mynTx = iFldParms(6)
295     mynTy = iFldParms(7)
296     C The lines below do not work for multi-threaded decomposition
297     C For multi-threaded decomp. biLo would not be 1, with the
298     C values from myBiLo etc...
299     IF ( mynTx .GT. 1 .OR. mynTy .GT. 1 ) THEN
300     C We have multiple tiles passed in.
301     biLo=1
302     biHi=mynTx
303     bjLo=1
304     bjHi=mynTy
305     ELSE
306     C We have one tile passed in.
307     biLo=biArg
308     biHi=biArg
309     bjLo=bjArg
310     bjHi=bjArg
311     ENDIF
312    
313     ALLOCATE( srBuf(iLo:iHi,jLo:jHi,srKLo:srKHi,biLo:biHi,bjLo:bjHi) )
314     ! ALLOCATE( srTemp(iLo:iHi,jLo:jHi,srKLo:srKHi) )
315    
316     ! Unravel inpFld
317     ALLOCATE(
318     & tempBuf(iLoInp:iHiInp,jLoInp:jHiInp,
319     & srKLo:srKHi,biLo:biHi,bjLo:bjHi)
320     &)
321     iB = 0
322     DO bj=bjLo,bjHi
323     DO bi=biLo,biHi
324     DO K=srKLo,srKHi
325     DO J=jLoInp,jHiInp
326     DO I=iLoInp,iHiInp
327     iB = iB+1
328     tempBuf(I,J,K,bi,bj)=inpFld(iB)
329     ENDDO
330     ENDDO
331     ENDDO
332     ENDDO
333     ENDDO
334     ! IF ( fName .EQ. 'ETAN' ) THEN
335     ! PRINT *, ' bjLo, bjHi, biLo, biHi ', bjLo, bjHi, biLo, biHi
336     ! PRINT *, ' srKlo, srKHi ', srKLo, srKHi
337     ! ENDIF
338    
339     ! Extract the part we are interested in
340     ! ALLOCATE( srTemp(iLo:iHi,jLo:jHi,srKLo:srKHi) )
341     srBuf =
342     & tempBuf(iLo:iHi,jLo:jHi,srKLo:srKHi,biLo:biHi,bjLo:bjHi)
343     DEALLOCATE(tempBuf)
344    
345     ! Push output to srdiags buffers
346     ALLOCATE( srTemp(iLo:iHi,jLo:jHi,srKLo:srKHi) )
347     DO bj=bjLo,bjHi
348     DO bi=biLo,biHi
349     srTemp = srBuf(:,:,:,bi,bj)
350     ! IF ( fName .EQ. 'ETAN' ) THEN
351     diagVar => dv1
352     WRITE( fCode, '(A,A,I4.4,A,I4.4)' ) TRIM(fName),':',bi,':',bj
353     CALL SRDIAG_FILL( srTemp, 1.d0, fCode, diagVar, myThid )
354     diagVar => dv2
355     WRITE( fCode, '(A,A,I4.4,A,I4.4)' ) TRIM(fName),':',bi,':',bj
356     CALL SRDIAG_FILL( srTemp, 1.d0, fCode, diagVar, myThid )
357     ! ENDIF
358     ENDDO
359     ENDDO
360    
361     DEALLOCATE(srTemp )
362     DEALLOCATE(srBuf )
363    
364    
365     RETURN
366     END
367    
368     SUBROUTINE SRDIAGS_F77_SAVEFIELDS( myTime, myIter, myThid )
369    
370     C == Global declarations ==
371     USE SRDIAGS
372     IMPLICIT NONE
373    
374     #include "SIZE.h"
375     #include "EEPARAMS.h"
376     #include "EESUPPORT.h"
377     #include "PARAMS.h"
378     #include "DYNVARS.h"
379     #include "SRDIAG.h"
380     LOGICAL DIFFERENT_MULTIPLE
381     EXTERNAL DIFFERENT_MULTIPLE
382    
383     C == Routine arguments ==
384     INTEGER myThid
385     _RL myTime
386     INTEGER myIter
387    
388     C == Local variables ==
389     CHARACTER*512 fCode
390     REAL*8 tmpFldXYZ(1:sNx,1:sNy,Nr)
391     REAL*8 tmpFldXY(1:sNx,1:sNy,1)
392     INTEGER bi, bj, iG, jG
393     TYPE(SRDIAG_SPEC), POINTER :: diagVar
394     INTEGER I
395    
396     ! DO I=1, 2
397     ! IF ( I .EQ. 1 ) THEN
398     ! diagVar => dv1
399     ! ENDIF
400     ! IF ( I .EQ. 2 ) THEN
401     ! diagVar => dv2
402     ! ENDIF
403     ! DO bj=myByLo(myThid),myByHi(myThid)
404     ! DO bi=myBxLo(myThid),myBxHi(myThid)
405     ! WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'U:',bi,':',bj
406     ! tmpFldXYZ = uVel(1:sNx,1:sNy,:,bi,bj)
407     ! CALL SRDIAG_FILL( tmpFldXYZ, 1.d0, fCode, diagVar, myThid )
408     ! ENDDO
409     ! ENDDO
410     ! DO bj=myByLo(myThid),myByHi(myThid)
411     ! DO bi=myBxLo(myThid),myBxHi(myThid)
412     ! WRITE( fCode, '(A,I4.4,A,I4.4)' ) 'etan:',bi,':',bj
413     ! tmpFldXY(:,:,1) = etan(1:sNx,1:sNy,bi,bj)
414     ! CALL SRDIAG_FILL( tmpFldXY, 1.d0, fCode, diagVar, myThid )
415     ! ENDDO
416     ! ENDDO
417     ! ENDDO
418    
419     C Write to disk if need be
420     diagVar => dv1
421     IF ( DIFFERENT_MULTIPLE( diagVar%aPeriod, myTime, deltaTClock ) ) THEN
422     CALL SRDIAG_STORE( diagVar, myTime, myThid )
423     ENDIF
424    
425     diagVar => dv2
426     IF ( DIFFERENT_MULTIPLE( diagVar%aPeriod, myTime, deltaTClock ) ) THEN
427     CALL SRDIAG_STORE( diagVar, myTime, myThid )
428     ENDIF
429    
430     C STOP
431    
432     RETURN
433     END
434    
435     SUBROUTINE SRDIAGS_F77_OUTPUT( myThid )
436    
437     C == Global declarations ==
438     USE SRDIAGS
439     IMPLICIT NONE
440    
441     #include "SIZE.h"
442     #include "EEPARAMS.h"
443     #include "EESUPPORT.h"
444     #include "SRDIAG.h"
445    
446     C == Routine arguments ==
447     INTEGER myThid
448    
449     C == Local variables ==
450     INTEGER I
451     REAL*8 curTime
452     TYPE(SRDIAG_SPEC), POINTER :: diagVar
453    
454     curTime = 0.
455     DO I=1, 2
456     IF ( I .EQ. 1 ) THEN
457     diagVar => dv1
458     ENDIF
459     IF ( I .EQ. 2 ) THEN
460     diagVar => dv2
461     ENDIF
462     CALL SRDIAG_STORE( diagVar, curTime, myThid )
463     ENDDO
464    
465     RETURN
466     END

  ViewVC Help
Powered by ViewVC 1.1.22