[3] | 1 | |
---|
| 2 | C SUBROUTINE DE PARAMETRISATION DES MONTAGNES D ECHELLE SOUS MAILLE |
---|
| 3 | |
---|
| 4 | SUBROUTINE drag_noro (nlon,nlev,dtime,paprs,pplay,pgeop,pn2, |
---|
| 5 | e pmea,pstd, psig, pgam, pthe,ppic,pval, |
---|
| 6 | e kgwd,kdx,ktest, |
---|
| 7 | e t, u, v, |
---|
| 8 | s pulow, pvlow, pustr, pvstr, |
---|
[2047] | 9 | s d_t, d_u, d_v, |
---|
| 10 | s blustr,blvstr,pnlow,zeff,zbl, |
---|
| 11 | s ptau,tau0,knu2,kbreak) |
---|
[3] | 12 | c |
---|
[101] | 13 | use dimphy |
---|
[3] | 14 | IMPLICIT none |
---|
| 15 | |
---|
| 16 | c====================================================================== |
---|
| 17 | c Auteur(s): F.Lott (LMD/CNRS) date: 19950201 |
---|
| 18 | c Object: Mountain drag interface. Made necessary because: |
---|
| 19 | C 1. in the LMD-GCM Layers are from bottom to top, |
---|
| 20 | C contrary to most European GCM. |
---|
| 21 | c 2. the altitude above ground of each model layers |
---|
| 22 | c needs to be known (variable zgeom) |
---|
| 23 | c====================================================================== |
---|
| 24 | c Explicit Arguments: |
---|
| 25 | c ================== |
---|
| 26 | c nlon----input-I-Total number of horizontal points that get into physics |
---|
| 27 | c nlev----input-I-Number of vertical levels |
---|
| 28 | c dtime---input-R-Time-step (s) |
---|
| 29 | c paprs---input-R-Pressure in semi layers (Pa) |
---|
| 30 | c pplay---input-R-Pressure model-layers (Pa) |
---|
[1301] | 31 | c pgeop---input-R-Geopotential model layers (reference to ground) |
---|
[3] | 32 | c pn2-----input-R-Brunt-Vaisala freq.^2 at 1/2 layers |
---|
| 33 | c t-------input-R-temperature (K) |
---|
| 34 | c u-------input-R-Horizontal wind (m/s) |
---|
| 35 | c v-------input-R-Meridional wind (m/s) |
---|
| 36 | c pmea----input-R-Mean Orography (m) |
---|
| 37 | C pstd----input-R-SSO standard deviation (m) |
---|
| 38 | c psig----input-R-SSO slope |
---|
| 39 | c pgam----input-R-SSO Anisotropy |
---|
| 40 | c pthe----input-R-SSO Angle |
---|
| 41 | c ppic----input-R-SSO Peacks elevation (m) |
---|
| 42 | c pval----input-R-SSO Valleys elevation (m) |
---|
| 43 | c |
---|
| 44 | c kgwd- -input-I: Total nb of points where the orography schemes are active |
---|
| 45 | c ktest--input-I: Flags to indicate active points |
---|
| 46 | c kdx----input-I: Locate the physical location of an active point. |
---|
| 47 | |
---|
| 48 | c pulow, pvlow -output-R: Low-level wind |
---|
| 49 | c pustr, pvstr -output-R: Surface stress due to SSO drag (Pa) |
---|
| 50 | c |
---|
| 51 | c d_t-----output-R: T increment |
---|
| 52 | c d_u-----output-R: U increment |
---|
| 53 | c d_v-----output-R: V increment |
---|
| 54 | c |
---|
| 55 | c Implicit Arguments: |
---|
| 56 | c =================== |
---|
| 57 | c |
---|
| 58 | c iim--common-I: Number of longitude intervals |
---|
| 59 | c jjm--common-I: Number of latitude intervals |
---|
| 60 | c klon-common-I: Number of points seen by the physics |
---|
| 61 | c (iim+1)*(jjm+1) for instance |
---|
| 62 | c klev-common-I: Number of vertical layers |
---|
| 63 | c====================================================================== |
---|
| 64 | c Local Variables: |
---|
| 65 | c ================ |
---|
| 66 | c |
---|
[1301] | 67 | c zgeom-----R: Altitude (m) of layer above ground (from top to bottom) |
---|
[3] | 68 | c pt, pu, pv --R: t u v from top to bottom |
---|
| 69 | c pdtdt, pdudt, pdvdt --R: t u v tendencies (from top to bottom) |
---|
| 70 | c papmf: pressure at model layer (from top to bottom) |
---|
| 71 | c papmh: pressure at model 1/2 layer (from top to bottom) |
---|
| 72 | c |
---|
| 73 | c====================================================================== |
---|
| 74 | |
---|
| 75 | #include "YOMCST.h" |
---|
| 76 | #include "YOEGWD.h" |
---|
| 77 | |
---|
| 78 | c ARGUMENTS |
---|
| 79 | c |
---|
| 80 | INTEGER nlon,nlev |
---|
| 81 | REAL dtime |
---|
| 82 | REAL paprs(nlon,nlev+1) |
---|
| 83 | REAL pplay(nlon,nlev) |
---|
| 84 | REAL pgeop(nlon,nlev),pn2(nlon,nlev) |
---|
| 85 | REAL pmea(nlon),pstd(nlon),psig(nlon),pgam(nlon),pthe(nlon) |
---|
| 86 | REAL ppic(nlon),pval(nlon) |
---|
| 87 | REAL pulow(nlon),pvlow(nlon),pustr(nlon),pvstr(nlon) |
---|
| 88 | REAL t(nlon,nlev), u(nlon,nlev), v(nlon,nlev) |
---|
| 89 | REAL d_t(nlon,nlev), d_u(nlon,nlev), d_v(nlon,nlev) |
---|
[2047] | 90 | REAL blustr(nlon),blvstr(nlon),pnlow(nlon),zeff(nlon),zbl(nlon) |
---|
| 91 | REAL knu2(nlon),kbreak(nlon) |
---|
| 92 | REAL ztau(klon,klev+1), ptau(klon,klev), tau0(klon) |
---|
[3] | 93 | c |
---|
| 94 | INTEGER i, k, kgwd, kdx(nlon), ktest(nlon) |
---|
[2047] | 95 | INTEGER ikenvh(nlon) |
---|
| 96 | INTEGER iknu2(nlon) |
---|
| 97 | INTEGER ikbreak(nlon) |
---|
[3] | 98 | c |
---|
| 99 | c LOCAL VARIABLES: |
---|
| 100 | c |
---|
| 101 | REAL zgeom(klon,klev),zn2(klon,klev) |
---|
| 102 | REAL pdtdt(klon,klev), pdudt(klon,klev), pdvdt(klon,klev) |
---|
| 103 | REAL pt(klon,klev), pu(klon,klev), pv(klon,klev) |
---|
| 104 | REAL papmf(klon,klev),papmh(klon,klev+1) |
---|
| 105 | c |
---|
| 106 | c INITIALIZE OUTPUT VARIABLES |
---|
| 107 | c |
---|
| 108 | DO i = 1,klon |
---|
| 109 | pulow(i) = 0.0 |
---|
| 110 | pvlow(i) = 0.0 |
---|
| 111 | pustr(i) = 0.0 |
---|
| 112 | pvstr(i) = 0.0 |
---|
| 113 | ENDDO |
---|
| 114 | DO k = 1, klev |
---|
| 115 | DO i = 1, klon |
---|
| 116 | d_t(i,k) = 0.0 |
---|
| 117 | d_u(i,k) = 0.0 |
---|
| 118 | d_v(i,k) = 0.0 |
---|
| 119 | pdudt(i,k)=0.0 |
---|
| 120 | pdvdt(i,k)=0.0 |
---|
| 121 | pdtdt(i,k)=0.0 |
---|
| 122 | ENDDO |
---|
| 123 | ENDDO |
---|
| 124 | c |
---|
| 125 | c PREPARE INPUT VARIABLES FOR ORODRAG (i.e., ORDERED FROM TOP TO BOTTOM) |
---|
| 126 | C CALCULATE LAYERS HEIGHT ABOVE GROUND) |
---|
| 127 | c |
---|
| 128 | DO k = 1, klev |
---|
| 129 | DO i = 1, klon |
---|
| 130 | pt(i,k) = t(i,klev-k+1) |
---|
| 131 | pu(i,k) = u(i,klev-k+1) |
---|
| 132 | pv(i,k) = v(i,klev-k+1) |
---|
| 133 | papmf(i,k) = pplay(i,klev-k+1) |
---|
| 134 | ENDDO |
---|
| 135 | ENDDO |
---|
| 136 | DO k = 1, klev+1 |
---|
| 137 | DO i = 1, klon |
---|
| 138 | papmh(i,k) = paprs(i,klev-k+2) |
---|
| 139 | ENDDO |
---|
| 140 | ENDDO |
---|
| 141 | |
---|
| 142 | DO k = klev, 1, -1 |
---|
| 143 | DO i = 1, klon |
---|
[1301] | 144 | zgeom(i,k) = pgeop(i,klev-k+1)/RG |
---|
[2047] | 145 | zn2(i,k) = pn2(i,klev-k+1) |
---|
[3] | 146 | ENDDO |
---|
| 147 | ENDDO |
---|
| 148 | |
---|
| 149 | c CALL SSO DRAG ROUTINES |
---|
| 150 | c |
---|
| 151 | CALL orodrag(klon,klev,kgwd,kdx,ktest, |
---|
| 152 | . dtime, |
---|
| 153 | . papmh, papmf, zgeom, zn2, |
---|
| 154 | . pt, pu, pv, |
---|
| 155 | . pmea, pstd, psig, pgam, pthe, ppic,pval, |
---|
| 156 | . pulow,pvlow, |
---|
[2047] | 157 | . pdudt,pdvdt,pdtdt, |
---|
| 158 | . blustr,blvstr,pnlow,zeff,ikenvh, |
---|
| 159 | . ztau,iknu2,ikbreak) |
---|
| 160 | |
---|
| 161 | zbl(:) = real(klev-ikenvh(:)) |
---|
| 162 | knu2(:) = real(klev-iknu2(:)) |
---|
| 163 | kbreak(:) = real(klev-ikbreak(:)) |
---|
| 164 | tau0 = ztau(:,klev+1) |
---|
| 165 | |
---|
[3] | 166 | C |
---|
| 167 | C COMPUTE INCREMENTS AND STRESS FROM TENDENCIES |
---|
| 168 | |
---|
| 169 | DO k = 1, klev |
---|
| 170 | DO i = 1, klon |
---|
[2047] | 171 | ptau(i,klev+1-k) = ztau(i,k) |
---|
[3] | 172 | d_u(i,klev+1-k) = dtime*pdudt(i,k) |
---|
| 173 | d_v(i,klev+1-k) = dtime*pdvdt(i,k) |
---|
| 174 | d_t(i,klev+1-k) = dtime*pdtdt(i,k) |
---|
| 175 | pustr(i) = pustr(i) |
---|
| 176 | . +pdudt(i,k)*(papmh(i,k+1)-papmh(i,k))/rg |
---|
| 177 | pvstr(i) = pvstr(i) |
---|
| 178 | . +pdvdt(i,k)*(papmh(i,k+1)-papmh(i,k))/rg |
---|
| 179 | ENDDO |
---|
| 180 | ENDDO |
---|
| 181 | c |
---|
| 182 | RETURN |
---|
| 183 | END |
---|
| 184 | |
---|