/[MITgcm]/MITgcm/pkg/ptracers/ptracers_integrate.F
ViewVC logotype

Contents of /MITgcm/pkg/ptracers/ptracers_integrate.F

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


Revision 1.1 - (show annotations) (download)
Mon Mar 4 19:01:29 2002 UTC (22 years, 2 months ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint44f_post, checkpoint44h_pre, checkpoint45a_post, checkpoint44g_post, checkpoint44h_post, checkpoint45
Added PTRACERS package

This allows an arbitrary number of passive tracers to be integrated
forward simultaneously with the dynamicaly model.
 + Implemented so far:
    - basic forward algorithm (time-stepping, advection, diffusion, convection)
    - I/O and checkpointing
    - GM/Redi  *but*  using the GM/Redi coefficient of Salt
 + Not implemented so far:
    - KPP
    - OBCS
 + No specific example supplied (yet) but global_ocean.90x40x15 has the
   necessary data.ptracer file. Simply use -enable=ptracers and uncomment
   line in data.pkg. PTRACER01 then reproduces Salt exactly.
 + This package is disabled by default since it increases storage.

1 C $Header: $
2 C $Name: $
3
4 #include "PTRACERS_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: PTRACERS_INTEGERATE
8
9 C !INTERFACE: ==========================================================
10 SUBROUTINE PTRACERS_INTEGERATE(
11 I bi,bj,k,
12 I xA,yA,uTrans,vTrans,rTrans,maskUp,
13 X KappaRtr,
14 I myIter,myTime,myThid )
15
16 C !DESCRIPTION:
17 C Calculates tendancy for passive tracers and integrates forward
18 C in time.
19
20 C !USES: ===============================================================
21 IMPLICIT NONE
22 #include "SIZE.h"
23 #include "EEPARAMS.h"
24 #include "PTRACERS.h"
25 #include "GAD.h"
26
27 C !INPUT PARAMETERS: ===================================================
28 C bi,bj :: tile indices
29 C k :: vertical level number
30 C xA :: face area at U points in level k
31 C yA :: face area at V points in level k
32 C uTrans :: zonal transport in level k
33 C vTrans :: meridional transport in level k
34 C rTrans :: vertical transport across level k
35 C maskUp :: mask for vertical transport
36 C KappaRtr :: vertical diffusion of passive tracers
37 C NOTE! This is infact KappaRS from thermodynamics()
38 C and is being used only temporarily
39 C until we removed the need to store
40 C a "3D" diffusivity
41 C myIter :: time-step number
42 C myTime :: model time
43 C myThid :: thread number
44 INTEGER bi,bj,k
45 _RS xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
46 _RS yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
47 _RL uTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
48 _RL vTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
49 _RL rTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
50 _RS maskUp (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
51 _RL KappaRtr(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
52 INTEGER myIter
53 _RL myTime
54 INTEGER myThid
55
56 C !OUTPUT PARAMETERS: ==================================================
57 C none
58
59 #ifdef ALLOW_PTRACERS
60
61 C !LOCAL VARIABLES: ====================================================
62 C i,j,k,bi,bj,iTracer :: loop indices
63 C iMin,iMax,jMin,jMax :: loop ranges
64 C kUp,kDown :: toggle indices for even/odd level fluxes
65 C km1 :: =min(1,k-1)
66 C rFlx :: vertical flux
67 INTEGER i,j,iTracer
68 INTEGER iMin,iMax,jMin,jMax
69 INTEGER kUp,kDown,km1
70 _RL rFlx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,2,PTRACERS_num)
71 CEOP
72
73 C Loop over tracers
74 DO iTracer=1,PTRACERS_numInUse
75
76 C Initialize vertical flux to zero and set no-flux across k=Nr+1
77 IF (k.EQ.Nr) THEN
78 DO j=1-Oly,sNy+Oly
79 DO i=1-Olx,sNx+Olx
80 rFlx(i,j,1,iTracer)=0.
81 rFlx(i,j,2,iTracer)=0.
82 ENDDO
83 ENDDO
84 ENDIF
85
86 C Loop ranges for daughter routines
87 iMin = 1-OLx+2
88 iMax = sNx+OLx-1
89 jMin = 1-OLy+2
90 jMax = sNy+OLy-1
91
92 km1 = MAX(1,k-1)
93 kUp = 1+MOD(k+1,2)
94 kDown= 1+MOD(k,2)
95
96 C Calculate active tracer tendencies (gPtr) due to internal processes
97 C (advection, [explicit] diffusion, parameterizations,...)
98 CALL GAD_CALC_RHS(
99 I bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
100 I xA,yA,uTrans,vTrans,rTrans,maskUp,
101 I PTRACERS_diffKh(iTracer),
102 I PTRACERS_diffK4(iTracer),
103 I KappaRtr,
104 I pTracer(1-Olx,1-Oly,1,1,1,iTracer),
105 I GAD_TR1,
106 I PTRACERS_advScheme(iTracer),
107 U rFlx(1-Olx,1-Oly,1,iTracer),
108 U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
109 I myThid )
110
111 C External forcing term(s)
112 CALL PTRACERS_FORCING(
113 I bi,bj,k,iTracer,
114 U gPtr,
115 I myIter,myTime,myThid)
116
117 C If using Adams-Bashforth II, then extrapolate tendancies
118 IF ( PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_2ND
119 & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_UPWIND_3RD
120 & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_4TH ) THEN
121 CALL ADAMS_BASHFORTH2(
122 I bi,bj,K,
123 U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
124 U gPtrNm1(1-Olx,1-Oly,1,1,1,iTracer),
125 I myIter,myThid )
126 ENDIF
127
128 #ifdef NONLIN_FRSURF
129 C Account for change in level thickness
130 IF (nonlinFreeSurf.GT.0) THEN
131 CALL FREESURF_RESCALE_G(
132 I bi,bj,K,
133 U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
134 I myThid )
135 ENDIF
136 #endif /* NONLIN_FRSURF */
137
138 C Integrate forward in time, storing in gPtr: G=T+dt*G
139 CALL TIMESTEP_TRACER(
140 I bi,bj,iMin,iMax,jMin,jMax,k,
141 I PTRACERS_advScheme(iTracer),
142 I pTracer(1-Olx,1-Oly,1,1,1,iTracer),
143 I gPtr(1-Olx,1-Oly,1,1,1,iTracer),
144 I myIter,myThid )
145
146 C end of tracer loop
147 ENDDO
148
149 #endif /* ALLOW_PTRACERS */
150
151 RETURN
152 END

  ViewVC Help
Powered by ViewVC 1.1.22