/[MITgcm]/MITgcm/pkg/generic_advdiff/gad_fluxlimit_impl_r.F
ViewVC logotype

Annotation of /MITgcm/pkg/generic_advdiff/gad_fluxlimit_impl_r.F

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


Revision 1.3 - (hide annotations) (download)
Mon Mar 29 03:33:51 2004 UTC (20 years, 2 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52n_post, checkpoint53d_post, checkpoint54a_pre, checkpoint55c_post, checkpoint54e_post, checkpoint54a_post, checkpoint53c_post, checkpoint55d_pre, checkpoint55j_post, checkpoint56b_post, checkpoint55h_post, checkpoint53b_post, checkpoint54b_post, checkpoint53b_pre, checkpoint55b_post, checkpoint54d_post, checkpoint56c_post, checkpoint52m_post, checkpoint55, checkpoint53a_post, checkpoint54, checkpoint54f_post, checkpoint55g_post, checkpoint55f_post, checkpoint55i_post, checkpoint56, checkpoint53, checkpoint53g_post, checkpoint55e_post, checkpoint53f_post, checkpoint55a_post, checkpoint53d_pre, checkpoint54c_post, checkpoint56a_post, checkpoint55d_post
Changes since 1.2: +27 -31 lines
 o new "poster children" for the API reference:
   - generic_advdiff
   - mnc

1 edhill 1.3 C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_fluxlimit_impl_r.F,v 1.2 2004/03/24 15:20:35 adcroft Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "GAD_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: GAD_FLUXLIMIT_IMPL_R
8     C !INTERFACE:
9     SUBROUTINE GAD_FLUXLIMIT_IMPL_R(
10     I bi,bj,k, iMin,iMax,jMin,jMax,
11     I deltaTarg, rTrans, tFld,
12     O a3d, b3d, c3d,
13     I myThid )
14    
15 edhill 1.3 C !DESCRIPTION:
16     C Compute matrix element to solve vertical advection implicitly
17     C using flux--limiter advection scheme. The contribution of
18     C vertical transport at interface k is added to matrix lines k and
19     C k-1.
20 jmc 1.1
21     C !USES:
22     IMPLICIT NONE
23    
24     C == Global variables ===
25     #include "SIZE.h"
26     #include "GRID.h"
27     #include "EEPARAMS.h"
28     #include "PARAMS.h"
29    
30     C !INPUT/OUTPUT PARAMETERS:
31     C == Routine Arguments ==
32 edhill 1.3 C bi,bj :: tile indices
33     C k :: vertical level
34     C iMin,iMax :: computation domain
35     C jMin,jMax :: computation domain
36     C deltaTarg :: time step
37     C rTrans :: vertical volume transport
38     C tFld :: tracer field
39     C a3d :: lower diagonal of the tridiagonal matrix
40     C b3d :: main diagonal of the tridiagonal matrix
41     C c3d :: upper diagonal of the tridiagonal matrix
42     C myThid :: thread number
43 jmc 1.1 INTEGER bi,bj,k
44     INTEGER iMin,iMax,jMin,jMax
45     _RL deltaTarg
46     _RL rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
47     _RL tFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
48     _RL a3d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
49     _RL b3d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
50     _RL c3d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
51     INTEGER myThid
52    
53     C == Local Variables ==
54 edhill 1.3 C i,j :: loop indices
55     C kp1 :: =min( k+1 , Nr )
56     C km1 :: =max( k-1 , 1 )
57     C km2 :: =max( k-2 , 1 )
58     C Cr :: slope ratio
59     C Rjm,Rj,Rjp :: differences at i-1,i,i+1
60     C w_CFL :: Courant-Friedrich-Levy number
61     C upwindFac :: upwind factor
62     C rCenter :: centered contribution
63     C rUpwind :: upwind contribution
64 jmc 1.1 INTEGER i,j,kp1,km1,km2
65     _RL Cr,Rjm,Rj,Rjp, w_CFL
66     _RL upwindFac(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
67     _RL rCenter, rUpwind
68    
69     C Statement function provides Limiter(Cr)
70     #include "GAD_FLUX_LIMITER.h"
71     CEOP
72    
73     km2=MAX(1,k-2)
74     km1=MAX(1,k-1)
75     kp1=MIN(Nr,k+1)
76    
77     IF ( k.GT.Nr .OR. k.LT.2 ) RETURN
78    
79     C-- Compute the upwind fraction:
80     DO j=jMin,jMax
81     DO i=iMin,iMax
82     w_CFL = rTrans(i,j)*recip_rA(i,j,bi,bj)*deltaTarg*recip_drC(k)
83     Rjp=(tFld(i,j,kp1)-tFld(i,j,k) )*maskC(i,j,kp1,bi,bj)
84     Rj =(tFld(i,j,k) -tFld(i,j,km1))
85     Rjm=(tFld(i,j,km1)-tFld(i,j,km2))*maskC(i,j,km2,bi,bj)
86    
87     IF ( Rj.NE.0. _d 0) THEN
88     IF (rTrans(i,j).LT.0. _d 0) THEN
89     Cr=Rjm/Rj
90     ELSE
91     Cr=Rjp/Rj
92     ENDIF
93     upwindFac(i,j) = 1. _d 0
94     & - Limiter(Cr) * ( 1. _d 0 + abs(w_CFL) )
95     upwindFac(i,j) = max( -1. _d 0, upwindFac(i,j) )
96     ELSE
97     upwindFac(i,j) = 0. _d 0
98     ENDIF
99     ENDDO
100     ENDDO
101    
102     C-- Add centered & upwind contributions
103     DO j=jMin,jMax
104     DO i=iMin,iMax
105     rCenter = 0.5 _d 0 *deltaTtracer*rTrans(i,j)
106     & *recip_rA(i,j,bi,bj)*rkFac
107     rUpwind = abs(rCenter)*upwindFac(i,j)
108     a3d(i,j,k) = a3d(i,j,k)
109     & + (rCenter-rUpwind)
110     & *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
111     b3d(i,j,k) = b3d(i,j,k)
112     & + (rCenter+rUpwind)
113     & *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
114     b3d(i,j,k-1) = b3d(i,j,k-1)
115     & - (rCenter-rUpwind)
116     & *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
117     c3d(i,j,k-1) = c3d(i,j,k-1)
118     & - (rCenter+rUpwind)
119     & *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
120     ENDDO
121     ENDDO
122    
123     RETURN
124     END

  ViewVC Help
Powered by ViewVC 1.1.22