/[MITgcm]/MITgcm_contrib/atnguyen/code_21Dec2012_saltplume/salt_plume_apply.F
ViewVC logotype

Annotation of /MITgcm_contrib/atnguyen/code_21Dec2012_saltplume/salt_plume_apply.F

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


Revision 1.5 - (hide annotations) (download)
Thu May 1 21:30:48 2014 UTC (11 years, 3 months ago) by atn
Branch: MAIN
Changes since 1.4: +6 -6 lines
bug fixing

1 atn 1.5 C $Header: /u/gcmpack/MITgcm_contrib/atnguyen/code_21Dec2012_saltplume/salt_plume_apply.F,v 1.4 2014/05/01 08:09:30 atn Exp $
2 atn 1.1 C $Name: $
3    
4     #include "SALT_PLUME_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: SALT_PLUME_APPLY
8     C !INTERFACE:
9     SUBROUTINE SALT_PLUME_APPLY(
10     I trIdentity, bi, bj,
11     I recip_hFac_arg,
12 atn 1.4 I tracer,trApplyFlag,
13 atn 1.1 U trStar,
14     I myTime, myIter, myThid )
15    
16     C !DESCRIPTION: \bv
17     C *==========================================================*
18     C | SUBROUTINE SALT_PLUME_APPLY
19     C | o Apply the salt_pume-transport to tracer field
20     C *==========================================================*
21     C \ev
22    
23     C !USES:
24     IMPLICIT NONE
25    
26     C === Global variables ===
27     #include "SIZE.h"
28     #include "GRID.h"
29     #include "EEPARAMS.h"
30     #include "PARAMS.h"
31     #include "DYNVARS.h"
32     #include "SALT_PLUME.h"
33 atn 1.4 #ifdef ALLOW_GENERIC_ADVDIFF
34     # include "GAD.h"
35     #endif
36 atn 1.1
37     C !INPUT/OUTPUT PARAMETERS:
38     C === Routine arguments ===
39     C trIdentity :: tracer identification number
40     C bi,bj :: Tile indices
41     C recip_drF :: Reciprol of cell thickness
42     C recip_hFac_arg :: Reciprol of cell open-depth factor
43     C tracer :: tracer field at current time (input)
44 atn 1.4 C trApplyFlag:: [0]=update salt plume forcing T/S terms
45     C :: [1]=update gTr tendency
46 atn 1.1 C trStar :: future tracer field (modified)
47     C myTime :: Current time in simulation
48     C myIter :: Current time-step number
49     C myThid :: my Thread Id. number
50    
51 atn 1.4 INTEGER trIdentity, trApplyFlag
52 atn 1.1 INTEGER bi, bj
53     _RS recip_hFac_arg(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
54     _RL tracer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
55     _RL trStar (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
56    
57     _RL myTime
58     INTEGER myIter, myThid
59    
60     #ifdef ALLOW_SALT_PLUME
61     #ifdef SALT_PLUME_VOLUME
62    
63     C !LOCAL VARIABLES:
64     C === Local variables ===
65     C msgBuf :: Informational/error message buffer
66 atn 1.4 C plumetend :: forcing terms [W/m2 or kg/m2/s*psu]
67     C work :: working array
68 atn 1.1 C CHARACTER*(MAX_LEN_MBUF) msgBuf
69     INTEGER i, j, k
70     INTEGER upward
71 atn 1.4 LOGICAL onOffFlag
72 atn 1.5 _RL gTr_Surf2kLev, gTr_Below2kLev, gTr_kLev2Above,
73     & dSPvolBelow2kLev,
74     & SurfVal, SEAICE_Tfrz, ConvertFac, recip_ConvertFac
75 atn 1.4 integer kp1, Nrp1
76     _RL plumetend(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
77     _RL work(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
78 atn 1.1
79     #ifdef ALLOW_DIAGNOSTICS
80     CHARACTER*8 diagName
81 atn 1.3 CHARACTER*5 diagSufx
82 atn 1.1 LOGICAL doDiagSPtend
83     C- Functions:
84     LOGICAL DIAGNOSTICS_IS_ON
85     EXTERNAL DIAGNOSTICS_IS_ON
86 atn 1.4 #ifdef ALLOW_GENERIC_ADVDIFF
87     CHARACTER*5 GAD_DIAG_SUFX
88     EXTERNAL GAD_DIAG_SUFX
89 atn 1.5 #endif /* ALLOW_GENERIC_ADVDIFF */
90 atn 1.1 #endif /* ALLOW_DIAGNOSTICS */
91    
92     CEOP
93    
94 atn 1.4 IF ( trApplyFlag.LT.0 .OR. trApplyFlag.GT.1) THEN
95     STOP 'S/R SALT_PLUME_APPLY: incorrect setting of trApplyFlag!'
96     ELSE
97    
98     SEAICE_Tfrz = -1.96 _d 0
99    
100     onOffFlag = .FALSE.
101     #ifdef ALLOW_GENERIC_ADVDIFF
102     IF ( trIdentity.EQ.GAD_TEMPERATURE ) onOffFlag = .TRUE.
103     IF ( trIdentity.EQ.GAD_SALINITY ) onOffFlag = .TRUE.
104     #endif
105     IF ( onOffFlag ) THEN
106 atn 1.1 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
107    
108 atn 1.4 c upward = rkSign*NINT(-gravitySign)
109     upward = 1
110     IF (usingZCoords) upward = -1
111    
112     IF ( trIdentity.EQ.1 ) THEN
113     SurfVal = SEAICE_Tfrz
114     ConvertFac = HeatCapacity_Cp*rhoConst
115     recip_ConvertFac = recip_Cp*mass2rUnit
116 atn 1.1 #ifdef ALLOW_DIAGNOSTICS
117 atn 1.4 IF ( useDiagnostics ) diagSufx = 'EPtnd'
118 atn 1.1 #endif /* ALLOW_DIAGNOSTICS */
119 atn 1.4 ENDIF
120     IF ( trIdentity.EQ.2 ) THEN
121     SurfVal = SPbrineSconst
122     ConvertFac = rhoConst
123     recip_ConvertFac = mass2rUnit
124 atn 1.1 #ifdef ALLOW_DIAGNOSTICS
125 atn 1.4 IF ( useDiagnostics ) diagSufx = 'SPtnd'
126 atn 1.1 #endif /* ALLOW_DIAGNOSTICS */
127 atn 1.4 ENDIF
128 atn 1.1
129     #ifdef ALLOW_DIAGNOSTICS
130 atn 1.4 doDiagSPtend = .FALSE.
131     diagName = 'oce'
132     IF ( useDiagnostics ) THEN
133 atn 1.1 C-- Set diagnostic suffix for the current tracer
134 atn 1.4 #ifdef ALLOW_GENERIC_ADVDIFF
135     diagSufx = GAD_DIAG_SUFX( trIdentity, myThid )
136 atn 1.5 #endif /* ALLOW_GENERIC_ADVDIFF */
137 atn 1.4 diagName = 'oce'//diagSufx
138     doDiagSPtend = DIAGNOSTICS_IS_ON(diagName,myThid)
139 atn 1.1 ENDIF
140     #endif /* ALLOW_DIAGNOSTICS */
141    
142 atn 1.4 C-- initializing:
143     Nrp1=Nr+1
144     DO k=1,Nr
145     DO j=1,OLy
146     DO i=1,OLx
147     plumetend(i,j,k) = 0. _d 0
148     work(i,j,k) = tracer(i,j,k,bi,bj)
149     ENDDO
150     ENDDO
151     ENDDO
152     DO j=1,OLy
153     DO i=1,OLx
154     work(i,j,Nrp1) = 0. _d 0
155     ENDDO
156     ENDDO
157     C-----------------
158    
159     DO k=Nr,1,-1
160     kp1=k+1
161     DO j=1-OLy,sNy+OLy
162     DO i=1-OLx,sNx+OLx
163     C IF(trIdentity.EQ.GAD_SALINITY) SurfVal=SPbrineSalt(i,j,bi,bj)
164 atn 1.1 Catn:
165 atn 1.4 dSPvolBelow2kLev = -dSPvolkLev2Above(i,j,kp1,bi,bj)
166     gTr_Surf2kLev = dSPvolSurf2kLev(i,j,k,bi,bj) * SurfVal
167     gTr_Below2kLev= dSPvolBelow2kLev * work(i,j,kp1)
168 atn 1.1 Catn: gTr_kLev2Above works even for kLev=1 because this is how much
169     C volume of original [salinity,heat] associated with [SSS,SST]
170     C was replaced by same volume of brine [salt,heat(from SEAICE_Tfrz)].
171     C Note: by design, dSPvolkLev2Above already is negative
172 atn 1.4 gTr_kLev2Above= dSPvolkLev2Above(i,j,k,bi,bj) * work(i,j,k)
173    
174     C salt: [m/s * psu * kg/m3] = [kg/s/m2 psu] = unit of saltPlumeFlux
175     C theta:[m/s * kg/m3 * J/kg/degC * degC] = [W/m2]
176     plumetend(i,j,k) = ConvertFac *
177     & ( gTr_Surf2kLev + gTr_Below2kLev + gTr_kLev2Above )
178    
179     IF(trApplyFlag.EQ.1) THEN
180     Catn: updating tendency
181     trStar(i,j,k,bi,bj)=trStar(i,j,k,bi,bj)+plumetend(i,j,k)
182     & *recip_drF(k)*recip_hFac_arg(i,j,k,bi,bj)
183     & *recip_ConvertFac
184     ELSE
185     Catn: report T/S forcing terms related to saltplume, for kpp
186     trStar(i,j,k,bi,bj)=plumetend(i,j,k)
187     ENDIF
188     ENDDO
189 atn 1.1 ENDDO
190     ENDDO
191    
192     #ifdef ALLOW_DIAGNOSTICS
193 atn 1.4 IF ( doDiagSPtend )
194     & CALL DIAGNOSTICS_FILL(plumetend, diagName, 0,Nr,2,bi,bj,myThid)
195 atn 1.1 #endif /* ALLOW_DIAGNOSTICS */
196    
197     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
198 atn 1.4 C-- end if on-off-flag
199     ENDIF
200     C-- end trApplyFlag
201 atn 1.1 ENDIF
202    
203     #endif /* SALT_PLUME_VOLUME */
204     #endif /* ALLOW_SALT_PLUME */
205    
206     RETURN
207     END

  ViewVC Help
Powered by ViewVC 1.1.22