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

Contents of /MITgcm/model/src/adams_bashforth3.F

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


Revision 1.7 - (show annotations) (download)
Thu Aug 14 16:49:19 2014 UTC (9 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65c, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, HEAD
Changes since 1.6: +11 -10 lines
change gTracer (and/or tracer) argument (drop bi,bj indices) in S/R
  ADAMS_BASHFORTH(2&3), CYCLE_TRACER, CYCLE_AB_TRACER, FREESURF_RESCALE_G,
  IMPLDIFF, SOLVE_TRIDIAGONAL & SOLVE_PENTADIAGONAL

1 C $Header: /u/gcmpack/MITgcm/model/src/adams_bashforth3.F,v 1.6 2014/07/22 12:04:09 jmc Exp $
2 C $Name: $
3
4 #include "CPP_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: ADAMS_BASHFORTH3
8 C !INTERFACE:
9 SUBROUTINE ADAMS_BASHFORTH3(
10 I bi, bj, kArg, kSize,
11 U gTracer, gTrNm,
12 O AB_gTr,
13 I startAB, myIter, myThid )
14 C !DESCRIPTION: \bv
15 C *==========================================================*
16 C | S/R ADAMS_BASHFORTH3
17 C | o Extrapolate forward in time using third order
18 C | Adams-Bashforth method.
19 C *==========================================================*
20 C | Either apply to tendency (kArg>0) at level k=kArg,
21 C | or apply to state variable (kArg=0) for all levels
22 C *==========================================================*
23 C \ev
24 C Extrapolate forward in time using 2 A.B. parameters (alpha,beta),
25 C either tendency gX :
26 C \begin{equation*}
27 C gX^{n+1/2} = (1 + \alpha + \beta) gX^{n}
28 C - (\alpha + 2 \beta) gX^{n-1}
29 C + \beta gX^{n-2}
30 C \end{equation*}
31 C or state variable X :
32 C \begin{equation*}
33 C X^{n+1/2} = (1 + \alpha + \beta) X^{n}
34 C - (\alpha + 2 \beta) X^{n-1}
35 C + \beta X^{n-2}
36 C \end{equation*}
37 C with:
38 C (alpha,beta)=(1/2,5/12) : AB-3, stable until CFL = 0.724
39 C (note: beta=0.281105 give the Max stability: 0.78616)
40 C (alpha,beta)=(1/2+abEps,0) : return to previous quasi AB-2.
41 C (alpha,beta)=(0,0) : 1rst.Order forward time stepping
42
43 C !USES:
44 IMPLICIT NONE
45 C == Global variables ===
46 #include "SIZE.h"
47 #include "EEPARAMS.h"
48 #include "PARAMS.h"
49
50 C !INPUT/OUTPUT PARAMETERS:
51 C == Routine Arguments ==
52 C bi,bj :: Tile indices
53 C kArg :: if >0: apply AB on tendency at level k=kArg
54 C :: if =0: apply AB on state variable and process all levels
55 C kSize :: 3rd dimension of tracer and tendency arrays
56 C gTracer :: in: Tendency/State at current time
57 C :: out(kArg >0): Extrapolated Tendency at current time
58 C gTrNm :: in: Tendency/State at previous time
59 C :: out(kArg >0): Save tendency at current time
60 C :: out(kArg =0): Extrapolated State at current time
61 C AB_gTr :: Adams-Bashforth tendency increment
62 C startAB :: number of previous time level available to start/restart AB
63 C myIter :: Current time step number
64 C myThid :: my Thread Id. number
65 INTEGER bi, bj, kArg, kSize
66 _RL gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize)
67 _RL gTrNm (1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize,nSx,nSy,2)
68 _RL AB_gTr (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
69 INTEGER startAB
70 INTEGER myIter, myThid
71
72 #ifdef ALLOW_ADAMSBASHFORTH_3
73 C !LOCAL VARIABLES:
74 C == Local variables ==
75 C k :: level index
76 C i,j :: Loop counters
77 C m1,m2 :: indices for the 2 previous time-step Tendency
78 C ab1,ab2,ab3 :: Adams bashforth extrapolation weights.
79 INTEGER i,j, k, m1,m2
80 _RL ab0, ab1, ab2
81 CEOP
82
83 m1 = 1 + MOD(myIter+1,2)
84 m2 = 1 + MOD( myIter ,2)
85
86 C Adams-Bashforth timestepping weights
87 IF ( myIter.EQ.nIter0 .AND. startAB.EQ.0 ) THEN
88 ab0 = 0. _d 0
89 ab1 = 0. _d 0
90 ab2 = 0. _d 0
91 ELSEIF ( (myIter.EQ.nIter0 .AND. startAB.EQ.1)
92 & .OR. (myIter.EQ.1+nIter0 .AND. startAB.EQ.0) ) THEN
93 ab0 = alph_AB
94 ab1 = -alph_AB
95 ab2 = 0. _d 0
96 ELSE
97 ab0 = alph_AB + beta_AB
98 ab1 = -alph_AB - 2.*beta_AB
99 ab2 = beta_AB
100 ENDIF
101
102 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
103
104 IF ( kArg.EQ.0 ) THEN
105 C- Extrapolate forward in time the state variable, with AB weights:
106 DO k=1,kSize
107 DO j=1-OLy,sNy+OLy
108 DO i=1-OLx,sNx+OLx
109 AB_gTr(i,j) = ab0*gTracer(i,j,k)
110 & + ab1*gTrNm(i,j,k,bi,bj,m1)
111 & + ab2*gTrNm(i,j,k,bi,bj,m2)
112 gTrNm(i,j,k,bi,bj,m2) = gTracer(i,j,k) + AB_gTr(i,j)
113 ENDDO
114 ENDDO
115 ENDDO
116 ELSE
117 C- Extrapolate forward in time the tendency, with AB weights:
118 k = kArg
119 DO j=1-OLy,sNy+OLy
120 DO i=1-OLx,sNx+OLx
121 AB_gTr(i,j) = ab0*gTracer(i,j,k)
122 & + ab1*gTrNm(i,j,k,bi,bj,m1)
123 & + ab2*gTrNm(i,j,k,bi,bj,m2)
124 gTrNm(i,j,k,bi,bj,m2) = gTracer(i,j,k)
125 gTracer(i,j,k) = gTracer(i,j,k) + AB_gTr(i,j)
126 ENDDO
127 ENDDO
128 C---
129 ENDIF
130
131 #endif /* ALLOW_ADAMSBASHFORTH_3 */
132
133 RETURN
134 END

  ViewVC Help
Powered by ViewVC 1.1.22