/[MITgcm]/MITgcm/pkg/layers/layers_calc.F
ViewVC logotype

Contents of /MITgcm/pkg/layers/layers_calc.F

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


Revision 1.19 - (show annotations) (download)
Fri Oct 19 18:01:45 2012 UTC (11 years, 8 months ago) by rpa
Branch: MAIN
CVS Tags: checkpoint64x, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f
Changes since 1.18: +1 -9 lines
removed unnecessary tave variables

1 C $Header: /u/gcmpack/MITgcm/pkg/layers/layers_calc.F,v 1.18 2012/10/18 19:51:14 jmc Exp $
2 C $Name: $
3
4 #include "LAYERS_OPTIONS.h"
5 #ifdef ALLOW_GMREDI
6 #include "GMREDI_OPTIONS.h"
7 #endif
8
9 CBOP 0
10 C !ROUTINE: LAYERS_CALC
11
12 C !INTERFACE:
13 SUBROUTINE LAYERS_CALC(
14 I myTime, myIter, myThid )
15
16 C !DESCRIPTION:
17 C ===================================================================
18 C Calculate the transport in isopycnal layers.
19 C This was the meat of the LAYERS package, which
20 C has been moved to S/R LAYERS_FLUXCALC.F
21 C ===================================================================
22
23 C !USES:
24 IMPLICIT NONE
25 #include "SIZE.h"
26 #include "EEPARAMS.h"
27 #include "PARAMS.h"
28 #include "GRID.h"
29 #include "DYNVARS.h"
30 #include "LAYERS_SIZE.h"
31 #include "LAYERS.h"
32 #ifdef ALLOW_GMREDI
33 # include "GMREDI.h"
34 #endif
35
36 C !INPUT PARAMETERS:
37 C myTime :: Current time in simulation
38 C myIter :: Current iteration number
39 C myThid :: my Thread Id number
40 _RL myTime
41 INTEGER myIter
42 INTEGER myThid
43 CEOP
44
45 #ifdef ALLOW_LAYERS
46 C !FUNCTIONS:
47 LOGICAL DIFFERENT_MULTIPLE
48 EXTERNAL DIFFERENT_MULTIPLE
49
50 C !LOCAL VARIABLES:
51 C bi, bj :: tile indices
52 C i,j :: horizontal indices
53 C iLa :: layer coordinate index
54 C k :: vertical index for model grid
55 INTEGER bi, bj, iLa
56 CHARACTER*(MAX_LEN_MBUF) suff
57 #ifdef LAYERS_PRHO_REF
58 INTEGER i, j, k
59 #endif
60 #ifdef ALLOW_DIAGNOSTICS
61 CHARACTER*8 diagName
62 #endif
63 c#ifdef ALLOW_MNC
64 c CHARACTER*(1) pf
65 c#endif
66
67 #ifndef LAYERS_UFLUX
68 _RL layers_UH(1)
69 #endif
70 #ifndef LAYERS_VFLUX
71 _RL layers_VH(1)
72 #endif
73 #if !(defined LAYERS_THICKNESS) || !(defined LAYERS_UFLUX)
74 _RL layers_Hw(1), layers_PIw(1), layers_U(1)
75 #endif
76 #if !(defined LAYERS_THICKNESS) || !(defined LAYERS_VFLUX)
77 _RL layers_Hs(1), layers_PIs(1), layers_V(1)
78 #endif
79
80 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
81
82 IF ( myIter.EQ.nIter0 ) RETURN
83
84 DO iLa=1,layers_maxNum
85
86 IF ( layers_num(iLa) .EQ. 1 ) THEN
87 CALL LAYERS_FLUXCALC( uVel,vVel,theta,iLa,
88 & layers_UH, layers_VH,
89 & layers_Hw, layers_Hs,
90 & layers_PIw,layers_PIs,
91 & layers_U, layers_V,
92 & myThid )
93 ELSEIF ( layers_num(iLa) .EQ. 2 ) THEN
94 CALL LAYERS_FLUXCALC( uVel,vVel,salt,iLa,
95 & layers_UH, layers_VH,
96 & layers_Hw, layers_Hs,
97 & layers_PIw,layers_PIs,
98 & layers_U, layers_V,
99 & myThid )
100 ELSEIF ( layers_num(iLa) .EQ. 3 ) THEN
101 #ifdef LAYERS_PRHO_REF
102 C For layers_num(iLa) = 3, calculate the potential density referenced to
103 C the model level given by layers_krho.
104 DO bj=myByLo(myThid),myByHi(myThid)
105 DO bi=myBxLo(myThid),myBxHi(myThid)
106 DO k = 1,Nr
107 CALL FIND_RHO_2D( 1-OLx, sNx+OLx, 1-OLy, sNy+OLy,
108 & layers_krho(iLa),
109 & theta(1-OLx,1-OLy,k,bi,bj),
110 & salt(1-OLx,1-OLy,k,bi,bj),
111 & prho(1-OLx,1-OLy,k,bi,bj),
112 & k, bi, bj, myThid )
113 DO j = 1-OLy,sNy+OLy
114 DO i = 1-OLx,sNx+OLx
115 prho(i,j,k,bi,bj) = rhoConst + prho(i,j,k,bi,bj)
116 ENDDO
117 ENDDO
118 ENDDO
119 ENDDO
120 ENDDO
121 CALL LAYERS_FLUXCALC( uVel,vVel, prho, iLa,
122 & layers_UH, layers_VH,
123 & layers_Hw, layers_Hs,
124 & layers_PIw,layers_PIs,
125 & layers_U, layers_V,
126 & myThid )
127 #endif
128 ENDIF
129
130 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
131 C-- Direct Snap-shot output
132 IF ( DIFFERENT_MULTIPLE(layers_diagFreq,myTime,deltaTClock)
133 & .AND. layers_num(iLa).NE.0 ) THEN
134
135 IF ( layers_MDSIO ) THEN
136 WRITE(suff,'(I2.2,A1,I10.10)') iLa, '.', myIter
137 #ifdef LAYERS_UFLUX
138 CALL WRITE_FLD_3D_RL( 'layers_UH.', suff, Nlayers,
139 & layers_UH, myIter, myThid )
140 #ifdef LAYERS_THICKNESS
141 CALL WRITE_FLD_3D_RL( 'layers_Hw.', suff, Nlayers,
142 & layers_Hw, myIter, myThid )
143 #endif /* LAYERS_THICKNESS */
144 #endif /* LAYERS_UFLUX */
145 #ifdef LAYERS_VFLUX
146 CALL WRITE_FLD_3D_RL( 'layers_VH.', suff, Nlayers,
147 & layers_VH, myIter, myThid )
148 #ifdef LAYERS_THICKNESS
149 CALL WRITE_FLD_3D_RL( 'layers_Hs.', suff, Nlayers,
150 & layers_Hs, myIter, myThid )
151 #endif /* LAYERS_THICKNESS */
152 #endif /* LAYERS_VFLUX */
153 #ifdef LAYERS_PRHO_REF
154 IF ( layers_num(1).EQ.3 ) THEN
155 CALL WRITE_FLD_3D_RL( 'layers_prho.', suff, Nr,
156 & prho, myIter, myThid )
157 ENDIF
158 #endif /* LAYERS_PRHO_REF */
159 ENDIF
160
161 c#ifdef ALLOW_MNC
162 c#ifdef LAYERS_MNC
163 c IF ( writeBinaryPrec .EQ. precFloat64 ) THEN
164 c pf(1:1) = 'D'
165 c ELSE
166 c pf(1:1) = 'R'
167 c ENDIF
168 c IF ( layers_MNC) THEN
169 C Do MNC output... But how?
170 c ENDIF
171 c#endif /* LAYERS_MNC */
172 c#endif /* ALLOW_MNC */
173
174 ENDIF
175
176 #ifdef ALLOW_DIAGNOSTICS
177 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
178 C-- Fill-in diagnostics
179 IF ( useDiagnostics .AND. layers_num(iLa).NE.0 ) THEN
180
181 #ifdef LAYERS_UFLUX
182 WRITE(diagName,'(A4,I1,A3)') 'LaUH',iLa,layers_name(iLa)
183 CALL DIAGNOSTICS_FILL( layers_UH,
184 & diagName,0,Nlayers, 0, 1, 1, myThid )
185 # ifdef LAYERS_THICKNESS
186 WRITE(diagName,'(A4,I1,A3)') 'LaHw',iLa,layers_name(iLa)
187 CALL DIAGNOSTICS_FILL( layers_Hw,
188 & diagName,0,Nlayers, 0, 1, 1, myThid )
189 WRITE(diagName,'(A4,I1,A3)') 'LaPw',iLa,layers_name(iLa)
190 CALL DIAGNOSTICS_FILL( layers_PIw,
191 & diagName,0,Nlayers, 0, 1, 1, myThid )
192 WRITE(diagName,'(A4,I1,A3)') 'LaUa',iLa,layers_name(iLa)
193 CALL DIAGNOSTICS_FILL( layers_U,
194 & diagName,0,Nlayers, 0, 1, 1, myThid )
195 # endif
196 #endif /* LAYERS_UFLUX */
197
198 #ifdef LAYERS_VFLUX
199 WRITE(diagName,'(A4,I1,A3)') 'LaVH',iLa,layers_name(iLa)
200 CALL DIAGNOSTICS_FILL( layers_VH,
201 & diagName,0,Nlayers, 0, 1, 1, myThid )
202 # ifdef LAYERS_THICKNESS
203 WRITE(diagName,'(A4,I1,A3)') 'LaHs',iLa,layers_name(iLa)
204 CALL DIAGNOSTICS_FILL( layers_Hs,
205 & diagName,0,Nlayers, 0, 1, 1, myThid )
206 WRITE(diagName,'(A4,I1,A3)') 'LaPs',iLa,layers_name(iLa)
207 CALL DIAGNOSTICS_FILL( layers_PIs,
208 & diagName,0,Nlayers, 0, 1, 1, myThid )
209 WRITE(diagName,'(A4,I1,A3)') 'LaVa',iLa,layers_name(iLa)
210 CALL DIAGNOSTICS_FILL( layers_V,
211 & diagName,0,Nlayers, 0, 1, 1, myThid )
212 # endif
213 #endif /* LAYERS_VFLUX */
214
215 ENDIF
216 #endif /* ALLOW_DIAGNOSTICS */
217
218 #ifdef ALLOW_TIMEAVE
219 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
220 C-- Time-average
221 cgf layers_maxNum loop and dimension would be needed for
222 cgf the following and tave output to work beyond iLa.EQ.1
223 IF ( layers_taveFreq.GT.0. .AND. iLa.EQ.1 ) THEN
224 C --- The tile loops
225 DO bj=myByLo(myThid),myByHi(myThid)
226 DO bi=myBxLo(myThid),myBxHi(myThid)
227
228 #ifdef LAYERS_UFLUX
229 CALL TIMEAVE_CUMULATE( layers_UH_T, layers_UH, Nlayers,
230 & deltaTclock, bi, bj, myThid )
231 #ifdef LAYERS_THICKNESS
232 CALL TIMEAVE_CUMULATE( layers_Hw_T, layers_Hw, Nlayers,
233 & deltaTclock, bi, bj, myThid )
234 #endif /* LAYERS_THICKNESS */
235 #endif /* LAYERS_UFLUX */
236 #ifdef LAYERS_VFLUX
237 CALL TIMEAVE_CUMULATE( layers_VH_T, layers_VH, Nlayers,
238 & deltaTclock, bi, bj, myThid )
239 #ifdef LAYERS_THICKNESS
240 CALL TIMEAVE_CUMULATE( layers_Hs_T, layers_Hs, Nlayers,
241 & deltaTclock, bi, bj, myThid )
242 #endif /* LAYERS_THICKNESS */
243 #endif /* LAYERS_VFLUX */
244
245 #ifdef LAYERS_PRHO_REF
246 IF ( layers_num(iLa) .EQ. 3 )
247 & CALL TIMEAVE_CUMULATE( prho_tave, prho, Nr,
248 & deltaTclock, bi, bj, myThid )
249 #endif /* LAYERS_PRHO_REF */
250
251 layers_TimeAve(bi,bj)=layers_TimeAve(bi,bj)+deltaTclock
252
253 C --- End bi,bj loop
254 ENDDO
255 ENDDO
256 ENDIF
257 #endif /* ALLOW_TIMEAVE */
258
259 ENDDO !DO iLa=1,layers_maxNum
260
261 #endif /* ALLOW_LAYERS */
262
263 RETURN
264 END

  ViewVC Help
Powered by ViewVC 1.1.22