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

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

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


Revision 1.10 - (hide annotations) (download)
Mon Apr 23 20:46:49 2007 UTC (17 years, 1 month ago) by dimitri
Branch: MAIN
CVS Tags: checkpoint59e, checkpoint59d, checkpoint59f, checkpoint59a, checkpoint59c, checkpoint59b
Changes since 1.9: +63 -66 lines
o bug fixes for vertical diffusivity computations when both KPP and
    3D diffusivity arrays are used.

1 dimitri 1.10 C $Header: /u/gcmpack/MITgcm/model/src/calc_3d_diffusivity.F,v 1.9 2007/04/14 18:32:32 dimitri Exp $
2 jmc 1.1 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 jmc 1.3 #ifdef ALLOW_GENERIC_ADVDIFF
35 jmc 1.1 #include "GAD.h"
36 jmc 1.3 #endif
37 jmc 1.1 #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 jmc 1.3 #ifdef ALLOW_GENERIC_ADVDIFF
59 jmc 1.1 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 dimitri 1.9 _RL KbryanLewis79, KbryanLewisEQ
66 jmc 1.1 CHARACTER*(MAX_LEN_MBUF) msgBuf
67 jmc 1.4 #ifdef ALLOW_PTRACERS
68     INTEGER iTr
69     #endif
70 jmc 1.1 CEOP
71    
72 dimitri 1.10 IF ( .NOT. trUseKPP ) THEN
73 jmc 1.1 DO k = 1,Nr
74 jmc 1.8 KbryanLewis79=diffKrBL79surf+(diffKrBL79deep-diffKrBL79surf)
75 dimitri 1.10 & *(atan(-(rF(k)-diffKrBL79Ho)/diffKrBL79scl)/PI+0.5 _d 0)
76 dimitri 1.9 #ifdef ALLOW_BL79_LAT_VARY
77     KbryanLewisEQ=diffKrBLEQsurf+(diffKrBLEQdeep-diffKrBLEQsurf)
78 dimitri 1.10 & *(atan(-(rF(k)-diffKrBLEQHo)/diffKrBLEQscl)/PI+0.5 _d 0)
79 dimitri 1.9 #endif
80 jmc 1.1 DO j = 1-Oly,sNy+Oly
81     DO i = 1-Olx,sNx+Olx
82     KappaRTr(i,j,k) =
83     & IVDConvCount(i,j,k,bi,bj)*ivdc_kappa
84 dimitri 1.10 & + KbryanLewis79
85     #ifdef ALLOW_BL79_LAT_VARY
86     & + (KbryanLewisEQ-KbryanLewis79)*BL79LatArray(i,j,bi,bj)
87     #endif
88     ENDDO
89     ENDDO
90     ENDDO
91     IF ( trIdentity.EQ.GAD_TEMPERATURE ) THEN
92     DO k = 1,Nr
93     DO j = 1-Oly,sNy+Oly
94     DO i = 1-Olx,sNx+Olx
95     KappaRTr(i,j,k) = KappaRTr(i,j,k)
96 dimitri 1.6 #if (defined ALLOW_3D_DIFFKR || \
97     (defined (ALLOW_AUTODIFF_TAMC) && defined (ALLOW_DIFFKR_CONTROL)))
98 dimitri 1.10 & + diffKr(i,j,k,bi,bj)
99 jmc 1.1 #else
100 dimitri 1.10 & + diffKrNrT(k)
101 dimitri 1.9 #endif
102 dimitri 1.10 ENDDO
103 jmc 1.1 ENDDO
104     ENDDO
105 dimitri 1.10 ELSEIF ( trIdentity.EQ.GAD_SALINITY) THEN
106     DO k = 1,Nr
107     DO j = 1-Oly, sNy+Oly
108     DO i = 1-Olx, sNx+Olx
109     KappaRTr(i,j,k) = KappaRTr(i,j,k)
110 dimitri 1.6 #if (defined ALLOW_3D_DIFFKR || \
111     (defined (ALLOW_AUTODIFF_TAMC) && defined (ALLOW_DIFFKR_CONTROL)))
112 dimitri 1.10 & + diffKr(i,j,k,bi,bj)
113 jmc 1.1 #else
114 dimitri 1.10 & + diffKrNrS(k)
115 dimitri 1.9 #endif
116 dimitri 1.10 ENDDO
117 jmc 1.1 ENDDO
118     ENDDO
119     #ifdef ALLOW_PTRACERS
120 dimitri 1.10 ELSEIF ( trIdentity.GE.GAD_TR1
121 jmc 1.1 & .AND. trIdentity.LT.GAD_TR1+PTRACERS_numInUse) THEN
122    
123 dimitri 1.10 iTr = trIdentity - GAD_TR1 + 1
124     DO k = 1,Nr
125     DO j = 1-Oly, sNy+Oly
126     DO i = 1-Olx, sNx+Olx
127     KappaRTr(i,j,k) = KappaRTr(i,j,k)
128 dimitri 1.6 #if (defined ALLOW_3D_DIFFKR || \
129     (defined (ALLOW_AUTODIFF_TAMC) && defined (ALLOW_DIFFKR_CONTROL)))
130 dimitri 1.10 & + diffKr(i,j,k,bi,bj)
131 jmc 1.1 #else
132 dimitri 1.10 & + PTRACERS_diffKrNr(k,iTr)
133 dimitri 1.9 #endif
134 dimitri 1.10 ENDDO
135 jmc 1.1 ENDDO
136     ENDDO
137     #endif /* ALLOW_PTRACERS */
138 dimitri 1.10 ELSE
139 jmc 1.1 WRITE(msgBuf,'(A,I4)')
140 dimitri 1.10 & ' CALC_3D_DIFFUSIVITY: Invalid tracer Id: ',trIdentity
141 jmc 1.1 CALL PRINT_ERROR(msgBuf, myThid)
142     STOP 'ABNORMAL END: S/R CALC_3D_DIFFUSIVITY'
143 dimitri 1.10 ENDIF
144 jmc 1.1 ENDIF
145    
146     C-- Add physical pacakge contributions:
147    
148     #ifdef ALLOW_KPP
149     IF (trUseKPP) THEN
150     IF (trIdentity.EQ.GAD_TEMPERATURE) THEN
151     CALL KPP_CALC_DIFF_T(
152 jmc 1.2 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
153 jmc 1.1 U KappaRTr,
154     I myThid)
155     ELSE
156     CALL KPP_CALC_DIFF_S(
157 jmc 1.2 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
158 jmc 1.1 U KappaRTr,
159     I myThid)
160     ENDIF
161 dimitri 1.10 #if (defined ALLOW_PTRACERS && ! (defined ALLOW_3D_DIFFKR || \
162     (defined (ALLOW_AUTODIFF_TAMC) && defined (ALLOW_DIFFKR_CONTROL))))
163     IF ( trIdentity.GE.GAD_TR1
164     & .AND. trIdentity.LT.GAD_TR1+PTRACERS_numInUse) THEN
165     iTr = trIdentity - GAD_TR1 + 1
166     DO k = 1,Nr
167     DO j = 1-Oly, sNy+Oly
168     DO i = 1-Olx, sNx+Olx
169     KappaRTr(i,j,k) = KappaRTr(i,j,k)
170     & - diffKrNrS(k) + PTRACERS_diffKrNr(k,iTr)
171     ENDDO
172     ENDDO
173     ENDDO
174     ENDIF
175     #endif
176     ENDIF
177     #endif /* ALLOW_KPP */
178    
179     #ifdef ALLOW_GMREDI
180     IF (trUseGMRedi) THEN
181     CALL GMREDI_CALC_DIFF(
182     I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
183     U KappaRTr,
184     I myThid)
185 jmc 1.1 ENDIF
186     #endif
187    
188     #ifdef ALLOW_PP81
189     IF (usePP81) THEN
190     CALL PP81_CALC_DIFF(
191 jmc 1.2 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
192 jmc 1.1 U KappaRTr,
193     I myThid)
194     ENDIF
195     #endif
196    
197     #ifdef ALLOW_MY82
198     IF (useMY82) THEN
199     CALL MY82_CALC_DIFF(
200 jmc 1.2 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
201 jmc 1.1 U KappaRTr,
202     I myThid)
203     ENDIF
204     #endif
205    
206     #ifdef ALLOW_GGL90
207     IF (useGGL90) THEN
208     CALL GGL90_CALC_DIFF(
209 jmc 1.2 I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
210 jmc 1.1 O KappaRTr,
211     I myThid)
212     ENDIF
213     #endif
214    
215     C- Apply mask to vertical diffusivity
216     C jmc: don't have the impression that masking is needed
217     C but could be removed later if it's the case.
218     c DO j = 1-Oly, sNy+Oly
219     c DO i = 1-Olx, sNx+Olx
220     c KappaRTr(i,j,k) = maskUp(i,j)*KappaRTr(i,j,k)
221     c ENDDO
222     c ENDDO
223    
224 jmc 1.3 #endif /* ALLOW_GENERIC_ADVDIFF */
225    
226 jmc 1.1 RETURN
227     END

  ViewVC Help
Powered by ViewVC 1.1.22