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

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

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


Revision 1.5 - (show annotations) (download)
Mon Jun 15 21:34:07 2015 UTC (8 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65n, checkpoint65o, HEAD
Changes since 1.4: +15 -12 lines
avoid unused variables

1 C $Header: /u/gcmpack/MITgcm/pkg/layers/layers_thermodynamics.F,v 1.4 2015/06/03 13:39:22 rpa Exp $
2 C $Name: $
3
4 #include "LAYERS_OPTIONS.h"
5 C-- File layers_thermodynamics.F:
6 C-- Contents
7 C-- o LAYERS_CALC_RHS
8
9 CBOP 0
10 C !ROUTINE: LAYERS_CALC_RHS
11 C !INTERFACE:
12 SUBROUTINE LAYERS_CALC_RHS(
13 I myThid )
14
15 C !DESCRIPTION: \bv
16 C *==========================================================*
17 C | SUBROUTINE LAYERS_CALC_RHS
18 C | Recalculate the divergence of the RHS terms in T and S eqns.
19 C | Replaces the values of layers_surfflux, layers_df? IN PLACE
20 C | with the corresponding tendencies (same units as GT and GS)
21 C *==========================================================*
22 C \ev
23
24 C !USES:
25 IMPLICIT NONE
26 C == Global variables ===
27 #include "SIZE.h"
28 #include "EEPARAMS.h"
29 #include "PARAMS.h"
30 #include "GRID.h"
31 #include "FFIELDS.h"
32 #include "LAYERS_SIZE.h"
33 #include "LAYERS.h"
34
35 C !INPUT PARAMETERS:
36 C myThid :: my Thread Id number
37 INTEGER myThid
38 CEOP
39
40 #ifdef ALLOW_LAYERS
41 #ifdef LAYERS_THERMODYNAMICS
42 C !LOCAL VARIABLES:
43 C bi, bj :: tile indices
44 C i,j :: horizontal indices
45 C k :: vertical index for model grid
46 C kdown :: temporary placeholder
47 C fluxfac :: scaling factor for converting surface flux to tendency
48 C fluxfac :: scaling factor for converting diffusive flux to tendency
49 C downfac :: mask for lower point
50
51 INTEGER bi, bj
52 INTEGER i,j,k,kdown,iTracer
53 _RL fluxfac(2), downfac, tmpfac
54 c CHARACTER*(MAX_LEN_MBUF) msgBuf
55 _RL minusone
56 PARAMETER (minusOne=-1.)
57 #ifdef SHORTWAVE_HEATING
58 _RL swfracb(2)
59 #endif
60
61 C -- These factors convert the units of TFLUX and SFLUX diagnostics
62 C -- back to surfaceForcingT and surfaceForcingS units
63 fluxfac(1) = 1.0/(HeatCapacity_Cp*rUnit2mass)
64 fluxfac(2) = 1.0/rUnit2mass
65
66 DO bj = myByLo(myThid), myByHi(myThid)
67 DO bi = myBxLo(myThid), myBxHi(myThid)
68
69 DO iTracer = 1,2
70 k = 1
71 C -- Loop for surface fluxes
72 DO j=1-OLy,sNy+OLy
73 DO i=1-OLx,sNx+OLx
74
75 #ifdef SHORTWAVE_HEATING
76 C -- Have to remove the shortwave from the surface flux because it is added later
77 IF (iTracer.EQ.1) THEN
78 layers_surfflux(i,j,k,iTracer,bi,bj) =
79 & layers_surfflux(i,j,k,iTracer,bi,bj)
80 C -- Sign convention for Qsw means we have to add it to subtract it
81 & +Qsw(i,j,bi,bj)
82 ENDIF
83 #endif /* SHORTWAVE_HEATING */
84
85 layers_surfflux(i,j,k,iTracer,bi,bj) =
86 & layers_surfflux(i,j,k,iTracer,bi,bj)
87 & *recip_drF(1)*_recip_hFacC(i,j,1,bi,bj)
88 & *fluxfac(iTracer)
89 ENDDO
90 ENDDO
91
92 C -- Loop for diffusive fluxes
93 C -- If done correctly, we can overwrite the flux array in place
94 C -- with its own divergence
95 DO k=1,Nr
96 kdown= MIN(k+1,Nr)
97 IF (k.EQ.Nr) THEN
98 downfac = 0. _d 0
99 ELSE
100 downfac = 1. _d 0
101 ENDIF
102 DO j=1-OLy,sNy+OLy-1
103 DO i=1-OLx,sNx+OLx-1
104 C -- Diffusion
105 tmpfac = -_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
106 & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)*recip_rhoFacC(k)
107 layers_dfx(i,j,k,iTracer,bi,bj) = maskInC(i,j,bi,bj) *
108 & tmpfac * ( layers_dfx(i+1,j,k,iTracer,bi,bj) -
109 & layers_dfx(i,j,k,iTracer,bi,bj) )
110 layers_dfy(i,j,k,iTracer,bi,bj) = maskInC(i,j,bi,bj) *
111 & tmpfac * ( layers_dfy(i,j+1,k,iTracer,bi,bj) -
112 & layers_dfy(i,j,k,iTracer,bi,bj) )
113 layers_dfr(i,j,k,iTracer,bi,bj) = tmpfac * rkSign *
114 & ( layers_dfr(i,j,kdown,iTracer,bi,bj)*downfac -
115 & layers_dfr(i,j,k,iTracer,bi,bj) )
116 C -- Advection
117 layers_afx(i,j,k,iTracer,bi,bj) = maskInC(i,j,bi,bj) *
118 & tmpfac * ( layers_afx(i+1,j,k,iTracer,bi,bj) -
119 & layers_afx(i,j,k,iTracer,bi,bj) )
120 layers_afy(i,j,k,iTracer,bi,bj) = maskInC(i,j,bi,bj) *
121 & tmpfac * ( layers_afy(i,j+1,k,iTracer,bi,bj) -
122 & layers_afy(i,j,k,iTracer,bi,bj) )
123 layers_afr(i,j,k,iTracer,bi,bj) = tmpfac * rkSign *
124 & ( layers_afr(i,j,kdown,iTracer,bi,bj)*downfac -
125 & layers_afr(i,j,k,iTracer,bi,bj) )
126
127 #ifdef SHORTWAVE_HEATING
128 IF (iTracer.EQ.1) THEN
129 swfracb(1)=abs(rF(k))
130 swfracb(2)=abs(rF(k+1))
131 CALL SWFRAC(
132 I 2, minusOne,
133 U swfracb,
134 I 1.0, 1, myThid )
135 C ----- debuggin
136 C IF ((i.EQ.0).AND.(j.EQ.0)) THEN
137 C WRITE(msgBuf,'(2A,I3,A,F6.2,A,F6.2)')
138 C & 'S/R LAYERS_THERMODYNAMICS:',
139 C & ' k=', k,
140 C & ' swfracb(1)=', swfracb(1),
141 C & ' swfracb(2)=', swfracb(2)
142 C CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
143 C & SQUEEZE_RIGHT, myThid )
144 C ENDIF
145 C --- kdown == kp1
146 C kp1 = k+1
147 IF (k.EQ.Nr) THEN
148 C kp1 = k
149 swfracb(2)=0. _d 0
150 ENDIF
151 layers_sw(i,j,k,iTracer,bi,bj) =
152 & layers_sw(i,j,k,iTracer,bi,bj)
153 & -Qsw(i,j,bi,bj)*(swfracb(1)*maskC(i,j,k,bi,bj)
154 & -swfracb(2)*maskC(i,j,kdown,bi,bj))
155 & *fluxfac(1)
156 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
157 ENDIF
158 #endif /* SHORTWAVE_HEATING */
159
160 ENDDO
161 ENDDO
162 ENDDO
163 ENDDO
164 ENDDO
165 ENDDO
166
167 C- TFLUX (=total heat flux, match heat-content variations, [W/m2])
168 C IF ( fluidIsWater .AND.
169 C & DIAGNOSTICS_IS_ON('TFLUX ',myThid) ) THEN
170 C DO bj = myByLo(myThid), myByHi(myThid)
171 C DO bi = myBxLo(myThid), myBxHi(myThid)
172 C DO j = 1,sNy
173 C DO i = 1,sNx
174 C tmp1k(i,j,bi,bj) =
175 C #ifdef SHORTWAVE_HEATING
176 C & -Qsw(i,j,bi,bj)+
177 C #endif
178 C & (surfaceForcingT(i,j,bi,bj)+surfaceForcingTice(i,j,bi,bj))
179 C & *HeatCapacity_Cp*rUnit2mass
180 C ENDDO
181 C ENDDO
182 C #ifdef NONLIN_FRSURF
183 C IF ( (nonlinFreeSurf.GT.0 .OR. usingPCoords)
184 C & .AND. useRealFreshWaterFlux ) THEN
185 C DO j=1,sNy
186 C DO i=1,sNx
187 C tmp1k(i,j,bi,bj) = tmp1k(i,j,bi,bj)
188 C & + PmEpR(i,j,bi,bj)*theta(i,j,ks,bi,bj)*HeatCapacity_Cp
189 C ENDDO
190 C ENDDO
191 C ENDIF
192 C #endif /* NONLIN_FRSURF */
193 C ENDDO
194 C ENDDO
195 C CALL DIAGNOSTICS_FILL( tmp1k,'TFLUX ',0,1,0,1,1,myThid )
196 C ENDIF
197 C
198 C C- SFLUX (=total salt flux, match salt-content variations [g/m2/s])
199 C IF ( fluidIsWater .AND.
200 C & DIAGNOSTICS_IS_ON('SFLUX ',myThid) ) THEN
201 C DO bj = myByLo(myThid), myByHi(myThid)
202 C DO bi = myBxLo(myThid), myBxHi(myThid)
203 C DO j = 1,sNy
204 C DO i = 1,sNx
205 C tmp1k(i,j,bi,bj) =
206 C & surfaceForcingS(i,j,bi,bj)*rUnit2mass
207 C ENDDO
208 C ENDDO
209 C
210 C #ifdef NONLIN_FRSURF
211 C IF ( (nonlinFreeSurf.GT.0 .OR. usingPCoords)
212 C & .AND. useRealFreshWaterFlux ) THEN
213 C DO j=1,sNy
214 C DO i=1,sNx
215 C tmp1k(i,j,bi,bj) = tmp1k(i,j,bi,bj)
216 C & + PmEpR(i,j,bi,bj)*salt(i,j,ks,bi,bj)
217 C ENDDO
218 C ENDDO
219 C ENDIF
220 C #endif /* NONLIN_FRSURF */
221 C
222 C ENDDO
223 C ENDDO
224 C CALL DIAGNOSTICS_FILL( tmp1k,'SFLUX ',0,1,0,1,1,myThid )
225 C ENDIF
226
227 C Ocean: Add temperature surface forcing (e.g., heat-flux) in surface level
228 C IF ( kLev .EQ. kSurface ) THEN
229 C DO j=1,sNy
230 C DO i=1,sNx
231 C gT(i,j,kLev,bi,bj)=gT(i,j,kLev,bi,bj)
232 C & +surfaceForcingT(i,j,bi,bj)
233 C & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
234 C ENDDO
235 C ENDDO
236 C ELSEIF ( kSurface.EQ.-1 ) THEN
237 C DO j=1,sNy
238 C DO i=1,sNx
239 C IF ( kSurfC(i,j,bi,bj).EQ.kLev ) THEN
240 C gT(i,j,kLev,bi,bj)=gT(i,j,kLev,bi,bj)
241 C & +surfaceForcingT(i,j,bi,bj)
242 C & *recip_drF(kLev)*_recip_hFacC(i,j,kLev,bi,bj)
243 C ENDIF
244 C ENDDO
245 C ENDDO
246 C ENDIF
247
248 C-- Divergence of fluxes
249 C Anelastic: scale vertical fluxes by rhoFac and leave Horizontal fluxes unchanged
250 C for Stevens OBC: keep only vertical diffusive contribution on boundaries
251 C DO j=1-OLy,sNy+OLy-1
252 C DO i=1-OLx,sNx+OLx-1
253 C gTracer(i,j,k,bi,bj)=gTracer(i,j,k,bi,bj)
254 C & -_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
255 C & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)*recip_rhoFacC(k)
256 C & *( (fZon(i+1,j)-fZon(i,j))*maskInC(i,j,bi,bj)
257 C & +(fMer(i,j+1)-fMer(i,j))*maskInC(i,j,bi,bj)
258 C & +(fVerT(i,j,kDown)-fVerT(i,j,kUp))*rkSign
259 C & -localT(i,j)*( (uTrans(i+1,j)-uTrans(i,j))*advFac
260 C & +(vTrans(i,j+1)-vTrans(i,j))*advFac
261 C & +(rTransKp1(i,j)-rTrans(i,j))*rAdvFac
262 C & )*maskInC(i,j,bi,bj)
263 C & )
264 C ENDDO
265 C ENDDO
266
267 #endif /* LAYERS_THERMODYNAMICS */
268 #endif /* USE_LAYERS */
269 RETURN
270 END
271 C -- end of S/R LAYERS_CALC_RHS

  ViewVC Help
Powered by ViewVC 1.1.22