1 |
C $Id: inc_tracer.F,v 1.3 1998/06/15 05:13:54 cnh Exp $ |
2 |
#include "CPP_OPTIONS.h" |
3 |
#include "CPP_MACROS.h" |
4 |
C Procedure name: INC_TRACER |
5 |
C Function: Controls steppping forward tracer field. |
6 |
C Written: 10th January 1994, by Chris Hill M.I.T. |
7 |
C Updated: Fall 1995, Moto Nakamura, M.I.T., mixing schemes |
8 |
C Updated: Fall 1995, Curtis Heisey, M.I.T., generalized routine |
9 |
C Comments: |
10 |
CStartofinterface |
11 |
SUBROUTINE INC_TRACER ( |
12 |
I U, V, W, |
13 |
U Q, QT, QTNM1, |
14 |
I Kredigm,K31,K32,K33, |
15 |
I surfProf,tracerStepping,tracerDiffusion,tracerBhDiffusion, |
16 |
I tracerAdvection,tracerForcing,a4TracerXY,a2TracerXY, |
17 |
I a2TracerZ |
18 |
O ) |
19 |
IMPLICIT NONE |
20 |
C ======== Global data ============================ |
21 |
#include "SIZE.h" |
22 |
#include "OPERATORS.h" |
23 |
#include "GRID.h" |
24 |
#include "PARAMS.h" |
25 |
#include "MASKS.h" |
26 |
C ======== Routine arguments ====================== |
27 |
REAL U (_I3(Nz,Nx,Ny)) |
28 |
REAL V (_I3(Nz,Nx,Ny)) |
29 |
REAL W (_I3(Nz,Nx,Ny)) |
30 |
REAL Q (_I3(Nz,Nx,Ny)) |
31 |
REAL QT (_I3(Nz,Nx,Ny)) |
32 |
REAL QTNM1 (_I3(Nz,Nx,Ny)) |
33 |
REAL Kredigm (_I3(Nz,Nx,Ny)) |
34 |
REAL K31 (_I3(Nz,Nx,Ny)) |
35 |
REAL K32 (_I3(Nz,Nx,Ny)) |
36 |
REAL K33 (_I3(Nz,Nx,Ny)) |
37 |
REAL surfProf(Nx,Ny) |
38 |
LOGICAL tracerStepping |
39 |
LOGICAL tracerDiffusion |
40 |
LOGICAL tracerBhDiffusion |
41 |
LOGICAL tracerAdvection |
42 |
LOGICAL tracerForcing |
43 |
REAL a4TracerXY |
44 |
REAL a2TracerXY |
45 |
REAL a2TracerZ |
46 |
CEndofinterface |
47 |
C Local variables |
48 |
C qXM1 - Q shifted -1 in X. |
49 |
C qYM1 - Q shifted -1 in Y. |
50 |
REAL qXM1 (_I3(Nz,Nx,Ny)) |
51 |
REAL qYM1 (_I3(Nz,Nx,Ny)) |
52 |
REAL qZM1 (_I3(Nz,Nx,Ny)) |
53 |
REAL fluxWest (_I3(Nz,Nx,Ny)) |
54 |
REAL fluxSouth (_I3(Nz,Nx,Ny)) |
55 |
REAL fluxUpper (_I3(Nz,Nx,Ny)) |
56 |
REAL dqDx (_I3(Nz,Nx,Ny)) |
57 |
REAL dqDy (_I3(Nz,Nx,Ny)) |
58 |
REAL dqDz (_I3(Nz,Nx,Ny)) |
59 |
REAL dqDzBz(_I3(Nz,Nx,Ny)) |
60 |
integer K |
61 |
|
62 |
qXM1 = Cshift(Q,DIM=_I3X,SHIFT=-1) |
63 |
qYM1 = Cshift(Q,DIM=_I3Y,SHIFT=-1) |
64 |
qZM1 = Cshift(Q,DIM=_I3Z,SHIFT=-1) |
65 |
qT = 0. |
66 |
|
67 |
fluxWest = 0. |
68 |
fluxSouth = 0. |
69 |
fluxUpper = 0. |
70 |
IF ( tracerDiffusion ) THEN |
71 |
C Include del**2 3d dissipation of Q, -1.*div[k2.grad(Q)], |
72 |
C and/or del**4 lateral dissipation of Q, divh[k4.gradh(divh[gradh(Q))]. |
73 |
dQdx = (Q-qXM1)*pDdxOp |
74 |
dQdy = (Q-qYM1)*pDdyOp |
75 |
do K=2,Nz |
76 |
dQdz(_I3(K,:,:))=(G*RONIL)*rDZatW(K)*(qZM1(_I3(K,:,:))-Q(_I3(K,:,:))) |
77 |
enddo |
78 |
! Extrapolate downward from above at W=0 surfaces |
79 |
dQdz=WMASK*dQdz+(1.-WMASK)*CSHIFT(dQdz,DIM=_I3Z,SHIFT=-1) |
80 |
! Extrapolate upward from below at Z=0 |
81 |
dQdz(_I3(1,:,:))=dQdz(_I3(2,:,:)) |
82 |
! Interpolate to tracer points |
83 |
dQdzBz=0.5*(dqdz+CSHIFT(dQdz,DIM=_I3Z,SHIFT=+1))*PMASK |
84 |
dQdzBz(_I3(Nz,:,:))=dQdz(_I3(Nz-1,:,:)) |
85 |
|
86 |
!?? fluxWest = XA*(Q-qXM1)*pDdxOp*umask |
87 |
!?? fluxSouth = YA*(Q-qYM1)*pDdyOp*vmask |
88 |
!?? IF ( tracerBhDiffusion ) fluxUpper=rPVol*PMASK*( |
89 |
!?? & Cshift(fluxWest,DIM=_I3X,SHIFT=+1) |
90 |
!?? & -fluxWest+Cshift(fluxSouth,DIM=_I3Y,SHIFT=+1)-fluxSouth) |
91 |
IF ( tracerBhDiffusion ) THEN |
92 |
fluxWest = XA*(Q-qXM1)*pDdxOp*umask |
93 |
fluxSouth = YA*(Q-qYM1)*pDdyOp*vmask |
94 |
fluxUpper=rPVol*PMASK*( Cshift(fluxWest,DIM=_I3X,SHIFT=+1) |
95 |
& -fluxWest+Cshift(fluxSouth,DIM=_I3Y,SHIFT=+1)-fluxSouth) |
96 |
ENDIF |
97 |
|
98 |
fluxWest = -UMASK*XA*( |
99 |
& (0.5*(Kredigm+CSHIFT(Kredigm,DIM=_I3X,SHIFT=-1))+a2TracerXY) |
100 |
& *dQDx |
101 |
& ) |
102 |
|
103 |
fluxSouth = -VMASK*YA*( |
104 |
& (0.5*(Kredigm+CSHIFT(Kredigm,DIM=_I3Y,SHIFT=-1))+a2TracerXY) |
105 |
& *dQDy |
106 |
& ) |
107 |
|
108 |
IF ( tracerBhDiffusion ) THEN |
109 |
fluxWest = fluxWest + |
110 |
& a4TracerXY*XA*(fluxUpper-Cshift(fluxUpper,DIM=_I3X,SHIFT=-1))*pDdxOp |
111 |
fluxSouth = fluxSouth+ |
112 |
& a4TracerXY*YA*(fluxUpper-Cshift(fluxUpper,DIM=_I3Y,SHIFT=-1))*pDdyOp |
113 |
ENDIF |
114 |
|
115 |
! Interpolate d/dx Q and d/dy Q to W points |
116 |
dQdx=0.5d0*(dQdx+CSHIFT(dQdx,DIM=_I3X,SHIFT=+1))*PMASK ! Interp to T |
117 |
dQdx=0.5d0*(dQdx+CSHIFT(dQdx,DIM=_I3Z,SHIFT=-1))*WMASK ! Interp to W |
118 |
dQdy=0.5d0*(dQdy+CSHIFT(dQdy,DIM=_I3Y,SHIFT=+1))*PMASK ! Interp to T |
119 |
dQdy=0.5d0*(dQdy+CSHIFT(dQdy,DIM=_I3Z,SHIFT=-1))*WMASK ! Interp to W |
120 |
|
121 |
!! fluxUpper = -ZA*0.5*(Kredi+CSHIFT(Kredi,DIM=_I3Z,SHIFT=-1)) |
122 |
!! & *( K31*dQdx + K32*dQdy + K33*dQdz ) |
123 |
|
124 |
fluxUpper = -ZA*( |
125 |
& 0.5*(Kredigm+CSHIFT(Kredigm,DIM=_I3Z,SHIFT=-1)) |
126 |
& *( K31*dQdx + K32*dQdy ) |
127 |
& +0.5*(Kredigm+CSHIFT(Kredigm,DIM=_I3Z,SHIFT=-1)) |
128 |
& *( K33*dQdz ) |
129 |
& ) |
130 |
|
131 |
! Add in vertical diffusion (Av d^2/dz^2) |
132 |
! fluxUpper=-wmask*g*ronil*fluxUpper-a2TracerZ*wmask*ZA*(Q-qZM1))*pDdzOP |
133 |
fluxUpper = -WMASK*( (G*RONIL)*fluxUpper-a2TracerZ*ZA*(qZM1-Q)*pDdzOP ) |
134 |
fluxUpper(_I3(1,:,:)) = 0. |
135 |
ENDIF |
136 |
IF ( tracerAdvection ) THEN |
137 |
C Include transport of temperature by flow field. |
138 |
fluxWest = fluxWest +XA*(qXM1*0.5+Q*0.5)*U*UMASK |
139 |
fluxSouth = fluxSouth+YA*(qYM1*0.5+Q*0.5)*V*VMASK |
140 |
fluxUpper = fluxUpper+ZA*(qZM1*0.5+Q*0.5)*W*WMASK |
141 |
ENDIF |
142 |
IF ( tracerDiffusion .OR. tracerAdvection ) THEN |
143 |
qT = qT - ( |
144 |
& +Cshift(fluxWest,DIM=_I3X,SHIFT=+1)-fluxWest |
145 |
& +Cshift(fluxSouth,DIM=_I3Y,SHIFT=+1)-fluxSouth |
146 |
& -fluxUpper+Cshift(fluxUpper,DIM=_I3Z,SHIFT=+1) |
147 |
& )*rPVol |
148 |
ENDIF |
149 |
qT(_I3(1,:,:)) = qT(_I3(1,:,:)) |
150 |
& + freeSurfFac*W(_I3(1,:,:))*Q(_I3(1,:,:))/delps(1) |
151 |
|
152 |
IF(tracerForcing)THEN |
153 |
C Include external forcing ( e.g. surface heat fluxes, boundary fluxes ) |
154 |
C Switch in the appropriate tracer forcing module |
155 |
qT(_I3(1,:,:)) = qT(_I3(1,:,:)) |
156 |
& - 1./(30.*oneDay)*(Q(_I3(1,:,:))-surfProf(:,:)) |
157 |
c & - surfProf(_I3(2,:,:)) |
158 |
ENDIF |
159 |
qT = qT*PMASK |
160 |
|
161 |
C |
162 |
Q = Q + ( (1.5+abEps)*qT-(0.5+abEps)*qTNM1 )*delT*asyncfac |
163 |
C |
164 |
|
165 |
RETURN |
166 |
END |