/[MITgcm]/MITgcm/model/src/calc_3d_diffusivity.F
ViewVC logotype

Contents of /MITgcm/model/src/calc_3d_diffusivity.F

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


Revision 1.7 - (show annotations) (download)
Wed Apr 11 00:00:47 2007 UTC (17 years, 1 month ago) by dimitri
Branch: MAIN
Changes since 1.6: +32 -8 lines
o Added capability for latitudinal dependence of Bryan and Lewis, 1979
  vertical diffusivity, similar to that in MOM4; vertical diffusivity is
  specified using diffKrBL79* diffKrBLEQ* and KbryanLewisLatTransition

1 C $Header: /u/gcmpack/MITgcm/model/src/calc_3d_diffusivity.F,v 1.6 2007/04/05 22:51:48 dimitri Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 CBOP
8 C !ROUTINE: CALC_3D_DIFFUSIVITY
9 C !INTERFACE:
10 SUBROUTINE CALC_3D_DIFFUSIVITY(
11 I bi,bj,iMin,iMax,jMin,jMax,
12 I trIdentity, trUseGMRedi, trUseKPP,
13 O KappaRTr,
14 I myThid)
15
16 C !DESCRIPTION: \bv
17 C *==========================================================*
18 C | SUBROUTINE CALC_3D_DIFFUSIVITY
19 C | o Calculate net (3D) vertical diffusivity for 1 tracer
20 C *==========================================================*
21 C | Combines spatially varying diffusion coefficients from
22 C | KPP and/or GM and/or convective stability test.
23 C *==========================================================*
24 C \ev
25
26 C !USES:
27 IMPLICIT NONE
28 C == GLobal variables ==
29 #include "SIZE.h"
30 #include "EEPARAMS.h"
31 #include "PARAMS.h"
32 #include "DYNVARS.h"
33 #include "GRID.h"
34 #ifdef ALLOW_GENERIC_ADVDIFF
35 #include "GAD.h"
36 #endif
37 #ifdef ALLOW_PTRACERS
38 #include "PTRACERS_SIZE.h"
39 #include "PTRACERS.h"
40 #endif
41
42 C !INPUT/OUTPUT PARAMETERS:
43 C == Routine arguments ==
44 C bi, bj :: tile indices
45 C iMin,iMax :: Range of points for which calculation is performed.
46 C jMin,jMax :: Range of points for which calculation is performed.
47 C trIdentity :: tracer identifier
48 C trUseGMRedi:: this tracer use GM-Redi
49 C trUseKPP :: this tracer use KPP
50 C myThid :: Instance number for this innvocation of CALC_3D_DIFFUSIVITY
51 C KappaRTr :: Net diffusivity for this tracer (trIdentity)
52 INTEGER bi,bj,iMin,iMax,jMin,jMax
53 INTEGER trIdentity
54 LOGICAL trUseGMRedi, trUseKPP
55 _RL KappaRTr(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
56 INTEGER myThid
57
58 #ifdef ALLOW_GENERIC_ADVDIFF
59 C !LOCAL VARIABLES:
60 C == Local variables ==
61 C i, j, k :: Loop counters
62 C iTr :: passive tracer index
63 C msgBuf :: message buffer
64 INTEGER i,j,k
65 _RL KbryanLewis79, KbryanLewisHL, KbryanLewisEQ
66 CHARACTER*(MAX_LEN_MBUF) msgBuf
67 #ifdef ALLOW_PTRACERS
68 INTEGER iTr
69 #endif
70 CEOP
71
72 IF ( trIdentity.EQ.GAD_TEMPERATURE) THEN
73
74 DO k = 1,Nr
75 KbryanLewisHL=diffKrBL79surf+(diffKrBL79deep-diffKrBL79surf)
76 & *( atan( -( rF(k)-diffKrBL79Ho )/diffKrBL79scl )/PI+0.5 _d 0)
77 KbryanLewisEQ=diffKrBLEQsurf+(diffKrBLEQdeep-diffKrBLEQsurf)
78 & *( atan( -( rF(k)-diffKrBLEQHo )/diffKrBLEQscl )/PI+0.5 _d 0)
79 DO j = 1-Oly,sNy+Oly
80 IF ( abs(YC(i,j,bi,bj)) .GT. KbryanLewisLatTransition ) THEN
81 KbryanLewis79 = KbryanLewisHL
82 ELSE
83 KbryanLewis79 = KbryanLewisHL-(KbryanLewisHL-KbryanLewisEQ)*
84 & (1+cos(YC(i,j,bi,bj)*pi/KbryanLewisLatTransition)) / 2
85 ENDIF
86 DO i = 1-Olx,sNx+Olx
87 KappaRTr(i,j,k) =
88 & IVDConvCount(i,j,k,bi,bj)*ivdc_kappa
89 #if (defined ALLOW_3D_DIFFKR || \
90 (defined (ALLOW_AUTODIFF_TAMC) && defined (ALLOW_DIFFKR_CONTROL)))
91 & + diffKr(i,j,k,bi,bj)
92 #else
93 & + diffKrNrT(k)
94 #endif
95 & + KbryanLewis79
96 ENDDO
97 ENDDO
98 ENDDO
99
100 ELSEIF ( trIdentity.EQ.GAD_SALINITY) THEN
101
102 DO k = 1,Nr
103 KbryanLewisHL=diffKrBL79surf+(diffKrBL79deep-diffKrBL79surf)
104 & *( atan( -( rF(k)-diffKrBL79Ho )/diffKrBL79scl )/PI+0.5 _d 0)
105 KbryanLewisEQ=diffKrBLEQsurf+(diffKrBLEQdeep-diffKrBLEQsurf)
106 & *( atan( -( rF(k)-diffKrBLEQHo )/diffKrBLEQscl )/PI+0.5 _d 0)
107 DO j = 1-Oly, sNy+Oly
108 IF ( abs(YC(i,j,bi,bj)) .GT. KbryanLewisLatTransition ) THEN
109 KbryanLewis79 = KbryanLewisHL
110 ELSE
111 KbryanLewis79 = KbryanLewisHL-(KbryanLewisHL-KbryanLewisEQ)*
112 & (1+cos(YC(i,j,bi,bj)*pi/KbryanLewisLatTransition)) / 2
113 ENDIF
114 DO i = 1-Olx, sNx+Olx
115 KappaRTr(i,j,k) =
116 & IVDConvCount(i,j,k,bi,bj)*ivdc_kappa
117 #if (defined ALLOW_3D_DIFFKR || \
118 (defined (ALLOW_AUTODIFF_TAMC) && defined (ALLOW_DIFFKR_CONTROL)))
119 & + diffKr(i,j,k,bi,bj)
120 #else
121 & + diffKrNrS(k)
122 #endif
123 & + KbryanLewis79
124 ENDDO
125 ENDDO
126 ENDDO
127
128 #ifdef ALLOW_PTRACERS
129 ELSEIF ( trIdentity.GE.GAD_TR1
130 & .AND. trIdentity.LT.GAD_TR1+PTRACERS_numInUse) THEN
131
132 iTr = trIdentity - GAD_TR1 + 1
133 DO k = 1,Nr
134 KbryanLewisHL=diffKrBL79surf+(diffKrBL79deep-diffKrBL79surf)
135 & *( atan( -( rF(k)-diffKrBL79Ho )/diffKrBL79scl )/PI+0.5 _d 0)
136 KbryanLewisEQ=diffKrBLEQsurf+(diffKrBLEQdeep-diffKrBLEQsurf)
137 & *( atan( -( rF(k)-diffKrBLEQHo )/diffKrBLEQscl )/PI+0.5 _d 0)
138 DO j = 1-Oly, sNy+Oly
139 IF ( abs(YC(i,j,bi,bj)) .GT. KbryanLewisLatTransition ) THEN
140 KbryanLewis79 = KbryanLewisHL
141 ELSE
142 KbryanLewis79 = KbryanLewisHL-(KbryanLewisHL-KbryanLewisEQ)*
143 & (1+cos(YC(i,j,bi,bj)*pi/KbryanLewisLatTransition)) / 2
144 ENDIF
145 DO i = 1-Olx, sNx+Olx
146 KappaRTr(i,j,k) =
147 & IVDConvCount(i,j,k,bi,bj)*ivdc_kappa
148 #if (defined ALLOW_3D_DIFFKR || \
149 (defined (ALLOW_AUTODIFF_TAMC) && defined (ALLOW_DIFFKR_CONTROL)))
150 & + diffKr(i,j,k,bi,bj)
151 #else
152 & + PTRACERS_diffKrNr(k,iTr)
153 #endif
154 & + KbryanLewis79
155 ENDDO
156 ENDDO
157 ENDDO
158 #endif /* ALLOW_PTRACERS */
159
160 ELSE
161 WRITE(msgBuf,'(A,I4)')
162 & ' CALC_3D_DIFFUSIVITY: Invalid tracer Id: ',trIdentity
163 CALL PRINT_ERROR(msgBuf, myThid)
164 STOP 'ABNORMAL END: S/R CALC_3D_DIFFUSIVITY'
165 ENDIF
166
167 C-- Add physical pacakge contributions:
168
169 #ifdef ALLOW_GMREDI
170 IF (trUseGMRedi) THEN
171 CALL GMREDI_CALC_DIFF(
172 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
173 U KappaRTr,
174 I myThid)
175 ENDIF
176 #endif
177
178 #ifdef ALLOW_KPP
179 IF (trUseKPP) THEN
180 IF (trIdentity.EQ.GAD_TEMPERATURE) THEN
181 CALL KPP_CALC_DIFF_T(
182 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
183 U KappaRTr,
184 I myThid)
185 ELSE
186 CALL KPP_CALC_DIFF_S(
187 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
188 U KappaRTr,
189 I myThid)
190 ENDIF
191 ENDIF
192 #endif
193
194 #ifdef ALLOW_PP81
195 IF (usePP81) THEN
196 CALL PP81_CALC_DIFF(
197 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
198 U KappaRTr,
199 I myThid)
200 ENDIF
201 #endif
202
203 #ifdef ALLOW_MY82
204 IF (useMY82) THEN
205 CALL MY82_CALC_DIFF(
206 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
207 U KappaRTr,
208 I myThid)
209 ENDIF
210 #endif
211
212 #ifdef ALLOW_GGL90
213 IF (useGGL90) THEN
214 CALL GGL90_CALC_DIFF(
215 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
216 O KappaRTr,
217 I myThid)
218 ENDIF
219 #endif
220
221 C- Apply mask to vertical diffusivity
222 C jmc: don't have the impression that masking is needed
223 C but could be removed later if it's the case.
224 c DO j = 1-Oly, sNy+Oly
225 c DO i = 1-Olx, sNx+Olx
226 c KappaRTr(i,j,k) = maskUp(i,j)*KappaRTr(i,j,k)
227 c ENDDO
228 c ENDDO
229
230 #endif /* ALLOW_GENERIC_ADVDIFF */
231
232 RETURN
233 END

  ViewVC Help
Powered by ViewVC 1.1.22