| 1 | ! |
|---|
| 2 | !-- Module for Gravity Wave Drag (GWD) and Mountain Blocking (MB) |
|---|
| 3 | ! |
|---|
| 4 | !-- Initially incorporated into the WRF NMM from the GFS by B. Ferrier |
|---|
| 5 | ! in April/May 2007. |
|---|
| 6 | ! |
|---|
| 7 | ! Search for "ORIGINAL DOCUMENTATION BLOCK" for further description. |
|---|
| 8 | ! |
|---|
| 9 | !####################################################################### |
|---|
| 10 | ! |
|---|
| 11 | MODULE module_gwd |
|---|
| 12 | ! |
|---|
| 13 | ! USE MODULE_DM ! to get processor element |
|---|
| 14 | USE MODULE_EXT_INTERNAL ! to assign fortan unit number |
|---|
| 15 | ! |
|---|
| 16 | !-- Contains subroutines GWD_init, GWD_driver, and GWD_col |
|---|
| 17 | ! |
|---|
| 18 | !####################################################################### |
|---|
| 19 | ! |
|---|
| 20 | INTEGER, PARAMETER :: KIND_PHYS=SELECTED_REAL_KIND(13,60) ! the '60' maps to 64-bit real |
|---|
| 21 | INTEGER,PRIVATE,SAVE :: IMX, NMTVR, IDBG, JDBG |
|---|
| 22 | REAL,PRIVATE,SAVE :: RAD_TO_DEG !-- Convert radians to degrees |
|---|
| 23 | REAL,PRIVATE,SAVE :: DEG_TO_RAD !-- Convert degrees to radians |
|---|
| 24 | REAL (KIND=KIND_PHYS),PRIVATE,SAVE :: DELTIM,RDELTIM |
|---|
| 25 | REAL(kind=kind_phys),PRIVATE,PARAMETER :: SIGFAC=0.0 !-- Key tunable parameter |
|---|
| 26 | !dbg real,private,save :: dumin,dumax,dvmin,dvmax !dbg |
|---|
| 27 | ! |
|---|
| 28 | CONTAINS |
|---|
| 29 | ! |
|---|
| 30 | !-- Initialize variables used in GWD + MB |
|---|
| 31 | ! |
|---|
| 32 | SUBROUTINE GWD_init (DTPHS,DELX,DELY,CEN_LAT,CEN_LON,RESTRT & |
|---|
| 33 | & ,GLAT,GLON,CROT,SROT,HANGL & |
|---|
| 34 | & ,IDS,IDE,JDS,JDE,KDS,KDE & |
|---|
| 35 | & ,IMS,IME,JMS,JME,KMS,KME & |
|---|
| 36 | & ,ITS,ITE,JTS,JTE,KTS,KTE ) |
|---|
| 37 | |
|---|
| 38 | ! |
|---|
| 39 | IMPLICIT NONE |
|---|
| 40 | ! |
|---|
| 41 | !== INPUT: |
|---|
| 42 | !-- DELX, DELY - DX, DY grid resolutions in zonal, meridional directions (m) |
|---|
| 43 | !-- CEN_LAT, CEN_LON - central latitude, longitude (degrees) |
|---|
| 44 | !-- RESTRT - logical flag for restart file (true) or WRF input file (false) |
|---|
| 45 | !-- GLAT, GLON - central latitude, longitude at mass points (radians) |
|---|
| 46 | !-- CROT, SROT - cosine and sine of the angle between Earth and model coordinates |
|---|
| 47 | !-- HANGL - angle of the mountain range w/r/t east (convert to degrees) |
|---|
| 48 | ! |
|---|
| 49 | !-- Saved variables within module: |
|---|
| 50 | !-- IMX - in the GFS it is an equivalent number of points along a latitude |
|---|
| 51 | ! circle (e.g., IMX=3600 for a model resolution of 0.1 deg) |
|---|
| 52 | ! => Calculated at start of model integration in GWD_init |
|---|
| 53 | !-- NMTVR - number of input 2D orographic fields |
|---|
| 54 | !-- GRAV = gravitational acceleration |
|---|
| 55 | !-- DELTIM - physics time step (s) |
|---|
| 56 | !-- RDELTIM - reciprocal of physics time step (s) |
|---|
| 57 | ! |
|---|
| 58 | !== INPUT indices: |
|---|
| 59 | !-- ids start index for i in domain |
|---|
| 60 | !-- ide end index for i in domain |
|---|
| 61 | !-- jds start index for j in domain |
|---|
| 62 | !-- jde end index for j in domain |
|---|
| 63 | !-- kds start index for k in domain |
|---|
| 64 | !-- kde end index for k in domain |
|---|
| 65 | !-- ims start index for i in memory |
|---|
| 66 | !-- ime end index for i in memory |
|---|
| 67 | !-- jms start index for j in memory |
|---|
| 68 | !-- jme end index for j in memory |
|---|
| 69 | !-- kms start index for k in memory |
|---|
| 70 | !-- kme end index for k in memory |
|---|
| 71 | !-- its start index for i in tile |
|---|
| 72 | !-- ite end index for i in tile |
|---|
| 73 | !-- jts start index for j in tile |
|---|
| 74 | !-- jte end index for j in tile |
|---|
| 75 | !-- kts start index for k in tile |
|---|
| 76 | !-- kte end index for k in tile |
|---|
| 77 | ! |
|---|
| 78 | REAL, INTENT(IN) :: DTPHS,DELX,DELY,CEN_LAT,CEN_LON |
|---|
| 79 | LOGICAL, INTENT(IN) :: RESTRT |
|---|
| 80 | REAL, INTENT(IN), DIMENSION (ims:ime,jms:jme) :: GLON,GLAT |
|---|
| 81 | REAL, INTENT(OUT), DIMENSION (ims:ime,jms:jme) :: CROT,SROT |
|---|
| 82 | REAL, INTENT(INOUT), DIMENSION (ims:ime,jms:jme) :: HANGL |
|---|
| 83 | INTEGER, INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE & |
|---|
| 84 | & ,IMS,IME,JMS,JME,KMS,KME & |
|---|
| 85 | & ,ITS,ITE,JTS,JTE,KTS,KTE |
|---|
| 86 | ! |
|---|
| 87 | !-- Local variables: |
|---|
| 88 | ! |
|---|
| 89 | REAL, PARAMETER :: POS1=1.,NEG1=-1. |
|---|
| 90 | REAL :: DX,DTR,LAT0,LoN0,CLAT0,SLAT0,CLAT,DLON,X,Y,TLON,ROT |
|---|
| 91 | INTEGER :: I,J |
|---|
| 92 | |
|---|
| 93 | !dbg |
|---|
| 94 | !dbg real :: xdbg,ydbg,d_x,d_y,dist,dist_min |
|---|
| 95 | !dbg data xdbg,ydbg / -118.3,36 / ! 118.3W 36 N |
|---|
| 96 | |
|---|
| 97 | ! |
|---|
| 98 | !----------------------------------------------------------------------- |
|---|
| 99 | ! |
|---|
| 100 | DX=SQRT((DELX)**2+(DELY)**2) !-- Model resolution in degrees |
|---|
| 101 | !-- IMX is the number of grid points along a latitude circle in the GFS |
|---|
| 102 | IMX=INT(360./DX+.5) |
|---|
| 103 | |
|---|
| 104 | !dbg IMX=1152 !dbg -- Match the grid point printed from GFS run |
|---|
| 105 | |
|---|
| 106 | NMTVR=14 !-- 14 input fields for orography |
|---|
| 107 | DELTIM=DTPHS |
|---|
| 108 | RDELTIM=1./DTPHS |
|---|
| 109 | ! |
|---|
| 110 | !-- Calculate angle of rotation (ROT) between Earth and model coordinates, |
|---|
| 111 | ! but pass back out cosine (CROT) and sine (SROT) of this angle |
|---|
| 112 | ! |
|---|
| 113 | DTR=ACOS(-1.)/180. !-- convert from degrees to radians |
|---|
| 114 | DEG_TO_RAD=DTR !-- save conversion from degrees to radians |
|---|
| 115 | ! |
|---|
| 116 | LAT0=DTR*CEN_LON !-- central latitude of grid in radians |
|---|
| 117 | LoN0=DTR*CEN_LAT !-- central longitude of grid in radians |
|---|
| 118 | ! |
|---|
| 119 | DTR=1./DTR !-- convert from radians to degrees |
|---|
| 120 | RAD_TO_DEG=DTR !-- save conversion from radians to degrees |
|---|
| 121 | ! |
|---|
| 122 | CLAT0=COS(LAT0) |
|---|
| 123 | SLAT0=SIN(LAT0) |
|---|
| 124 | DO J=JTS,JTE |
|---|
| 125 | DO I=ITS,ITE |
|---|
| 126 | CLAT=COS(GLAT(I,J)) |
|---|
| 127 | DLON=GLON(I,J)-LoN0 |
|---|
| 128 | X=CLAT0*CLAT*COS(DLON)+SLAT0*SIN(GLAT(I,J)) |
|---|
| 129 | Y=-CLAT*SIN(DLON) |
|---|
| 130 | TLON=ATAN(Y/X) !-- model longitude |
|---|
| 131 | X=SLAT0*SIN(TLON)/CLAT |
|---|
| 132 | Y=MIN(POS1, MAX(NEG1, X) ) |
|---|
| 133 | ROT=ASIN(Y) !-- angle between geodetic & model coordinates |
|---|
| 134 | CROT(I,J)=COS(ROT) |
|---|
| 135 | SROT(I,J)=SIN(ROT) |
|---|
| 136 | ENDDO !-- I |
|---|
| 137 | ENDDO !-- J |
|---|
| 138 | IF (.NOT.RESTRT) THEN |
|---|
| 139 | !-- Convert from radians to degrees for WRF input files only |
|---|
| 140 | DO J=JTS,JTE |
|---|
| 141 | DO I=ITS,ITE |
|---|
| 142 | HANGL(I,J)=DTR*HANGL(I,J) !-- convert to degrees (+/-90 deg) |
|---|
| 143 | ENDDO !-- I |
|---|
| 144 | ENDDO !-- J |
|---|
| 145 | ENDIF |
|---|
| 146 | !dbg |
|---|
| 147 | !dbg dumin=-1. |
|---|
| 148 | !dbg dumax=1. |
|---|
| 149 | !dbg dvmin=-1. |
|---|
| 150 | !dbg dvmax=1. |
|---|
| 151 | !dbg print *,'delx=',delx,' dely=',dely,' dx=',dx,' imx=',imx |
|---|
| 152 | !dbg dtr=1./dtr !-- convert from degrees back to radians |
|---|
| 153 | !dbg dist_min=dtr*DX !-- grid length in radians |
|---|
| 154 | !dbg xdbg=dtr*xdbg !-- convert xdbg to radians |
|---|
| 155 | !dbg ydbg=dtr*ydbg !-- convert ydbg to radians |
|---|
| 156 | !dbg idbg=-100 |
|---|
| 157 | !dbg jdbg=-100 |
|---|
| 158 | !dbg print *,'dtr,dx,dist_min,xdbg,ydbg=',dtr,dx,dist_min,xdbg,ydbg |
|---|
| 159 | !dbg do j=jts,jte |
|---|
| 160 | !dbg do i=its,ite |
|---|
| 161 | !dbg !-- Find i,j for xdbg, ydbg |
|---|
| 162 | !dbg d_x=cos(glat(i,j))*(glon(i,j)-xdbg) |
|---|
| 163 | !dbg d_y=(glat(i,j)-ydbg) |
|---|
| 164 | !dbg dist=sqrt(d_x*d_x+d_y*d_y) |
|---|
| 165 | !dbg !! print *,'i,j,glon,glat,d_x,d_y,dist=',i,j,glon(i,j),glat(i,j),d_x,d_y,dist |
|---|
| 166 | !dbg if (dist < dist_min) then |
|---|
| 167 | !dbg dist_min=dist |
|---|
| 168 | !dbg idbg=i |
|---|
| 169 | !dbg jdbg=j |
|---|
| 170 | !dbg print *,'dist_min,idbg,jdbg=',dist_min,idbg,jdbg |
|---|
| 171 | !dbg endif |
|---|
| 172 | !dbg enddo !-- I |
|---|
| 173 | !dbg enddo !-- J |
|---|
| 174 | !dbg if (idbg>0 .and. jdbg>0) print *,'idbg=',idbg,' jdbg=',jdbg |
|---|
| 175 | |
|---|
| 176 | ! |
|---|
| 177 | END SUBROUTINE GWD_init |
|---|
| 178 | ! |
|---|
| 179 | !----------------------------------------------------------------------- |
|---|
| 180 | ! |
|---|
| 181 | SUBROUTINE GWD_driver(U,V,T,Q,Z,DP,PINT,PMID,EXNR, KPBL, ITIME & |
|---|
| 182 | & ,HSTDV,HCNVX,HASYW,HASYS,HASYSW,HASYNW & |
|---|
| 183 | & ,HLENW,HLENS,HLENSW,HLENNW & |
|---|
| 184 | & ,HANGL,HANIS,HSLOP,HZMAX,CROT,SROT & |
|---|
| 185 | & ,DUDT,DVDT,UGWDsfc,VGWDsfc & |
|---|
| 186 | & ,IDS,IDE,JDS,JDE,KDS,KDE & |
|---|
| 187 | & ,IMS,IME,JMS,JME,KMS,KME & |
|---|
| 188 | & ,ITS,ITE,JTS,JTE,KTS,KTE ) |
|---|
| 189 | ! |
|---|
| 190 | !== INPUT: |
|---|
| 191 | !-- U, V - zonal (U), meridional (V) winds at mass points (m/s) |
|---|
| 192 | !-- T, Q - temperature (C), specific humidity (kg/kg) |
|---|
| 193 | !-- DP - pressure thickness (Pa) |
|---|
| 194 | !-- Z - geopotential height (m) |
|---|
| 195 | !-- PINT, PMID - interface and midlayer pressures, respectively (Pa) |
|---|
| 196 | !-- EXNR - (p/p0)**(Rd/Cp) |
|---|
| 197 | !-- KPBL - vertical index at PBL top |
|---|
| 198 | !-- ITIME - model time step (=NTSD) |
|---|
| 199 | !-- HSTDV - orographic standard deviation |
|---|
| 200 | !-- HCNVX - normalized 4th moment of the orographic convexity |
|---|
| 201 | !-- Template for the next two sets of 4 arrays: |
|---|
| 202 | ! NWD 1 2 3 4 5 6 7 8 |
|---|
| 203 | ! WD W S SW NW E N NE SE |
|---|
| 204 | !-- Orographic asymmetry (HASYx, x=1-4) for upstream & downstream flow (4 planes) |
|---|
| 205 | !-- * HASYW - orographic asymmetry for upstream & downstream flow in W-E plane |
|---|
| 206 | !-- * HASYS - orographic asymmetry for upstream & downstream flow in S-N plane |
|---|
| 207 | !-- * HASYSW - orographic asymmetry for upstream & downstream flow in SW-NE plane |
|---|
| 208 | !-- * HASYNW - orographic asymmetry for upstream & downstream flow in NW-SE plane |
|---|
| 209 | !-- Orographic length scale or mountain width (4 planes) |
|---|
| 210 | !-- * HLENW - orographic length scale for upstream & downstream flow in W-E plane |
|---|
| 211 | !-- * HLENS - orographic length scale for upstream & downstream flow in S-N plane |
|---|
| 212 | !-- * HLENSW - orographic length scale for upstream & downstream flow in SW-NE plane |
|---|
| 213 | !-- * HLENNW - orographic length scale for upstream & downstream flow in NW-SE plane |
|---|
| 214 | !-- HANGL - angle (degrees) of the mountain range w/r/t east |
|---|
| 215 | !-- HANIS - anisotropy/aspect ratio of orography |
|---|
| 216 | !-- HSLOP - slope of orography |
|---|
| 217 | !-- HZMAX - max height above mean orography |
|---|
| 218 | !-- CROT, SROT - cosine & sine of the angle between Earth & model coordinates |
|---|
| 219 | ! |
|---|
| 220 | !== OUTPUT: |
|---|
| 221 | !-- DUDT, DVDT - zonal, meridional wind tendencies |
|---|
| 222 | !-- UGWDsfc, VGWDsfc - zonal, meridional surface wind stresses (N/m**2) |
|---|
| 223 | ! |
|---|
| 224 | !== INPUT indices: |
|---|
| 225 | !-- ids start index for i in domain |
|---|
| 226 | !-- ide end index for i in domain |
|---|
| 227 | !-- jds start index for j in domain |
|---|
| 228 | !-- jde end index for j in domain |
|---|
| 229 | !-- kds start index for k in domain |
|---|
| 230 | !-- kde end index for k in domain |
|---|
| 231 | !-- ims start index for i in memory |
|---|
| 232 | !-- ime end index for i in memory |
|---|
| 233 | !-- jms start index for j in memory |
|---|
| 234 | !-- jme end index for j in memory |
|---|
| 235 | !-- kms start index for k in memory |
|---|
| 236 | !-- kme end index for k in memory |
|---|
| 237 | !-- its start i index for tile |
|---|
| 238 | !-- ite end i index for tile |
|---|
| 239 | !-- jts start j index for tile |
|---|
| 240 | !-- jte end j index for tile |
|---|
| 241 | !-- kts start index for k in tile |
|---|
| 242 | !-- kte end index for k in tile |
|---|
| 243 | ! |
|---|
| 244 | !-- INPUT variables: |
|---|
| 245 | ! |
|---|
| 246 | REAL, INTENT(IN), DIMENSION (ims:ime, kms:kme, jms:jme) :: & |
|---|
| 247 | & U,V,T,Q,Z,DP,PINT,PMID,EXNR |
|---|
| 248 | REAL, INTENT(IN), DIMENSION (ims:ime, jms:jme) :: HSTDV,HCNVX & |
|---|
| 249 | & ,HASYW,HASYS,HASYSW,HASYNW,HLENW,HLENS,HLENSW,HLENNW,HANGL & |
|---|
| 250 | & ,HANIS,HSLOP,HZMAX,CROT,SROT |
|---|
| 251 | INTEGER, INTENT(IN), DIMENSION (ims:ime, jms:jme) :: KPBL |
|---|
| 252 | INTEGER, INTENT(IN) :: ids,ide,jds,jde,kds,kde & |
|---|
| 253 | &, ims,ime,jms,jme,kms,kme & |
|---|
| 254 | &, its,ite,jts,jte,kts,kte,ITIME |
|---|
| 255 | |
|---|
| 256 | ! |
|---|
| 257 | !-- OUTPUT variables: |
|---|
| 258 | ! |
|---|
| 259 | REAL, INTENT(OUT), DIMENSION (ims:ime, kms:kme, jms:jme) :: & |
|---|
| 260 | & DUDT,DVDT |
|---|
| 261 | REAL, INTENT(OUT), DIMENSION (ims:ime, jms:jme) :: UGWDsfc,VGWDsfc |
|---|
| 262 | ! |
|---|
| 263 | !-- Local variables |
|---|
| 264 | !-- DUsfc, DVsfc - zonal, meridional wind stresses (diagnostics) |
|---|
| 265 | ! |
|---|
| 266 | INTEGER, PARAMETER :: IM=1 !-- Reduces changes in subroutine GWPDS |
|---|
| 267 | REAL(KIND=KIND_PHYS), PARAMETER :: G=9.806, GHALF=.5*G & |
|---|
| 268 | &, THRESH=1.E-6, dtlarge=1. !dbg |
|---|
| 269 | INTEGER, DIMENSION (IM) :: LPBL |
|---|
| 270 | REAL(KIND=KIND_PHYS), DIMENSION (IM,4) :: OA4,CLX4 |
|---|
| 271 | REAL(KIND=KIND_PHYS), DIMENSION (IM) :: DUsfc,DVsfc & |
|---|
| 272 | &, HPRIME,OC,THETA,SIGMA,GAMMA,ELVMAX |
|---|
| 273 | REAL(KIND=KIND_PHYS), DIMENSION (IM,KTS:KTE) :: DUDTcol,DVDTcol & |
|---|
| 274 | &, Ucol,Vcol,Tcol,Qcol,DPcol,Pcol,EXNcol,PHIcol |
|---|
| 275 | REAL(KIND=KIND_PHYS), DIMENSION (IM,KTS:KTE+1) :: PINTcol,PHILIcol |
|---|
| 276 | INTEGER :: I,J,IJ,K,Imid,Jmid |
|---|
| 277 | REAL :: Ugeo,Vgeo,Umod,Vmod, TERRtest,TERRmin |
|---|
| 278 | REAL(KIND=KIND_PHYS) :: TEST |
|---|
| 279 | CHARACTER(LEN=255) :: message |
|---|
| 280 | |
|---|
| 281 | !dbg |
|---|
| 282 | logical :: lprnt !dbg |
|---|
| 283 | character (len=26) :: label |
|---|
| 284 | integer :: kpblmin,kpblmax, mype, iunit |
|---|
| 285 | real :: hzmaxmin,hzmaxmax,hanglmin,hanglmax,hslopmin,hslopmax,hanismin,hanismax & |
|---|
| 286 | ,hstdvmin,hstdvmax,hcnvxmin,hcnvxmax,hasywmin,hasywmax,hasysmin,hasysmax & |
|---|
| 287 | ,hasyswmin,hasyswmax,hasynwmin,hasynwmax,hlenwmin,hlenwmax,hlensmin,hlensmax & |
|---|
| 288 | ,hlenswmin,hlenswmax,hlennwmin,hlennwmax,zsmin,zsmax,delu,delv |
|---|
| 289 | ! Added this declaration |
|---|
| 290 | real :: helvmin,helvmax |
|---|
| 291 | !dbg |
|---|
| 292 | |
|---|
| 293 | ! |
|---|
| 294 | !-------------------------- Executable below ------------------------- |
|---|
| 295 | ! |
|---|
| 296 | |
|---|
| 297 | lprnt=.false. |
|---|
| 298 | !dbg |
|---|
| 299 | if (itime <= 1) then |
|---|
| 300 | CALL WRF_GET_MYPROC(MYPE) !-- Get processor number |
|---|
| 301 | kpblmin=100 |
|---|
| 302 | kpblmax=-100 |
|---|
| 303 | hzmaxmin=1.e6 |
|---|
| 304 | hzmaxmax=-1.e6 |
|---|
| 305 | hanglmin=1.e6 |
|---|
| 306 | hanglmax=-1.e6 |
|---|
| 307 | hslopmin=1.e6 |
|---|
| 308 | hslopmax=-1.e6 |
|---|
| 309 | hanismin=1.e6 |
|---|
| 310 | hanismax=-1.e6 |
|---|
| 311 | hstdvmin=1.e6 |
|---|
| 312 | hstdvmax=-1.e6 |
|---|
| 313 | hcnvxmin=1.e6 |
|---|
| 314 | hcnvxmax=-1.e6 |
|---|
| 315 | hasywmin=1.e6 |
|---|
| 316 | hasywmax=-1.e6 |
|---|
| 317 | hasysmin=1.e6 |
|---|
| 318 | hasysmax=-1.e6 |
|---|
| 319 | hasyswmin=1.e6 |
|---|
| 320 | hasyswmax=-1.e6 |
|---|
| 321 | hasynwmin=1.e6 |
|---|
| 322 | hasynwmax=-1.e6 |
|---|
| 323 | hlenwmin=1.e6 |
|---|
| 324 | hlenwmax=-1.e6 |
|---|
| 325 | hlensmin=1.e6 |
|---|
| 326 | hlensmax=-1.e6 |
|---|
| 327 | hlenswmin=1.e6 |
|---|
| 328 | hlenswmax=-1.e6 |
|---|
| 329 | hlennwmin=1.e6 |
|---|
| 330 | hlennwmax=-1.e6 |
|---|
| 331 | zsmin=1.e6 |
|---|
| 332 | zsmax=-1.e6 |
|---|
| 333 | ! Added initialization of helvmin and helvmax |
|---|
| 334 | helvmin=1.e6 |
|---|
| 335 | helvmax=-1.e6 |
|---|
| 336 | do j=jts,jte |
|---|
| 337 | do i=its,ite |
|---|
| 338 | kpblmin=min(kpblmin,kpbl(i,j)) |
|---|
| 339 | kpblmax=max(kpblmax,kpbl(i,j)) |
|---|
| 340 | helvmin=min(helvmin,hzmax(i,j)) |
|---|
| 341 | helvmax=max(helvmax,hzmax(i,j)) |
|---|
| 342 | hanglmin=min(hanglmin,hangl(i,j)) |
|---|
| 343 | hanglmax=max(hanglmax,hangl(i,j)) |
|---|
| 344 | hslopmin=min(hslopmin,hslop(i,j)) |
|---|
| 345 | hslopmax=max(hslopmax,hslop(i,j)) |
|---|
| 346 | hanismin=min(hanismin,hanis(i,j)) |
|---|
| 347 | hanismax=max(hanismax,hanis(i,j)) |
|---|
| 348 | hstdvmin=min(hstdvmin,hstdv(i,j)) |
|---|
| 349 | hstdvmax=max(hstdvmax,hstdv(i,j)) |
|---|
| 350 | hcnvxmin=min(hcnvxmin,hcnvx(i,j)) |
|---|
| 351 | hcnvxmax=max(hcnvxmax,hcnvx(i,j)) |
|---|
| 352 | hasywmin=min(hasywmin,hasyw(i,j)) |
|---|
| 353 | hasywmax=max(hasywmax,hasyw(i,j)) |
|---|
| 354 | hasysmin=min(hasysmin,hasys(i,j)) |
|---|
| 355 | hasysmax=max(hasysmax,hasys(i,j)) |
|---|
| 356 | hasyswmin=min(hasyswmin,hasysw(i,j)) |
|---|
| 357 | hasyswmax=max(hasyswmax,hasysw(i,j)) |
|---|
| 358 | hasynwmin=min(hasynwmin,hasynw(i,j)) |
|---|
| 359 | hasynwmax=max(hasynwmax,hasynw(i,j)) |
|---|
| 360 | hlenwmin=min(hlenwmin,hlenw(i,j)) |
|---|
| 361 | hlenwmax=max(hlenwmax,hlenw(i,j)) |
|---|
| 362 | hlensmin=min(hlensmin,hlens(i,j)) |
|---|
| 363 | hlensmax=max(hlensmax,hlens(i,j)) |
|---|
| 364 | hlenswmin=min(hlenswmin,hlensw(i,j)) |
|---|
| 365 | hlenswmax=max(hlenswmax,hlensw(i,j)) |
|---|
| 366 | hlennwmin=min(hlennwmin,hlennw(i,j)) |
|---|
| 367 | hlennwmax=max(hlennwmax,hlennw(i,j)) |
|---|
| 368 | zsmin=min(zsmin,z(i,1,j)) |
|---|
| 369 | zsmax=max(zsmax,z(i,1,j)) |
|---|
| 370 | enddo |
|---|
| 371 | enddo |
|---|
| 372 | write(message,*) 'Maximum and minimum values within GWD-driver for MYPE=',MYPE |
|---|
| 373 | write(message,"(i3,2(a,e12.5))") mype,': deltim=',deltim,' rdeltim=',rdeltim |
|---|
| 374 | CALL wrf_message(trim(message)) |
|---|
| 375 | write(message,"(i3,2(a,i3))") mype,': kpblmin=',kpblmin,' kpblmax=',kpblmax |
|---|
| 376 | CALL wrf_message(trim(message)) |
|---|
| 377 | write(message,"(i3,2(a,e12.5))") mype,': helvmin=',helvmin,' helvmax=',helvmax |
|---|
| 378 | CALL wrf_message(trim(message)) |
|---|
| 379 | write(message,"(i3,2(a,e12.5))") mype,': hanglmin=',hanglmin,' hanglmax=',hanglmax |
|---|
| 380 | CALL wrf_message(trim(message)) |
|---|
| 381 | write(message,"(i3,2(a,e12.5))") mype,': hslopmin=',hslopmin,' hslopmax=',hslopmax |
|---|
| 382 | CALL wrf_message(trim(message)) |
|---|
| 383 | write(message,"(i3,2(a,e12.5))") mype,': hanismin=',hanismin,' hanismax=',hanismax |
|---|
| 384 | CALL wrf_message(trim(message)) |
|---|
| 385 | write(message,"(i3,2(a,e12.5))") mype,': hstdvmin=',hstdvmin,' hstdvmax=',hstdvmax |
|---|
| 386 | CALL wrf_message(trim(message)) |
|---|
| 387 | write(message,"(i3,2(a,e12.5))") mype,': hcnvxmin=',hcnvxmin,' hcnvxmax=',hcnvxmax |
|---|
| 388 | CALL wrf_message(trim(message)) |
|---|
| 389 | write(message,"(i3,2(a,e12.5))") mype,': hasywmin=',hasywmin,' hasywmax=',hasywmax |
|---|
| 390 | CALL wrf_message(trim(message)) |
|---|
| 391 | write(message,"(i3,2(a,e12.5))") mype,': hasysmin=',hasysmin,' hasysmax=',hasysmax |
|---|
| 392 | CALL wrf_message(trim(message)) |
|---|
| 393 | write(message,"(i3,2(a,e12.5))") mype,': hasyswmin=',hasyswmin,' hasyswmax=',hasyswmax |
|---|
| 394 | CALL wrf_message(trim(message)) |
|---|
| 395 | write(message,"(i3,2(a,e12.5))") mype,': hasynwmin=',hasynwmin,' hasynwmax=',hasynwmax |
|---|
| 396 | CALL wrf_message(trim(message)) |
|---|
| 397 | write(message,"(i3,2(a,e12.5))") mype,': hlenwmin=',hlenwmin,' hlenwmax=',hlenwmax |
|---|
| 398 | CALL wrf_message(trim(message)) |
|---|
| 399 | write(message,"(i3,2(a,e12.5))") mype,': hlensmin=',hlensmin,' hlensmax=',hlensmax |
|---|
| 400 | CALL wrf_message(trim(message)) |
|---|
| 401 | write(message,"(i3,2(a,e12.5))") mype,': hlenswmin=',hlenswmin,' hlenswmax=',hlenswmax |
|---|
| 402 | CALL wrf_message(trim(message)) |
|---|
| 403 | write(message,"(i3,2(a,e12.5))") mype,': hlennwmin=',hlennwmin,' hlennwmax=',hlennwmax |
|---|
| 404 | CALL wrf_message(trim(message)) |
|---|
| 405 | write(message,"(i3,2(a,e12.5))") mype,': zsmin=',zsmin,' zsmax=',zsmax |
|---|
| 406 | CALL wrf_message(trim(message)) |
|---|
| 407 | |
|---|
| 408 | endif ! if (itime <= 1) then |
|---|
| 409 | !dbg |
|---|
| 410 | |
|---|
| 411 | ! |
|---|
| 412 | !-- Initialize variables |
|---|
| 413 | ! |
|---|
| 414 | DO J=JMS,JME |
|---|
| 415 | DO K=KMS,KME |
|---|
| 416 | DO I=IMS,IME |
|---|
| 417 | DUDT(I,K,J)=0. |
|---|
| 418 | DVDT(I,K,J)=0. |
|---|
| 419 | ENDDO |
|---|
| 420 | ENDDO |
|---|
| 421 | ENDDO |
|---|
| 422 | ! |
|---|
| 423 | DO J=JMS,JME |
|---|
| 424 | DO I=IMS,IME |
|---|
| 425 | UGWDsfc(I,J)=0. |
|---|
| 426 | VGWDsfc(I,J)=0. |
|---|
| 427 | ENDDO |
|---|
| 428 | ENDDO |
|---|
| 429 | ! |
|---|
| 430 | !-- For debugging, find approximate center point within each tile |
|---|
| 431 | ! |
|---|
| 432 | !dbg Imid=.5*(ITS+ITE) |
|---|
| 433 | !dbg Jmid=.5*(JTS+JTE) |
|---|
| 434 | ! |
|---|
| 435 | DO J=JTS,JTE |
|---|
| 436 | DO I=ITS,ITE |
|---|
| 437 | if (kpbl(i,j)<kts .or. kpbl(i,j)>kte) go to 100 |
|---|
| 438 | ! |
|---|
| 439 | !-- Initial test to see if GWD calculations should be made, otherwise skip |
|---|
| 440 | ! |
|---|
| 441 | TERRtest=HZMAX(I,J)+SIGFAC*HSTDV(I,J) |
|---|
| 442 | TERRmin=Z(I,2,J)-Z(I,1,J) |
|---|
| 443 | IF (TERRtest < TERRmin) GO TO 100 |
|---|
| 444 | ! |
|---|
| 445 | !-- For debugging: |
|---|
| 446 | ! |
|---|
| 447 | !dbg lprnt=.false. |
|---|
| 448 | !dbg if (i==idbg .and. j==jdbg .and. itime<=1) lprnt=.true. |
|---|
| 449 | !dbg ! 200 CONTINUE |
|---|
| 450 | ! |
|---|
| 451 | DO K=KTS,KTE |
|---|
| 452 | DUDTcol(IM,K)=0. |
|---|
| 453 | DVDTcol(IM,K)=0. |
|---|
| 454 | ! |
|---|
| 455 | !-- Transform/rotate winds from model to geodetic (Earth) coordinates |
|---|
| 456 | ! |
|---|
| 457 | Ucol(IM,K)=U(I,K,J)*CROT(I,J)+V(I,K,J)*SROT(I,J) |
|---|
| 458 | Vcol(IM,K)=V(I,K,J)*CROT(I,J)-U(I,K,J)*SROT(I,J) |
|---|
| 459 | ! |
|---|
| 460 | Tcol(IM,K)=T(I,K,J) |
|---|
| 461 | Qcol(IM,K)=Q(I,K,J) |
|---|
| 462 | ! |
|---|
| 463 | !-- Convert from Pa to centibars, which is what's used in subroutine GWD_col |
|---|
| 464 | ! |
|---|
| 465 | DPcol(IM,K)=.001*DP(I,K,J) |
|---|
| 466 | PINTcol(IM,K)=.001*PINT(I,K,J) |
|---|
| 467 | Pcol(IM,K)=.001*PMID(I,K,J) |
|---|
| 468 | EXNcol(IM,K)=EXNR(I,K,J) |
|---|
| 469 | ! |
|---|
| 470 | !-- Next 2 fields are geopotential above the surface at the lower interface |
|---|
| 471 | ! and at midlayer |
|---|
| 472 | ! |
|---|
| 473 | PHILIcol(IM,K)=G*(Z(I,K,J)-Z(I,1,J)) |
|---|
| 474 | PHIcol(IM,K)=GHALF*(Z(I,K,J)+Z(I,K+1,J))-G*Z(I,1,J) |
|---|
| 475 | ENDDO !- K |
|---|
| 476 | ! |
|---|
| 477 | PINTcol(IM,KTE+1)=.001*PINT(I,KTE+1,J) |
|---|
| 478 | PHILIcol(IM,KTE+1)=G*(Z(I,KTE+1,J)-Z(I,1,J)) |
|---|
| 479 | ! |
|---|
| 480 | !-- Terrain-specific inputs: |
|---|
| 481 | ! |
|---|
| 482 | HPRIME(IM)=HSTDV(I,J) !-- standard deviation of orography |
|---|
| 483 | OC(IM)=HCNVX(I,J) !-- Normalized convexity |
|---|
| 484 | OA4(IM,1)=HASYW(I,J) !-- orographic asymmetry in W-E plane |
|---|
| 485 | OA4(IM,2)=HASYS(I,J) !-- orographic asymmetry in S-N plane |
|---|
| 486 | OA4(IM,3)=HASYSW(I,J) !-- orographic asymmetry in SW-NE plane |
|---|
| 487 | OA4(IM,4)=HASYNW(I,J) !-- orographic asymmetry in NW-SE plane |
|---|
| 488 | CLX4(IM,1)=HLENW(I,J) !-- orographic length scale in W-E plane |
|---|
| 489 | CLX4(IM,2)=HLENS(I,J) !-- orographic length scale in S-N plane |
|---|
| 490 | CLX4(IM,3)=HLENSW(I,J) !-- orographic length scale in SW-NE plane |
|---|
| 491 | CLX4(IM,4)=HLENNW(I,J) !-- orographic length scale in NW-SE plane |
|---|
| 492 | THETA(IM)=HANGL(I,J) ! |
|---|
| 493 | SIGMA(IM)=HSLOP(I,J) ! |
|---|
| 494 | GAMMA(IM)=HANIS(I,J) ! |
|---|
| 495 | ELVMAX(IM)=HZMAX(I,J) ! |
|---|
| 496 | LPBL(IM)=KPBL(I,J) ! |
|---|
| 497 | !dbg IF (LPBL(IM)<KTS .OR. LPBL(IM)>KTE) & |
|---|
| 498 | !dbg & print *,'Wacky values for KPBL: I,J,N,LPBL=',I,J,ITIME,LPBL(IM) |
|---|
| 499 | ! |
|---|
| 500 | !-- Output (diagnostics) |
|---|
| 501 | ! |
|---|
| 502 | DUsfc(IM)=0. !-- U wind stress |
|---|
| 503 | DVsfc(IM)=0. !-- V wind stress |
|---|
| 504 | ! |
|---|
| 505 | !dbg |
|---|
| 506 | !dbg if (LPRNT) then |
|---|
| 507 | !dbg ! |
|---|
| 508 | !dbg !-- Following code is for ingesting GFS-derived inputs for final testing |
|---|
| 509 | !dbg ! |
|---|
| 510 | !dbg CALL INT_GET_FRESH_HANDLE(iunit) |
|---|
| 511 | !dbg close(iunit) |
|---|
| 512 | !dbg open(unit=iunit,file='gfs_gwd.input',form='formatted',iostat=ier) |
|---|
| 513 | !dbg read(iunit,*) ! skip line |
|---|
| 514 | !dbg read(iunit,*) (Ucol(im,k), k=kts,kte) |
|---|
| 515 | !dbg read(iunit,*) ! skip line |
|---|
| 516 | !dbg read(iunit,*) (Vcol(im,k), k=kts,kte) |
|---|
| 517 | !dbg read(iunit,*) ! skip line |
|---|
| 518 | !dbg read(iunit,*) (Tcol(im,k), k=kts,kte) |
|---|
| 519 | !dbg read(iunit,*) ! skip line |
|---|
| 520 | !dbg read(iunit,*) (Qcol(im,k), k=kts,kte) |
|---|
| 521 | !dbg read(iunit,*) ! skip line |
|---|
| 522 | !dbg read(iunit,*) (PINTcol(im,k), k=kts,kte+1) |
|---|
| 523 | !dbg read(iunit,*) ! skip line |
|---|
| 524 | !dbg read(iunit,*) (DPcol(im,k), k=kts,kte) |
|---|
| 525 | !dbg read(iunit,*) ! skip line |
|---|
| 526 | !dbg read(iunit,*) (Pcol(im,k), k=kts,kte) |
|---|
| 527 | !dbg read(iunit,*) ! skip line |
|---|
| 528 | !dbg read(iunit,*) (EXNcol(im,k), k=kts,kte) |
|---|
| 529 | !dbg read(iunit,*) ! skip line |
|---|
| 530 | !dbg read(iunit,*) (PHILIcol(im,k), k=kts,kte+1) |
|---|
| 531 | !dbg read(iunit,*) ! skip line |
|---|
| 532 | !dbg read(iunit,*) (PHIcol(im,k), k=kts,kte) |
|---|
| 533 | !dbg read(iunit,*) ! skip line |
|---|
| 534 | !dbg read(iunit,*) hprime(im) |
|---|
| 535 | !dbg read(iunit,*) ! skip line |
|---|
| 536 | !dbg read(iunit,*) oc(im) |
|---|
| 537 | !dbg read(iunit,*) ! skip line |
|---|
| 538 | !dbg read(iunit,*) (oa4(im,k), k=1,4) |
|---|
| 539 | !dbg read(iunit,*) ! skip line |
|---|
| 540 | !dbg read(iunit,*) (clx4(im,k), k=1,4) |
|---|
| 541 | !dbg read(iunit,*) ! skip line |
|---|
| 542 | !dbg read(iunit,*) theta(im) |
|---|
| 543 | !dbg read(iunit,*) ! skip line |
|---|
| 544 | !dbg read(iunit,*) sigma(im) |
|---|
| 545 | !dbg read(iunit,*) ! skip line |
|---|
| 546 | !dbg read(iunit,*) gamma(im) |
|---|
| 547 | !dbg read(iunit,*) ! skip line |
|---|
| 548 | !dbg read(iunit,*) elvmax(im) |
|---|
| 549 | !dbg read(iunit,*) ! skip line |
|---|
| 550 | !dbg read(iunit,*) lpbl(im) |
|---|
| 551 | !dbg close(iunit) |
|---|
| 552 | write(label,"('GWD:i,j,n=',2i5,i6)") I,J,ITIME |
|---|
| 553 | !dbg write(6,"(2a)") LABEL,' in GWD_driver: K U V T Q Pi DP P EX PHIi PHI' |
|---|
| 554 | !dbg do k=kts,kte |
|---|
| 555 | !dbg write(6,"(i3,10e12.4)") k,Ucol(im,k),Vcol(im,k),Tcol(im,k) & |
|---|
| 556 | !dbg ,Qcol(im,k),PINTcol(im,k),DPcol(im,k),Pcol(im,k),EXNcol(im,k) & |
|---|
| 557 | !dbg ,PHILIcol(im,k),PHIcol(im,k) |
|---|
| 558 | !dbg enddo |
|---|
| 559 | !dbg write(6,"(2(a,e12.4),2(a,4e12.4/),4(a,e12.4),a,i3) )") & |
|---|
| 560 | !dbg 'GWD_driver: hprime(im)=',hprime(im),' oc(im)=',oc(im) & |
|---|
| 561 | !dbg ,' oa4(im,1-4)=',(oa4(im,k),k=1,4) & |
|---|
| 562 | !dbg ,' clx4(im,1-4)=',(clx4(im,k),k=1,4) & |
|---|
| 563 | !dbg ,' theta=',theta(im),' sigma(im)=',sigma(im) & |
|---|
| 564 | !dbg ,' gamma(im)=',gamma(im),' elvmax(im)=',elvmax(im) & |
|---|
| 565 | !dbg ,' lpbl(im)=',lpbl(im) |
|---|
| 566 | !dbg endif |
|---|
| 567 | !dbg |
|---|
| 568 | !======================================================================= |
|---|
| 569 | ! |
|---|
| 570 | CALL GWD_col(DVDTcol,DUDTcol, DUsfc,DVsfc & ! Output |
|---|
| 571 | &, Ucol,Vcol,Tcol,Qcol,PINTcol,DPcol,Pcol,EXNcol & ! Met input |
|---|
| 572 | &, PHILIcol,PHIcol & ! Met input |
|---|
| 573 | &, HPRIME,OC,OA4,CLX4,THETA,SIGMA,GAMMA,ELVMAX & ! Topo input |
|---|
| 574 | &, LPBL,IM,KTS,KTE,LABEL,LPRNT ) ! Indices + debugging |
|---|
| 575 | ! |
|---|
| 576 | !======================================================================= |
|---|
| 577 | ! |
|---|
| 578 | !dbg |
|---|
| 579 | !dbg ! |
|---|
| 580 | !dbg ! IF (.NOT.LPRNT) THEN |
|---|
| 581 | !dbg ! TEST=0. |
|---|
| 582 | !dbg ! DO K=KTS,KTE |
|---|
| 583 | !dbg ! TEST=MAX( TEST, ABS(DUDTcol(IM,K)), ABS(DVDTcol(IM,K)) ) |
|---|
| 584 | !dbg ! if ( ABS(DUDTcol(IM,K)) > RDELTIM) print *,'k,DUDTcol=',k,DUDTcol(IM,K) |
|---|
| 585 | !dbg ! if ( ABS(DVDTcol(IM,K)) > RDELTIM) print *,'k,DVDTcol=',k,DVDTcol(IM,K) |
|---|
| 586 | !dbg ! ENDDO |
|---|
| 587 | !dbg ! IF (TEST>RDELTIM) THEN |
|---|
| 588 | !dbg ! LPRNT=.TRUE. |
|---|
| 589 | !dbg ! Imid=I |
|---|
| 590 | !dbg ! Jmid=J |
|---|
| 591 | !dbg ! GO TO 200 |
|---|
| 592 | !dbg ! ENDIF |
|---|
| 593 | !dbg ! ENDIF |
|---|
| 594 | !dbg ! TEST=ABS(DUsfc(IM))+ABS(DVsfc(IM)) |
|---|
| 595 | !dbg ! if (.not.lprnt) then |
|---|
| 596 | !dbg ! do k=kts,kte |
|---|
| 597 | !dbg ! du=DUDTcol(IM,K)*DELTIM |
|---|
| 598 | !dbg ! dv=DVDTcol(IM,K)*DELTIM |
|---|
| 599 | !dbg ! if (du < dumin) then |
|---|
| 600 | !dbg ! lprnt=.true. |
|---|
| 601 | !dbg ! dumin=1.5*du |
|---|
| 602 | !dbg ! endif |
|---|
| 603 | !dbg ! if (du > dumax) then |
|---|
| 604 | !dbg ! lprnt=.true. |
|---|
| 605 | !dbg ! dumax=1.5*du |
|---|
| 606 | !dbg ! endif |
|---|
| 607 | !dbg ! if (dv < dvmin) then |
|---|
| 608 | !dbg ! lprnt=.true. |
|---|
| 609 | !dbg ! dvmin=1.5*dv |
|---|
| 610 | !dbg ! endif |
|---|
| 611 | !dbg ! if (dv > dvmax) then |
|---|
| 612 | !dbg ! lprnt=.true. |
|---|
| 613 | !dbg ! dvmax=1.5*dv |
|---|
| 614 | !dbg ! endif |
|---|
| 615 | !dbg ! enddo |
|---|
| 616 | !dbg ! if (lprnt) go to 200 |
|---|
| 617 | !dbg ! else |
|---|
| 618 | !dbg if (lprnt) then |
|---|
| 619 | !dbg print *,'DUsfc,DVsfc,CROT,SROT,DELTIM=',DUsfc(IM),DVsfc(IM) & |
|---|
| 620 | !dbg &,CROT(I,J),SROT(I,J),DELTIM |
|---|
| 621 | !dbg print *,' K P | Ucol Ugeo DUDTcol*DT U Umod DU=DUDT*DT ' & |
|---|
| 622 | !dbg ,'| Vcol Vgeo DVDTcol*DT V Vmod DV=DVDT*DT' |
|---|
| 623 | !dbg ENDIF |
|---|
| 624 | |
|---|
| 625 | DO K=KTS,KTE |
|---|
| 626 | TEST=ABS(DUDTcol(IM,K))+ABS(DVDTcol(IM,K)) |
|---|
| 627 | IF (TEST > THRESH) THEN |
|---|
| 628 | |
|---|
| 629 | !dbg |
|---|
| 630 | !dbg if (lprnt) then |
|---|
| 631 | !dbg !dbg DUDTcol(IM,K)=0. !-- Test rotation |
|---|
| 632 | !dbg !dbg DVDTcol(IM,K)=0. !-- Test rotation |
|---|
| 633 | !dbg !-- Now replace with the original winds before they were written over by |
|---|
| 634 | !dbg ! the values from the GFS |
|---|
| 635 | !dbg Ucol(IM,K)=U(I,K,J)*CROT(I,J)+V(I,K,J)*SROT(I,J) |
|---|
| 636 | !dbg Vcol(IM,K)=V(I,K,J)*CROT(I,J)-U(I,K,J)*SROT(I,J) |
|---|
| 637 | !dbg endif |
|---|
| 638 | |
|---|
| 639 | ! |
|---|
| 640 | !-- First update winds in geodetic coordinates |
|---|
| 641 | ! |
|---|
| 642 | Ugeo=Ucol(IM,K)+DUDTcol(IM,K)*DELTIM |
|---|
| 643 | Vgeo=Vcol(IM,K)+DVDTcol(IM,K)*DELTIM |
|---|
| 644 | ! |
|---|
| 645 | !-- Transform/rotate winds from geodetic back to model coordinates |
|---|
| 646 | ! |
|---|
| 647 | Umod=Ugeo*CROT(I,J)-Vgeo*SROT(I,J) |
|---|
| 648 | Vmod=Ugeo*SROT(I,J)+Vgeo*CROT(I,J) |
|---|
| 649 | ! |
|---|
| 650 | !-- Calculate wind tendencies from the updated model winds |
|---|
| 651 | ! |
|---|
| 652 | DUDT(I,K,J)=RDELTIM*(Umod-U(I,K,J)) |
|---|
| 653 | DVDT(I,K,J)=RDELTIM*(Vmod-V(I,K,J)) |
|---|
| 654 | ! |
|---|
| 655 | !dbg |
|---|
| 656 | |
|---|
| 657 | test=abs(dudt(i,k,j))+abs(dvdt(i,k,j)) |
|---|
| 658 | if (test > dtlarge) write(6,"(2a,i2,2(a,e12.4))") & |
|---|
| 659 | label,' => k=',k,' dudt=',dudt(i,k,j),' dvdt=',dvdt(i,k,j) |
|---|
| 660 | |
|---|
| 661 | !dbg if (lprnt) write(6,"(i2,f8.2,2(' | ',6f10.4)") K,10.*Pcol(IM,K) & |
|---|
| 662 | !dbg ,Ucol(IM,K),Ugeo,DUDTcol(IM,K)*DELTIM,U(I,K,J),Umod,DUDT(I,K,J)*DELTIM & |
|---|
| 663 | !dbg ,Vcol(IM,K),Vgeo,DVDTcol(IM,K)*DELTIM,V(I,K,J),Vmod,DVDT(I,K,J)*DELTIM |
|---|
| 664 | !dbg |
|---|
| 665 | ENDIF !- IF (TEST > THRESH) THEN |
|---|
| 666 | ! |
|---|
| 667 | ENDDO !- K |
|---|
| 668 | ! |
|---|
| 669 | !-- Transform/rotate surface wind stresses from geodetic to model coordinates |
|---|
| 670 | ! |
|---|
| 671 | UGWDsfc(I,J)=DUsfc(IM)*CROT(I,J)-DVsfc(IM)*SROT(I,J) |
|---|
| 672 | VGWDsfc(I,J)=DUsfc(IM)*SROT(I,J)+DVsfc(IM)*CROT(I,J) |
|---|
| 673 | ! |
|---|
| 674 | 100 CONTINUE |
|---|
| 675 | ENDDO !- I |
|---|
| 676 | ENDDO !- J |
|---|
| 677 | ! |
|---|
| 678 | END SUBROUTINE GWD_driver |
|---|
| 679 | ! |
|---|
| 680 | !----------------------------------------------------------------------- |
|---|
| 681 | ! |
|---|
| 682 | !-- "A", "B" (from GFS) in GWD_col are DVDTcol, DUDTcol, respectively in GWD_driver |
|---|
| 683 | ! |
|---|
| 684 | SUBROUTINE GWD_col (A,B, DUsfc,DVsfc & !-- Output |
|---|
| 685 | &, U1,V1,T1,Q1, PRSI,DEL,PRSL,PRSLK, PHII,PHIL & !-- Met inputs |
|---|
| 686 | &, HPRIME,OC,OA4,CLX4,THETA,SIGMA,GAMMA,ELVMAX & !-- Topo inputs |
|---|
| 687 | &, KPBL,IM,KTS,KTE, LABEL,LPRNT ) !-- Input indices, debugging |
|---|
| 688 | ! |
|---|
| 689 | !=== Output fields |
|---|
| 690 | ! |
|---|
| 691 | !-- A (DUDT), B (DVDT) - output zonal & meridional wind tendencies in Earth coordinates (m s^-2) |
|---|
| 692 | !-- DUsfc, DVsfc - surface zonal meridional wind stresses in Earth coordinates (m s^-1?) |
|---|
| 693 | ! |
|---|
| 694 | !=== Input fields |
|---|
| 695 | ! |
|---|
| 696 | !-- U1, V1 - zonal, meridional wind (m/s) |
|---|
| 697 | !-- T1 - temperature (deg K) |
|---|
| 698 | !-- Q1 - specific humidity (kg/kg) |
|---|
| 699 | !-- PRSI - lower interface pressure in centibars (1000 Pa) |
|---|
| 700 | !-- DEL - pressure thickness of layer in centibars (1000 Pa) |
|---|
| 701 | !-- PRSL - midlayer pressure in centibars (1000 Pa) |
|---|
| 702 | !-- PRSLK - Exner function, (P/P0)**(Rd/CP) |
|---|
| 703 | !-- PHII - lower interface geopotential in mks units |
|---|
| 704 | !-- PHIL - midlayer geopotential in mks units |
|---|
| 705 | !-- KDT - number of time steps into integration for diagnostics |
|---|
| 706 | !-- HPRIME - orographic standard deviation |
|---|
| 707 | !-- OC - normalized 4th moment of the orographic convexity |
|---|
| 708 | !-- OA4 - orographic asymmetry for upstream & downstream flow measured |
|---|
| 709 | ! along 4 vertical planes (W-E, S-N, SW-NE, NW-SE) |
|---|
| 710 | !-- CLX4 - orographic length scale or mountain width measured along |
|---|
| 711 | ! 4 vertical planes (W-E, S-N, SW-NE, NW-SE) |
|---|
| 712 | !-- THETA - angle of the mountain range w/r/t east |
|---|
| 713 | !-- SIGMA - slope of orography |
|---|
| 714 | !-- GAMMA - anisotropy/aspect ratio |
|---|
| 715 | !-- ELVMAX - max height above mean orography |
|---|
| 716 | !-- KPBL(IM) - vertical index at the top of the PBL |
|---|
| 717 | !-- KM - number of vertical levels |
|---|
| 718 | ! |
|---|
| 719 | !== For diagnostics |
|---|
| 720 | !-- LABEL - character string for diagnostic prints |
|---|
| 721 | !-- LPRNT - logical flag for prints |
|---|
| 722 | ! |
|---|
| 723 | !####################################################################### |
|---|
| 724 | !################## ORIGINAL DOCUMENTATION BLOCK ##################### |
|---|
| 725 | !###### The following comments are from the original GFS code ######## |
|---|
| 726 | !####################################################################### |
|---|
| 727 | ! ******************************************************************** |
|---|
| 728 | ! -----> I M P L E M E N T A T I O N V E R S I O N <---------- |
|---|
| 729 | ! |
|---|
| 730 | ! --- Not in this code -- History of GWDP at NCEP---- |
|---|
| 731 | ! ---------------- ----------------------- |
|---|
| 732 | ! VERSION 3 MODIFIED FOR GRAVITY WAVES, LOCATION: .FR30(V3GWD) *J* |
|---|
| 733 | !--- 3.1 INCLUDES VARIABLE SATURATION FLUX PROFILE CF ISIGST |
|---|
| 734 | !--- 3.G INCLUDES PS COMBINED W/ PH (GLAS AND GFDL) |
|---|
| 735 | !----- ALSO INCLUDED IS RI SMOOTH OVER A THICK LOWER LAYER |
|---|
| 736 | !----- ALSO INCLUDED IS DECREASE IN DE-ACC AT TOP BY 1/2 |
|---|
| 737 | !----- THE NMC GWD INCORPORATING BOTH GLAS(P&S) AND GFDL(MIGWD) |
|---|
| 738 | !----- MOUNTAIN INDUCED GRAVITY WAVE DRAG |
|---|
| 739 | !----- CODE FROM .FR30(V3MONNX) FOR MONIN3 |
|---|
| 740 | !----- THIS VERSION (06 MAR 1987) |
|---|
| 741 | !----- THIS VERSION (26 APR 1987) 3.G |
|---|
| 742 | !----- THIS VERSION (01 MAY 1987) 3.9 |
|---|
| 743 | !----- CHANGE TO FORTRAN 77 (FEB 1989) --- HANN-MING HENRY JUANG |
|---|
| 744 | !----- |
|---|
| 745 | ! |
|---|
| 746 | ! VERSION 4 |
|---|
| 747 | ! ----- This code ----- |
|---|
| 748 | ! |
|---|
| 749 | !----- MODIFIED TO IMPLEMENT THE ENHANCED LOW TROPOSPHERIC GRAVITY |
|---|
| 750 | !----- WAVE DRAG DEVELOPED BY KIM AND ARAKAWA(JAS, 1995). |
|---|
| 751 | ! Orographic Std Dev (hprime), Convexity (OC), Asymmetry (OA4) |
|---|
| 752 | ! and Lx (CLX4) are input topographic statistics needed. |
|---|
| 753 | ! |
|---|
| 754 | !----- PROGRAMMED AND DEBUGGED BY HONG, ALPERT AND KIM --- JAN 1996. |
|---|
| 755 | !----- debugged again - moorthi and iredell --- may 1998. |
|---|
| 756 | !----- |
|---|
| 757 | ! Further Cleanup, optimization and modification |
|---|
| 758 | ! - S. Moorthi May 98, March 99. |
|---|
| 759 | !----- modified for usgs orography data (ncep office note 424) |
|---|
| 760 | ! and with several bugs fixed - moorthi and hong --- july 1999. |
|---|
| 761 | ! |
|---|
| 762 | !----- Modified & implemented into NRL NOGAPS |
|---|
| 763 | ! - Young-Joon Kim, July 2000 |
|---|
| 764 | !----- |
|---|
| 765 | ! VERSION lm MB (6): oz fix 8/2003 |
|---|
| 766 | ! ----- This code ----- |
|---|
| 767 | ! |
|---|
| 768 | !------ Changed to include the Lott and Miller Mtn Blocking |
|---|
| 769 | ! with some modifications by (*j*) 4/02 |
|---|
| 770 | ! From a Principal Coordinate calculation using the |
|---|
| 771 | ! Hi Res 8 minute orography, the Angle of the |
|---|
| 772 | ! mtn with that to the East (x) axis is THETA, the slope |
|---|
| 773 | ! parameter SIGMA. The anisotropy is in GAMMA - all are input |
|---|
| 774 | ! topographic statistics needed. These are calculated off-line |
|---|
| 775 | ! as a function of model resolution in the fortran code ml01rg2.f, |
|---|
| 776 | ! with script mlb2.sh. (*j*) |
|---|
| 777 | !----- gwdps_mb.f version (following lmi) elvmax < hncrit (*j*) |
|---|
| 778 | ! MB3a expt to enhance elvmax mtn hgt see sigfac & hncrit |
|---|
| 779 | !----- |
|---|
| 780 | !----------------------------------------------------------------------C |
|---|
| 781 | !==== Below in "!GFS " are the original subroutine call and comments from |
|---|
| 782 | ! /nwprod/sorc/global_fcst.fd/gwdps_v.f as of April 2007 |
|---|
| 783 | !GFS SUBROUTINE GWDPS(IM,IX,IY,KM,A,B,U1,V1,T1,Q1,KPBL, |
|---|
| 784 | !GFS & PRSI,DEL,PRSL,PRSLK,PHII, PHIL,RCL,DELTIM,KDT, |
|---|
| 785 | !GFS & HPRIME,OC,OA4,CLX4,THETA,SIGMA,GAMMA,ELVMAX, |
|---|
| 786 | !GFS & DUsfc,DVsfc,G, CP, RD, RV, IMX, |
|---|
| 787 | !GFS & nmtvr, me, lprnt, ipr) |
|---|
| 788 | !GFS !------------------------------------------------------------------ |
|---|
| 789 | !GFS ! USE |
|---|
| 790 | !GFS ! ROUTINE IS CALLED FROM GBPHYS (AFTER CALL TO MONNIN) |
|---|
| 791 | !GFS ! |
|---|
| 792 | !GFS ! PURPOSE |
|---|
| 793 | !GFS ! USING THE GWD PARAMETERIZATIONS OF PS-GLAS AND PH- |
|---|
| 794 | !GFS ! GFDL TECHNIQUE. THE TIME TENDENCIES OF U V |
|---|
| 795 | !GFS ! ARE ALTERED TO INCLUDE THE EFFECT OF MOUNTAIN INDUCED |
|---|
| 796 | !GFS ! GRAVITY WAVE DRAG FROM SUB-GRID SCALE OROGRAPHY INCLUDING |
|---|
| 797 | !GFS ! CONVECTIVE BREAKING, SHEAR BREAKING AND THE PRESENCE OF |
|---|
| 798 | !GFS ! CRITICAL LEVELS |
|---|
| 799 | !GFS ! |
|---|
| 800 | !GFS ! INPUT |
|---|
| 801 | !GFS ! A(IY,KM) NON-LIN TENDENCY FOR V WIND COMPONENT |
|---|
| 802 | !GFS ! B(IY,KM) NON-LIN TENDENCY FOR U WIND COMPONENT |
|---|
| 803 | !GFS ! U1(IX,KM) ZONAL WIND / SQRT(RCL) M/SEC AT T0-DT |
|---|
| 804 | !GFS ! V1(IX,KM) MERIDIONAL WIND / SQRT(RCL) M/SEC AT T0-DT |
|---|
| 805 | !GFS ! T1(IX,KM) TEMPERATURE DEG K AT T0-DT |
|---|
| 806 | !GFS ! Q1(IX,KM) SPECIFIC HUMIDITY AT T0-DT |
|---|
| 807 | !GFS ! |
|---|
| 808 | !GFS ! RCL A scaling factor = RECIPROCAL OF SQUARE OF COS(LAT) |
|---|
| 809 | !GFS ! FOR MRF GFS. |
|---|
| 810 | !GFS ! DELTIM TIME STEP SECS |
|---|
| 811 | !GFS ! SI(N) P/PSFC AT BASE OF LAYER N |
|---|
| 812 | !GFS ! SL(N) P/PSFC AT MIDDLE OF LAYER N |
|---|
| 813 | !GFS ! DEL(N) POSITIVE INCREMENT OF P/PSFC ACROSS LAYER N |
|---|
| 814 | !GFS ! KPBL(IM) is the index of the top layer of the PBL |
|---|
| 815 | !GFS ! ipr & lprnt for diagnostics |
|---|
| 816 | !GFS ! |
|---|
| 817 | !GFS ! OUTPUT |
|---|
| 818 | !GFS ! A, B AS AUGMENTED BY TENDENCY DUE TO GWDPS |
|---|
| 819 | !GFS ! OTHER INPUT VARIABLES UNMODIFIED. |
|---|
| 820 | !GFS ! ******************************************************************** |
|---|
| 821 | ! |
|---|
| 822 | IMPLICIT NONE |
|---|
| 823 | ! |
|---|
| 824 | !-- INPUT: |
|---|
| 825 | ! |
|---|
| 826 | INTEGER, INTENT(IN) :: IM,KTS,KTE |
|---|
| 827 | REAL(kind=kind_phys), INTENT(IN), DIMENSION(IM,KTS:KTE) :: & |
|---|
| 828 | & U1,V1,T1,Q1,DEL,PRSL,PRSLK,PHIL |
|---|
| 829 | REAL(kind=kind_phys), INTENT(IN), DIMENSION(IM,KTS:KTE+1) :: & |
|---|
| 830 | & PRSI,PHII |
|---|
| 831 | REAL(kind=kind_phys), INTENT(IN), DIMENSION(IM,4) :: OA4,CLX4 |
|---|
| 832 | REAL(kind=kind_phys), INTENT(IN), DIMENSION(IM) :: & |
|---|
| 833 | & HPRIME,OC,THETA,SIGMA,GAMMA,ELVMAX |
|---|
| 834 | INTEGER, INTENT(IN), DIMENSION(IM) :: KPBL |
|---|
| 835 | CHARACTER (LEN=26), INTENT(IN) :: LABEL |
|---|
| 836 | LOGICAL, INTENT(IN) :: LPRNT |
|---|
| 837 | ! |
|---|
| 838 | !-- OUTPUT: |
|---|
| 839 | ! |
|---|
| 840 | REAL(kind=kind_phys), INTENT(INOUT), DIMENSION(IM,KTS:KTE) :: A,B |
|---|
| 841 | REAL(kind=kind_phys), INTENT(INOUT), DIMENSION(IM) :: DUsfc,DVsfc |
|---|
| 842 | ! |
|---|
| 843 | !----------------------------------------------------------------------- |
|---|
| 844 | !-- LOCAL variables: |
|---|
| 845 | !----------------------------------------------------------------------- |
|---|
| 846 | ! |
|---|
| 847 | ! Some constants |
|---|
| 848 | ! |
|---|
| 849 | ! |
|---|
| 850 | REAL(kind=kind_phys), PARAMETER :: PI=3.1415926535897931 & |
|---|
| 851 | &, G=9.806, CP=1004.6, RD=287.04, RV=461.6 & |
|---|
| 852 | &, FV=RV/RD-1., RDI=1./RD, GOR=G/RD, GR2=G*GOR, GOCP=G/CP & |
|---|
| 853 | &, ROG=1./G, ROG2=ROG*ROG & |
|---|
| 854 | &, DW2MIN=1., RIMIN=-100., RIC=0.25, BNV2MIN=1.0E-5 & |
|---|
| 855 | &, EFMIN=0.0, EFMAX=10.0, hpmax=200.0 & ! or hpmax=2500.0 |
|---|
| 856 | &, FRC=1.0, CE=0.8, CEOFRC=CE/FRC, frmax=100. & |
|---|
| 857 | &, CG=0.5, GMAX=1.0, CRITAC=5.0E-4, VELEPS=1.0 & |
|---|
| 858 | &, FACTOP=0.5, RLOLEV=500.0, HZERO=0., HONE=1. & ! or RLOLEV=0.5 |
|---|
| 859 | &, HE_4=.0001, HE_2=.01 & |
|---|
| 860 | ! |
|---|
| 861 | !-- Lott & Miller mountain blocking => aka "lm mtn blocking" |
|---|
| 862 | ! |
|---|
| 863 | &, cdmb = 1.0 & ! non-dim sub grid mtn drag Amp (*j*) |
|---|
| 864 | ! hncrit set to 8000m and sigfac added to enhance elvmax mtn hgt |
|---|
| 865 | &, hncrit=8000. & ! Max value in meters for ELVMAX (*j*) |
|---|
| 866 | !module top! &, sigfac=3.0 & ! MB3a expt test for ELVMAX factor (*j*) => control value is 0.1 |
|---|
| 867 | !module top &, sigfac=0. & ! MB3a expt test for ELVMAX factor (*j*) => control value is 0.1 |
|---|
| 868 | &, hminmt=50. & ! min mtn height (*j*) |
|---|
| 869 | &, hstdmin=25. & ! min orographic std dev in height |
|---|
| 870 | &, minwnd=0.1 & ! min wind component (*j*) |
|---|
| 871 | &, dpmin=5.0 ! Minimum thickness of the reference layer (centibars) |
|---|
| 872 | ! values of dpmin=0, 20 have also been used |
|---|
| 873 | ! |
|---|
| 874 | integer, parameter :: mdir=8 |
|---|
| 875 | real(kind=kind_phys), parameter :: FDIR=mdir/(PI+PI) |
|---|
| 876 | ! |
|---|
| 877 | !-- Template: |
|---|
| 878 | ! NWD 1 2 3 4 5 6 7 8 |
|---|
| 879 | ! WD W S SW NW E N NE SE |
|---|
| 880 | ! |
|---|
| 881 | integer,save :: nwdir(mdir) |
|---|
| 882 | data nwdir /6,7,5,8,2,3,1,4/ |
|---|
| 883 | ! |
|---|
| 884 | LOGICAL ICRILV(IM) |
|---|
| 885 | ! |
|---|
| 886 | !---- MOUNTAIN INDUCED GRAVITY WAVE DRAG |
|---|
| 887 | ! |
|---|
| 888 | ! |
|---|
| 889 | ! for lm mtn blocking |
|---|
| 890 | real(kind=kind_phys), DIMENSION(IM) :: WK,PE,EK,ZBK,UP,TAUB,XN & |
|---|
| 891 | & ,YN,UBAR,VBAR,ULOW,OA,CLX,ROLL,ULOI,DTFAC,XLINV,DELKS,DELKS1 & |
|---|
| 892 | & ,SCOR,BNV2bar, ELEVMX ! ,PSTAR |
|---|
| 893 | ! |
|---|
| 894 | real(kind=kind_phys), DIMENSION(IM,KTS:KTE) :: & |
|---|
| 895 | & BNV2LM,DB,ANG,UDS,BNV2,RI_N,TAUD,RO,VTK,VTJ |
|---|
| 896 | real(kind=kind_phys), DIMENSION(IM,KTS:KTE-1) :: VELCO |
|---|
| 897 | real(kind=kind_phys), DIMENSION(IM,KTS:KTE+1) :: TAUP |
|---|
| 898 | real(kind=kind_phys), DIMENSION(KTE-1) :: VELKO |
|---|
| 899 | ! |
|---|
| 900 | integer, DIMENSION(IM) :: & |
|---|
| 901 | & kref,kint,iwk,iwk2,ipt,kreflm,iwklm,iptlm,idxzb |
|---|
| 902 | ! |
|---|
| 903 | ! for lm mtn blocking |
|---|
| 904 | ! |
|---|
| 905 | real(kind=kind_phys) :: ZLEN, DBTMP, R, PHIANG, DBIM & |
|---|
| 906 | &, xl, rcsks, bnv, fr & |
|---|
| 907 | &, brvf, cleff, tem, tem1, tem2, temc, temv & |
|---|
| 908 | &, wdir, ti, rdz, dw2, shr2, bvf2 & |
|---|
| 909 | &, rdelks, wtkbj, efact, coefm, gfobnv & |
|---|
| 910 | &, scork, rscor, hd, fro, rim, sira & |
|---|
| 911 | &, dtaux, dtauy, pkp1log, pklog |
|---|
| 912 | ! |
|---|
| 913 | integer :: ncnt, kmm1, kmm2, lcap, lcapp1, kbps, kbpsp1,kbpsm1 & |
|---|
| 914 | &, kmps, kmpsp1, idir, nwd, i, j, k, klcap, kp1, kmpbl, npt, npr & |
|---|
| 915 | &, idxm1, ktrial, klevm1, kmll,kmds, KM & |
|---|
| 916 | ! &, ihit,jhit & |
|---|
| 917 | &, ME !-- processor element for debugging |
|---|
| 918 | |
|---|
| 919 | real :: rcl,rcs !dbg |
|---|
| 920 | |
|---|
| 921 | ! |
|---|
| 922 | !----------------------------------------------------------------------- |
|---|
| 923 | ! |
|---|
| 924 | KM = KTE |
|---|
| 925 | npr = 0 |
|---|
| 926 | DO I = 1, IM |
|---|
| 927 | DUsfc(I) = 0. |
|---|
| 928 | DVsfc(I) = 0. |
|---|
| 929 | ! |
|---|
| 930 | !-- ELEVMX is a local array that could be changed below |
|---|
| 931 | ! |
|---|
| 932 | ELEVMX(I) = ELVMAX(I) |
|---|
| 933 | ENDDO |
|---|
| 934 | ! |
|---|
| 935 | !-- Note that A, B already set to zero as DUDTcol, DVDTcol in subroutine GWD_driver |
|---|
| 936 | ! |
|---|
| 937 | ipt = 0 |
|---|
| 938 | npt = 0 |
|---|
| 939 | IF (NMTVR >= 14) then |
|---|
| 940 | DO I = 1,IM |
|---|
| 941 | IF (elvmax(i) > HMINMT .AND. hprime(i) > HE_4) then |
|---|
| 942 | npt = npt + 1 |
|---|
| 943 | ipt(npt) = i |
|---|
| 944 | ENDIF |
|---|
| 945 | ENDDO |
|---|
| 946 | ELSE |
|---|
| 947 | DO I = 1,IM |
|---|
| 948 | IF (hprime(i) > HE_4) then |
|---|
| 949 | npt = npt + 1 |
|---|
| 950 | ipt(npt) = i |
|---|
| 951 | ENDIF |
|---|
| 952 | ENDDO |
|---|
| 953 | ENDIF !-- IF (NMTVR >= 14) then |
|---|
| 954 | ! |
|---|
| 955 | |
|---|
| 956 | !dbg |
|---|
| 957 | rcl=1. |
|---|
| 958 | rcs=1. |
|---|
| 959 | !dbg if (lprnt) then |
|---|
| 960 | !dbg !-- Match what's in the GFS: |
|---|
| 961 | !dbg !dbg rcl=1.53028780126139008 ! match GFS point at 36N |
|---|
| 962 | !dbg !dbg rcs=sqrt(rcl) |
|---|
| 963 | !dbg i=im |
|---|
| 964 | !dbg write(6,"(a,a)") LABEL,' in GWD_col: K U V T Q Pi DP P EX PHIi PHI' |
|---|
| 965 | !dbg do k=kts,kte |
|---|
| 966 | !dbg write(6,"(i3,10e12.4)") k,U1(i,k),V1(i,k),T1(i,k),Q1(i,k),PRSI(i,k) & |
|---|
| 967 | !dbg ,DEL(i,k),PRSL(i,k),PRSLK(i,k),PHII(i,k),PHIL(i,k) |
|---|
| 968 | !dbg enddo |
|---|
| 969 | !dbg write(6,"(2(a,e12.4),2(a,4e12.4/),4(a,e12.4),a,i3) )") & |
|---|
| 970 | !dbg 'GWD_col: hprime(i)=',hprime(i),' oc(i)=',oc(i) & |
|---|
| 971 | !dbg ,' oa4(i,1-4)=',(oa4(i,k),k=1,4) & |
|---|
| 972 | !dbg ,' clx4(i,1-4)=',(clx4(i,k),k=1,4) & |
|---|
| 973 | !dbg ,' theta(i)=',theta(i),' sigma(i)=',sigma(i) & |
|---|
| 974 | !dbg ,' gamma(i)=',gamma(i),' elvmax(i)=',elvmax(i) & |
|---|
| 975 | !dbg ,' lpbl(i)=',kpbl(i) |
|---|
| 976 | !dbg endif |
|---|
| 977 | !dbg if (lprnt) CALL WRF_GET_MYPROC(ME) |
|---|
| 978 | |
|---|
| 979 | ! |
|---|
| 980 | !-- Note important criterion for immediately exiting routine! |
|---|
| 981 | ! |
|---|
| 982 | IF (npt <= 0) RETURN ! No gwd/mb calculation done! |
|---|
| 983 | ! |
|---|
| 984 | do i=1,npt |
|---|
| 985 | IDXZB(i) = 0 |
|---|
| 986 | enddo |
|---|
| 987 | ! |
|---|
| 988 | DO K = 1, KM |
|---|
| 989 | DO I = 1, IM |
|---|
| 990 | DB(I,K) = 0. |
|---|
| 991 | ANG(I,K) = 0. |
|---|
| 992 | UDS(I,K) = 0. |
|---|
| 993 | ENDDO |
|---|
| 994 | ENDDO |
|---|
| 995 | ! |
|---|
| 996 | ! |
|---|
| 997 | ! NCNT = 0 |
|---|
| 998 | KMM1 = KM - 1 |
|---|
| 999 | KMM2 = KM - 2 |
|---|
| 1000 | LCAP = KM |
|---|
| 1001 | LCAPP1 = LCAP + 1 |
|---|
| 1002 | ! |
|---|
| 1003 | ! |
|---|
| 1004 | IF (NMTVR .eq. 14) then |
|---|
| 1005 | ! ---- for lm and gwd calculation points |
|---|
| 1006 | ! |
|---|
| 1007 | ! --- iwklm is the level above the height of the mountain. |
|---|
| 1008 | ! --- idxzb is the level of the dividing streamline. |
|---|
| 1009 | ! INITIALIZE DIVIDING STREAMLINE (DS) CONTROL VECTOR |
|---|
| 1010 | ! |
|---|
| 1011 | do i=1,npt |
|---|
| 1012 | iwklm(i) = 2 |
|---|
| 1013 | kreflm(i) = 0 |
|---|
| 1014 | enddo |
|---|
| 1015 | ! |
|---|
| 1016 | ! |
|---|
| 1017 | ! start lm mtn blocking (mb) section |
|---|
| 1018 | ! |
|---|
| 1019 | !.............................. |
|---|
| 1020 | !.............................. |
|---|
| 1021 | ! |
|---|
| 1022 | ! (*j*) 11/03: test upper limit on KMLL=km - 1 |
|---|
| 1023 | ! then do not need hncrit -- test with large hncrit first. |
|---|
| 1024 | ! KMLL = km / 2 ! maximum mtnlm height : # of vertical levels / 2 |
|---|
| 1025 | KMLL = kmm1 |
|---|
| 1026 | ! --- No mtn should be as high as KMLL (so we do not have to start at |
|---|
| 1027 | ! --- the top of the model but could do calc for all levels). |
|---|
| 1028 | ! |
|---|
| 1029 | |
|---|
| 1030 | !dbg |
|---|
| 1031 | !dbg if (lprnt) print *,'k pkp1log pklog vtj(i,k) vtk(i,k) ro(i,k)' |
|---|
| 1032 | |
|---|
| 1033 | DO I = 1, npt |
|---|
| 1034 | j = ipt(i) |
|---|
| 1035 | ELEVMX(J) = min (ELEVMX(J) + sigfac * hprime(j), hncrit) |
|---|
| 1036 | |
|---|
| 1037 | !dbg |
|---|
| 1038 | !dbg if (lprnt) print *,'k=',k,' elevmx(j)=',elevmx(j),' elvmax(j)=',elvmax(j) & |
|---|
| 1039 | !dbg ,' sigfac*hprime(j)=',sigfac*hprime(j) |
|---|
| 1040 | |
|---|
| 1041 | ENDDO |
|---|
| 1042 | |
|---|
| 1043 | DO K = 1,KMLL |
|---|
| 1044 | DO I = 1, npt |
|---|
| 1045 | j = ipt(i) |
|---|
| 1046 | ! --- interpolate to max mtn height for index, iwklm(I) wk[gz] |
|---|
| 1047 | ! --- ELEVMX is limited to hncrit because to hi res topo30 orog. |
|---|
| 1048 | pkp1log = phil(j,k+1) * ROG |
|---|
| 1049 | pklog = phil(j,k) * ROG |
|---|
| 1050 | if ( ( ELEVMX(j) .le. pkp1log ) .and. & |
|---|
| 1051 | & ( ELEVMX(j) .ge. pklog ) ) THEN |
|---|
| 1052 | ! --- wk for diags but can be saved and reused. |
|---|
| 1053 | wk(i) = G * ELEVMX(j) / ( phil(j,k+1) - phil(j,k) ) |
|---|
| 1054 | iwklm(I) = MAX(iwklm(I), k+1 ) |
|---|
| 1055 | |
|---|
| 1056 | !dbg if (lprnt) print *,'k,wk(i),iwklm(i)=',k,wk(i),iwklm(i) !dbg |
|---|
| 1057 | |
|---|
| 1058 | endif |
|---|
| 1059 | ! |
|---|
| 1060 | ! --- find at prsl levels large scale environment variables |
|---|
| 1061 | ! --- these cover all possible mtn max heights |
|---|
| 1062 | VTJ(I,K) = T1(J,K) * (1.+FV*Q1(J,K)) ! virtual temperature |
|---|
| 1063 | VTK(I,K) = VTJ(I,K) / PRSLK(J,K) ! potential temperature |
|---|
| 1064 | RO(I,K) = RDI * PRSL(J,K) / VTJ(I,K) ! DENSITY (1.e-3 kg m^-3) |
|---|
| 1065 | |
|---|
| 1066 | !dbg if (lprnt) write(6,"(i2,5e12.4)") k,pkp1log,pklog,vtj(i,k),vtk(i,k),ro(i,k) !dbg |
|---|
| 1067 | |
|---|
| 1068 | ENDDO !-- DO I = 1, npt |
|---|
| 1069 | ! |
|---|
| 1070 | ENDDO !-- DO K = 1,KMLL |
|---|
| 1071 | ! |
|---|
| 1072 | ! testing for highest model level of mountain top |
|---|
| 1073 | ! |
|---|
| 1074 | ! ihit = 2 |
|---|
| 1075 | ! jhit = 0 |
|---|
| 1076 | ! do i = 1, npt |
|---|
| 1077 | ! j=ipt(i) |
|---|
| 1078 | ! if ( iwklm(i) .gt. ihit ) then |
|---|
| 1079 | ! ihit = iwklm(i) |
|---|
| 1080 | ! jhit = j |
|---|
| 1081 | ! endif |
|---|
| 1082 | ! enddo |
|---|
| 1083 | ! if (lprnt) print *, ' mb: kdt,max(iwklm),jhit,phil,me=', & |
|---|
| 1084 | ! & kdt,ihit,jhit,phil(jhit,ihit),me |
|---|
| 1085 | ! |
|---|
| 1086 | !dbg if (lprnt) print *,'k rdz bnv2lm(i,k)' !dbg |
|---|
| 1087 | klevm1 = KMLL - 1 |
|---|
| 1088 | DO K = 1, klevm1 |
|---|
| 1089 | DO I = 1, npt |
|---|
| 1090 | j = ipt(i) |
|---|
| 1091 | RDZ = g / ( phil(j,k+1) - phil(j,k) ) |
|---|
| 1092 | ! --- Brunt-Vaisala Frequency |
|---|
| 1093 | BNV2LM(I,K) = (G+G) * RDZ * ( VTK(I,K+1)-VTK(I,K) ) & |
|---|
| 1094 | & / ( VTK(I,K+1)+VTK(I,K) ) |
|---|
| 1095 | bnv2lm(i,k) = max( bnv2lm(i,k), bnv2min ) |
|---|
| 1096 | |
|---|
| 1097 | !dbg if (lprnt) write(6,"(i2,2e12.4)") k,rdz,bnv2lm(i,k) !dbg |
|---|
| 1098 | |
|---|
| 1099 | ENDDO |
|---|
| 1100 | ENDDO |
|---|
| 1101 | ! |
|---|
| 1102 | DO I = 1, npt |
|---|
| 1103 | J = ipt(i) |
|---|
| 1104 | DELKS(I) = 1.0 / (PRSI(J,1) - PRSI(J,iwklm(i))) |
|---|
| 1105 | DELKS1(I) = 1.0 / (PRSL(J,1) - PRSL(J,iwklm(i))) |
|---|
| 1106 | UBAR (I) = 0.0 |
|---|
| 1107 | VBAR (I) = 0.0 |
|---|
| 1108 | ROLL (I) = 0.0 |
|---|
| 1109 | PE (I) = 0.0 |
|---|
| 1110 | EK (I) = 0.0 |
|---|
| 1111 | BNV2bar(I) = (PRSL(J,1)-PRSL(J,2)) * DELKS1(I) * BNV2LM(I,1) |
|---|
| 1112 | ENDDO |
|---|
| 1113 | ! |
|---|
| 1114 | ! --- find the dividing stream line height |
|---|
| 1115 | ! --- starting from the level above the max mtn downward |
|---|
| 1116 | ! --- iwklm(i) is the k-index of mtn elevmx elevation |
|---|
| 1117 | ! |
|---|
| 1118 | DO Ktrial = KMLL, 1, -1 |
|---|
| 1119 | DO I = 1, npt |
|---|
| 1120 | IF ( Ktrial .LT. iwklm(I) .and. kreflm(I) .eq. 0 ) then |
|---|
| 1121 | kreflm(I) = Ktrial |
|---|
| 1122 | |
|---|
| 1123 | if (lprnt) print *,'Ktrial,iwklm(i),kreflm(i)=',Ktrial,iwklm(i),kreflm(I) |
|---|
| 1124 | |
|---|
| 1125 | ENDIF |
|---|
| 1126 | ENDDO |
|---|
| 1127 | ENDDO |
|---|
| 1128 | ! |
|---|
| 1129 | ! --- in the layer kreflm(I) to 1 find PE (which needs N, ELEVMX) |
|---|
| 1130 | ! --- make averages, guess dividing stream (DS) line layer. |
|---|
| 1131 | ! --- This is not used in the first cut except for testing and |
|---|
| 1132 | ! --- is the vert ave of quantities from the surface to mtn top. |
|---|
| 1133 | ! |
|---|
| 1134 | |
|---|
| 1135 | !dbg |
|---|
| 1136 | !dbg if (lprnt) print *,' k rdelks ubar vbar roll ' & |
|---|
| 1137 | !dbg ,'bnv2bar rcsks rcs' |
|---|
| 1138 | |
|---|
| 1139 | DO I = 1, npt |
|---|
| 1140 | DO K = 1, Kreflm(I) |
|---|
| 1141 | J = ipt(i) |
|---|
| 1142 | RDELKS = DEL(J,K) * DELKS(I) |
|---|
| 1143 | |
|---|
| 1144 | !dbg |
|---|
| 1145 | RCSKS = RCS * RDELKS |
|---|
| 1146 | UBAR(I) = UBAR(I) + RCSKS * U1(J,K) ! trial Mean U below |
|---|
| 1147 | VBAR(I) = VBAR(I) + RCSKS * V1(J,K) ! trial Mean V below |
|---|
| 1148 | |
|---|
| 1149 | ROLL(I) = ROLL(I) + RDELKS * RO(I,K) ! trial Mean RO below |
|---|
| 1150 | RDELKS = (PRSL(J,K)-PRSL(J,K+1)) * DELKS1(I) |
|---|
| 1151 | BNV2bar(I) = BNV2bar(I) + BNV2lm(I,K) * RDELKS |
|---|
| 1152 | ! --- these vert ave are for diags, testing and GWD to follow (*j*). |
|---|
| 1153 | |
|---|
| 1154 | !dbg |
|---|
| 1155 | !dbg if (lprnt) write(6,"(i2,7e12.4)") k,rdelks,ubar(i),vbar(i),roll(i) & |
|---|
| 1156 | !dbg ,bnv2bar(i),rcsks,rcs |
|---|
| 1157 | |
|---|
| 1158 | ENDDO |
|---|
| 1159 | ENDDO |
|---|
| 1160 | |
|---|
| 1161 | !dbg |
|---|
| 1162 | !dbg if (lprnt) print *, 'kreflm(npt)=',kreflm(npt) & |
|---|
| 1163 | !dbg ,' bnv2bar(npt)=',bnv2bar(npt) & |
|---|
| 1164 | !dbg ,' ubar(npt)=',ubar(npt) & |
|---|
| 1165 | !dbg ,' vbar(npt)=',vbar(npt) & |
|---|
| 1166 | !dbg ,' roll(npt)=',roll(npt) & |
|---|
| 1167 | !dbg ,' delks(npt)=',delks(npt) & |
|---|
| 1168 | !dbg ,' delks1(npt)=',delks1(npt) |
|---|
| 1169 | |
|---|
| 1170 | ! |
|---|
| 1171 | ! --- integrate to get PE in the trial layer. |
|---|
| 1172 | ! --- Need the first layer where PE>EK - as soon as |
|---|
| 1173 | ! --- IDXZB is not 0 we have a hit and Zb is found. |
|---|
| 1174 | ! |
|---|
| 1175 | DO I = 1, npt |
|---|
| 1176 | J = ipt(i) |
|---|
| 1177 | |
|---|
| 1178 | !dbg |
|---|
| 1179 | !dbg if (lprnt) print *,'k phiang u1(j,k) v1(j,k) theta(j)' & |
|---|
| 1180 | !dbg ,' ang(i,k) uds(i,k) pe(i) up(i) ek(i)' |
|---|
| 1181 | |
|---|
| 1182 | DO K = iwklm(I), 1, -1 |
|---|
| 1183 | PHIANG = RAD_TO_DEG*atan2(V1(J,K),U1(J,K)) |
|---|
| 1184 | ANG(I,K) = ( THETA(J) - PHIANG ) |
|---|
| 1185 | if ( ANG(I,K) .gt. 90. ) ANG(I,K) = ANG(I,K) - 180. |
|---|
| 1186 | if ( ANG(I,K) .lt. -90. ) ANG(I,K) = ANG(I,K) + 180. |
|---|
| 1187 | ! |
|---|
| 1188 | !dbg UDS(I,K) = & |
|---|
| 1189 | UDS(I,K) = rcs* & |
|---|
| 1190 | & MAX(SQRT(U1(J,K)*U1(J,K) + V1(J,K)*V1(J,K)), minwnd) |
|---|
| 1191 | ! --- Test to see if we found Zb previously |
|---|
| 1192 | IF (IDXZB(I) .eq. 0 ) then |
|---|
| 1193 | PE(I) = PE(I) + BNV2lm(I,K) * & |
|---|
| 1194 | & ( G * ELEVMX(J) - phil(J,K) ) * & |
|---|
| 1195 | & ( PHII(J,K+1) - PHII(J,K) ) * ROG2 |
|---|
| 1196 | |
|---|
| 1197 | !dbg |
|---|
| 1198 | !dbg & ( PHII(J,K+1) - PHII(J,K) ) / (G*G) |
|---|
| 1199 | !dbg if (lprnt) print *, & |
|---|
| 1200 | !dbg 'k=',k,' pe(i)=',pe(i),' bnv2lm(i,k)=',bnv2lm(i,k) & |
|---|
| 1201 | !dbg ,' g=',g,' elevmx(j)=',elevmx(j) & |
|---|
| 1202 | !dbg ,' g*elevmx(j)-phil(j,k)=',g*elevmx(j)-phil(j,k) & |
|---|
| 1203 | !dbg ,' (phii(j,k+1)-phi(j,k))/(g*g)=',(PHII(J,K+1)-PHII(J,K) )*ROG2 |
|---|
| 1204 | |
|---|
| 1205 | ! --- KE |
|---|
| 1206 | ! --- Wind projected on the line perpendicular to mtn range, U(Zb(K)). |
|---|
| 1207 | ! --- kinetic energy is at the layer Zb |
|---|
| 1208 | ! --- THETA ranges from -+90deg |_ to the mtn "largest topo variations" |
|---|
| 1209 | UP(I) = UDS(I,K) * cos(DEG_TO_RAD*ANG(I,K)) |
|---|
| 1210 | EK(I) = 0.5 * UP(I) * UP(I) |
|---|
| 1211 | |
|---|
| 1212 | ! --- Dividing Stream lime is found when PE =exceeds EK. |
|---|
| 1213 | IF ( PE(I) .ge. EK(I) ) IDXZB(I) = K |
|---|
| 1214 | ! --- Then mtn blocked flow is between Zb=k(IDXZB(I)) and surface |
|---|
| 1215 | ! |
|---|
| 1216 | ENDIF !-- IF (IDXZB(I) .eq. 0 ) then |
|---|
| 1217 | |
|---|
| 1218 | !dbg |
|---|
| 1219 | !dbg if (lprnt) write(6,"(i2,9e12.4)") & |
|---|
| 1220 | !dbg k,phiang,u1(j,k),v1(j,k),theta(j),ang(i,k),uds(i,k),pe(i),up(i),ek(i) |
|---|
| 1221 | |
|---|
| 1222 | ENDDO !-- DO K = iwklm(I), 1, -1 |
|---|
| 1223 | ENDDO !-- DO I = 1, npt |
|---|
| 1224 | ! |
|---|
| 1225 | DO I = 1, npt |
|---|
| 1226 | J = ipt(i) |
|---|
| 1227 | ! --- Calc if N constant in layers (Zb guess) - a diagnostic only. |
|---|
| 1228 | ZBK(I) = ELEVMX(J) - SQRT(UBAR(I)**2 + VBAR(I)**2)/BNV2bar(I) |
|---|
| 1229 | ENDDO |
|---|
| 1230 | ! |
|---|
| 1231 | |
|---|
| 1232 | !dbg |
|---|
| 1233 | !dbg if (lprnt) print *,'iwklm=',iwklm(npt),' ZBK=',ZBK(npt) |
|---|
| 1234 | |
|---|
| 1235 | ! |
|---|
| 1236 | ! --- The drag for mtn blocked flow |
|---|
| 1237 | ! |
|---|
| 1238 | |
|---|
| 1239 | !dbg |
|---|
| 1240 | !dbg if (lprnt) print *,'k phil(j,k) g*hprime(j) ' & |
|---|
| 1241 | !dbg ,'phil(j,idxzb(i))-phil(j,k) zlen r dbtmp db(i,k)' |
|---|
| 1242 | |
|---|
| 1243 | ! |
|---|
| 1244 | DO I = 1, npt |
|---|
| 1245 | J = ipt(i) |
|---|
| 1246 | ZLEN = 0. |
|---|
| 1247 | IF ( IDXZB(I) .gt. 0 ) then |
|---|
| 1248 | DO K = IDXZB(I), 1, -1 |
|---|
| 1249 | IF (PHIL(J,IDXZB(I)) > PHIL(J,K)) THEN |
|---|
| 1250 | ZLEN = SQRT( ( PHIL(J,IDXZB(I))-PHIL(J,K) ) / & |
|---|
| 1251 | & ( PHIL(J,K ) + G * hprime(J) ) ) |
|---|
| 1252 | ! --- lm eq 14: |
|---|
| 1253 | R = (cos(DEG_TO_RAD*ANG(I,K))**2 + GAMMA(J) * sin(DEG_TO_RAD*ANG(I,K))**2) / & |
|---|
| 1254 | & (gamma(J) * cos(DEG_TO_RAD*ANG(I,K))**2 + sin(DEG_TO_RAD*ANG(I,K))**2) |
|---|
| 1255 | ! --- (negative of DB -- see sign at tendency) |
|---|
| 1256 | DBTMP = 0.25 * CDmb * & |
|---|
| 1257 | & MAX( 2. - 1. / R, HZERO ) * sigma(J) * & |
|---|
| 1258 | & MAX(cos(DEG_TO_RAD*ANG(I,K)), gamma(J)*sin(DEG_TO_RAD*ANG(I,K))) * & |
|---|
| 1259 | & ZLEN / hprime(J) |
|---|
| 1260 | DB(I,K) = DBTMP * UDS(I,K) |
|---|
| 1261 | ! |
|---|
| 1262 | |
|---|
| 1263 | !dbg |
|---|
| 1264 | !dbg if (lprnt) write(6,"(i3,7e12.4)") & |
|---|
| 1265 | !dbg k,phil(j,k),g*hprime(j),phil(j,idxzb(i))-phil(j,k),zlen,r,dbtmp,db(i,k) |
|---|
| 1266 | |
|---|
| 1267 | ! |
|---|
| 1268 | ENDIF !-- IF (PHIL(J,IDXZB(I)) > PHIL(J,K) .AND. DEN > 0.) THEN |
|---|
| 1269 | ENDDO !-- DO K = IDXZB(I), 1, -1 |
|---|
| 1270 | endif |
|---|
| 1271 | ENDDO !-- DO I = 1, npt |
|---|
| 1272 | ! |
|---|
| 1273 | !............................. |
|---|
| 1274 | !............................. |
|---|
| 1275 | ! end mtn blocking section |
|---|
| 1276 | ! |
|---|
| 1277 | ENDIF !-- IF ( NMTVR .eq. 14) then |
|---|
| 1278 | ! |
|---|
| 1279 | !............................. |
|---|
| 1280 | !............................. |
|---|
| 1281 | ! |
|---|
| 1282 | KMPBL = km / 2 ! maximum pbl height : # of vertical levels / 2 |
|---|
| 1283 | ! |
|---|
| 1284 | ! Scale cleff between IM=384*2 and 192*2 for T126/T170 and T62 |
|---|
| 1285 | ! |
|---|
| 1286 | if (imx .gt. 0) then |
|---|
| 1287 | ! cleff = 1.0E-5 * SQRT(FLOAT(IMX)/384.0) ! this is inverse of CLEFF! |
|---|
| 1288 | ! cleff = 1.0E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF! |
|---|
| 1289 | cleff = 0.5E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF! |
|---|
| 1290 | ! cleff = 2.0E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF! |
|---|
| 1291 | ! cleff = 2.5E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF! |
|---|
| 1292 | endif |
|---|
| 1293 | |
|---|
| 1294 | !dbg |
|---|
| 1295 | !dbg if (lprnt) print *,'imx, cleff, rcl, rcs=',imx,cleff,rcl,rcs |
|---|
| 1296 | !dbg if (lprnt) print *,' k vtj vtk ro' |
|---|
| 1297 | |
|---|
| 1298 | DO K = 1,KM |
|---|
| 1299 | DO I =1,npt |
|---|
| 1300 | J = ipt(i) |
|---|
| 1301 | VTJ(I,K) = T1(J,K) * (1.+FV*Q1(J,K)) |
|---|
| 1302 | VTK(I,K) = VTJ(I,K) / PRSLK(J,K) |
|---|
| 1303 | RO(I,K) = RDI * PRSL(J,K) / VTJ(I,K) ! DENSITY |
|---|
| 1304 | TAUP(I,K) = 0.0 |
|---|
| 1305 | |
|---|
| 1306 | !dbg |
|---|
| 1307 | !dbg if (lprnt) write(6,"(i2,3e12.4)") k,vtj(i,k),vtk(i,k),ro(i,k) !dbg |
|---|
| 1308 | |
|---|
| 1309 | ENDDO |
|---|
| 1310 | ENDDO |
|---|
| 1311 | |
|---|
| 1312 | !dbg |
|---|
| 1313 | !dbg if (lprnt) print *,' k ti tem rdz tem1' & |
|---|
| 1314 | !dbg ,' tem2 dw2 shr2 bvf2 ri_n(i,k) bnv2(i,k)' |
|---|
| 1315 | |
|---|
| 1316 | DO K = 1,KMM1 |
|---|
| 1317 | DO I =1,npt |
|---|
| 1318 | J = ipt(i) |
|---|
| 1319 | TI = 2.0 / (T1(J,K)+T1(J,K+1)) |
|---|
| 1320 | TEM = TI / (PRSL(J,K)-PRSL(J,K+1)) |
|---|
| 1321 | ! RDZ = GOR * PRSI(J,K+1) * TEM |
|---|
| 1322 | RDZ = g / (phil(j,k+1) - phil(j,k)) |
|---|
| 1323 | TEM1 = U1(J,K) - U1(J,K+1) |
|---|
| 1324 | TEM2 = V1(J,K) - V1(J,K+1) |
|---|
| 1325 | |
|---|
| 1326 | !dbg |
|---|
| 1327 | ! DW2 = TEM1*TEM1 + TEM2*TEM2 |
|---|
| 1328 | DW2 = rcl*(TEM1*TEM1 + TEM2*TEM2) |
|---|
| 1329 | |
|---|
| 1330 | SHR2 = MAX(DW2,DW2MIN) * RDZ * RDZ |
|---|
| 1331 | BVF2 = G*(GOCP+RDZ*(VTJ(I,K+1)-VTJ(I,K))) * TI |
|---|
| 1332 | ri_n(I,K) = MAX(BVF2/SHR2,RIMIN) ! Richardson number |
|---|
| 1333 | ! Brunt-Vaisala Frequency |
|---|
| 1334 | ! TEM = GR2 * (PRSL(J,K)+PRSL(J,K+1)) * TEM |
|---|
| 1335 | ! BNV2(I,K) = TEM * (VTK(I,K+1)-VTK(I,K))/(VTK(I,K+1)+VTK(I,K)) |
|---|
| 1336 | BNV2(I,K) = (G+G) * RDZ * (VTK(I,K+1)-VTK(I,K)) & |
|---|
| 1337 | & / (VTK(I,K+1)+VTK(I,K)) |
|---|
| 1338 | bnv2(i,k) = max( bnv2(i,k), bnv2min ) |
|---|
| 1339 | |
|---|
| 1340 | !dbg |
|---|
| 1341 | !dbg if (lprnt) write(6,"(i2,10e12.4)") & |
|---|
| 1342 | !dbg k,ti,tem,rdz,tem1,tem2,dw2,shr2,bvf2,ri_n(i,k),bnv2(i,k) |
|---|
| 1343 | |
|---|
| 1344 | ! |
|---|
| 1345 | ENDDO !-- DO K = 1,KMM1 |
|---|
| 1346 | ENDDO !-- DO I =1,npt |
|---|
| 1347 | ! |
|---|
| 1348 | |
|---|
| 1349 | !dbg |
|---|
| 1350 | !dbg if (lprnt) print *,'kmm1,bnv2=',kmm1,bnv2(npt,kmm1) |
|---|
| 1351 | |
|---|
| 1352 | ! |
|---|
| 1353 | ! Apply 3 point smoothing on BNV2 |
|---|
| 1354 | ! |
|---|
| 1355 | ! do k=1,km |
|---|
| 1356 | ! do i=1,im |
|---|
| 1357 | ! vtk(i,k) = bnv2(i,k) |
|---|
| 1358 | ! enddo |
|---|
| 1359 | ! enddo |
|---|
| 1360 | ! do k=2,kmm1 |
|---|
| 1361 | ! do i=1,im |
|---|
| 1362 | ! bnv2(i,k) = 0.25*(vtk(i,k-1)+vtk(i,k+1)) + 0.5*vtk(i,k) |
|---|
| 1363 | ! enddo |
|---|
| 1364 | ! enddo |
|---|
| 1365 | ! |
|---|
| 1366 | ! Finding the first interface index above 50 hPa level |
|---|
| 1367 | ! |
|---|
| 1368 | do i=1,npt |
|---|
| 1369 | iwk(i) = 2 |
|---|
| 1370 | enddo |
|---|
| 1371 | |
|---|
| 1372 | !dbg if (lprnt) print *,'kmpbl=',kmpbl !dbg |
|---|
| 1373 | |
|---|
| 1374 | DO K=3,KMPBL |
|---|
| 1375 | DO I=1,npt |
|---|
| 1376 | j = ipt(i) |
|---|
| 1377 | tem = (prsi(j,1) - prsi(j,k)) |
|---|
| 1378 | if (tem .lt. dpmin) iwk(i) = k |
|---|
| 1379 | enddo |
|---|
| 1380 | enddo |
|---|
| 1381 | ! |
|---|
| 1382 | KBPS = 1 |
|---|
| 1383 | KMPS = KM |
|---|
| 1384 | DO I=1,npt |
|---|
| 1385 | J = ipt(i) |
|---|
| 1386 | kref(I) = MAX(IWK(I), KPBL(J)+1 ) ! reference level |
|---|
| 1387 | DELKS(I) = 1.0 / (PRSI(J,1) - PRSI(J,kref(I))) |
|---|
| 1388 | DELKS1(I) = 1.0 / (PRSL(J,1) - PRSL(J,kref(I))) |
|---|
| 1389 | UBAR (I) = 0.0 |
|---|
| 1390 | VBAR (I) = 0.0 |
|---|
| 1391 | ROLL (I) = 0.0 |
|---|
| 1392 | KBPS = MAX(KBPS, kref(I)) |
|---|
| 1393 | KMPS = MIN(KMPS, kref(I)) |
|---|
| 1394 | ! |
|---|
| 1395 | BNV2bar(I) = (PRSL(J,1)-PRSL(J,2)) * DELKS1(I) * BNV2(I,1) |
|---|
| 1396 | ENDDO |
|---|
| 1397 | ! |
|---|
| 1398 | ! |
|---|
| 1399 | KBPSP1 = KBPS + 1 |
|---|
| 1400 | KBPSM1 = KBPS - 1 |
|---|
| 1401 | DO K = 1,KBPS |
|---|
| 1402 | DO I = 1,npt |
|---|
| 1403 | IF (K .LT. kref(I)) THEN |
|---|
| 1404 | J = ipt(i) |
|---|
| 1405 | RDELKS = DEL(J,K) * DELKS(I) |
|---|
| 1406 | |
|---|
| 1407 | !dbg |
|---|
| 1408 | ! UBAR(I) = UBAR(I) + RDELKS * U1(J,K) ! Mean U below kref |
|---|
| 1409 | ! VBAR(I) = VBAR(I) + RDELKS * V1(J,K) ! Mean V below kref |
|---|
| 1410 | RCSKS = RCS * RDELKS |
|---|
| 1411 | UBAR(I) = UBAR(I) + RCSKS * U1(J,K) ! Mean U below kref |
|---|
| 1412 | VBAR(I) = VBAR(I) + RCSKS * V1(J,K) ! Mean V below kref |
|---|
| 1413 | |
|---|
| 1414 | ! |
|---|
| 1415 | ROLL(I) = ROLL(I) + RDELKS * RO(I,K) ! Mean RO below kref |
|---|
| 1416 | RDELKS = (PRSL(J,K)-PRSL(J,K+1)) * DELKS1(I) |
|---|
| 1417 | BNV2bar(I) = BNV2bar(I) + BNV2(I,K) * RDELKS |
|---|
| 1418 | ENDIF |
|---|
| 1419 | ENDDO |
|---|
| 1420 | ENDDO |
|---|
| 1421 | ! |
|---|
| 1422 | |
|---|
| 1423 | !dbg |
|---|
| 1424 | !dbg if(lprnt) print *,'ubar(npt)=',ubar(npt) & |
|---|
| 1425 | !dbg ,' vbar(npt)=',vbar(npt),' roll(npt)=',roll(npt) & |
|---|
| 1426 | !dbg ,' bnv2bar(npt)=',bnv2bar(npt) |
|---|
| 1427 | |
|---|
| 1428 | ! |
|---|
| 1429 | ! FIGURE OUT LOW-LEVEL HORIZONTAL WIND DIRECTION AND FIND 'OA' |
|---|
| 1430 | ! |
|---|
| 1431 | ! NWD 1 2 3 4 5 6 7 8 |
|---|
| 1432 | ! WD W S SW NW E N NE SE |
|---|
| 1433 | ! |
|---|
| 1434 | DO I = 1,npt |
|---|
| 1435 | J = ipt(i) |
|---|
| 1436 | wdir = atan2(UBAR(I),VBAR(I)) + pi |
|---|
| 1437 | idir = mod(nint(fdir*wdir),mdir) + 1 |
|---|
| 1438 | nwd = nwdir(idir) |
|---|
| 1439 | OA(I) = (1-2*INT( (NWD-1)/4 )) * OA4(J,MOD(NWD-1,4)+1) |
|---|
| 1440 | CLX(I) = CLX4(J,MOD(NWD-1,4)+1) |
|---|
| 1441 | ENDDO |
|---|
| 1442 | ! |
|---|
| 1443 | !-----XN,YN "LOW-LEVEL" WIND PROJECTIONS IN ZONAL |
|---|
| 1444 | ! & MERIDIONAL DIRECTIONS |
|---|
| 1445 | !-----ULOW "LOW-LEVEL" WIND MAGNITUDE - (= U) |
|---|
| 1446 | !-----BNV2 BNV2 = N**2 |
|---|
| 1447 | !-----TAUB BASE MOMENTUM FLUX |
|---|
| 1448 | !-----= -(RO * U**3/(N*XL)*GF(FR) FOR N**2 > 0 |
|---|
| 1449 | !-----= 0. FOR N**2 < 0 |
|---|
| 1450 | !-----FR FROUDE = N*HPRIME / U |
|---|
| 1451 | !-----G GMAX*FR**2/(FR**2+CG/OC) |
|---|
| 1452 | ! |
|---|
| 1453 | !-----INITIALIZE SOME ARRAYS |
|---|
| 1454 | ! |
|---|
| 1455 | DO I = 1,npt |
|---|
| 1456 | XN(I) = 0.0 |
|---|
| 1457 | YN(I) = 0.0 |
|---|
| 1458 | TAUB (I) = 0.0 |
|---|
| 1459 | ULOW (I) = 0.0 |
|---|
| 1460 | DTFAC(I) = 1.0 |
|---|
| 1461 | ICRILV(I) = .FALSE. ! INITIALIZE CRITICAL LEVEL CONTROL VECTOR |
|---|
| 1462 | ! |
|---|
| 1463 | !----COMPUTE THE "LOW LEVEL" WIND MAGNITUDE (M/S) |
|---|
| 1464 | ! |
|---|
| 1465 | ULOW(I) = MAX(SQRT(UBAR(I)*UBAR(I) + VBAR(I)*VBAR(I)), HONE) |
|---|
| 1466 | ULOI(I) = 1.0 / ULOW(I) |
|---|
| 1467 | ENDDO |
|---|
| 1468 | |
|---|
| 1469 | !dbg |
|---|
| 1470 | !dbg if (lprnt) print *,'idir,nwd,wdir,oa,clx,ulow,uloi=' & |
|---|
| 1471 | !dbg ,idir,nwd,wdir,oa(npt),clx(npt),ulow(npt),uloi(npt) |
|---|
| 1472 | |
|---|
| 1473 | ! |
|---|
| 1474 | DO K = 1,KMM1 |
|---|
| 1475 | DO I = 1,npt |
|---|
| 1476 | J = ipt(i) |
|---|
| 1477 | |
|---|
| 1478 | !dbg |
|---|
| 1479 | ! VELCO(I,K) = 0.5* ((U1(J,K)+U1(J,K+1))*UBAR(I) & |
|---|
| 1480 | VELCO(I,K) = 0.5*rcs*((U1(J,K)+U1(J,K+1))*UBAR(I) & |
|---|
| 1481 | & + (V1(J,K)+V1(J,K+1))*VBAR(I)) |
|---|
| 1482 | |
|---|
| 1483 | VELCO(I,K) = VELCO(I,K) * ULOI(I) |
|---|
| 1484 | |
|---|
| 1485 | !dbg if (lprnt) write(6,"(a,i2,a,e12.4)") 'k=',k,' velco(i,k)=',velco(i,k) !dbg |
|---|
| 1486 | |
|---|
| 1487 | ! IF ((VELCO(I,K).LT.VELEPS) .AND. (VELCO(I,K).GT.0.)) THEN |
|---|
| 1488 | ! VELCO(I,K) = VELEPS |
|---|
| 1489 | ! ENDIF |
|---|
| 1490 | ENDDO |
|---|
| 1491 | ENDDO |
|---|
| 1492 | ! |
|---|
| 1493 | ! find the interface level of the projected wind where |
|---|
| 1494 | ! low levels & upper levels meet above pbl |
|---|
| 1495 | ! |
|---|
| 1496 | do i=1,npt |
|---|
| 1497 | kint(i) = km |
|---|
| 1498 | enddo |
|---|
| 1499 | do k = 1,kmm1 |
|---|
| 1500 | do i = 1,npt |
|---|
| 1501 | IF (K .GT. kref(I)) THEN |
|---|
| 1502 | if(velco(i,k) .lt. veleps .and. kint(i) .eq. km) then |
|---|
| 1503 | kint(i) = k+1 |
|---|
| 1504 | endif |
|---|
| 1505 | endif |
|---|
| 1506 | enddo |
|---|
| 1507 | enddo |
|---|
| 1508 | ! WARNING KINT = KREF !!!!!!!!! |
|---|
| 1509 | do i=1,npt |
|---|
| 1510 | kint(i) = kref(i) |
|---|
| 1511 | enddo |
|---|
| 1512 | ! |
|---|
| 1513 | ! |
|---|
| 1514 | DO I = 1,npt |
|---|
| 1515 | J = ipt(i) |
|---|
| 1516 | BNV = SQRT( BNV2bar(I) ) |
|---|
| 1517 | FR = BNV * ULOI(I) * min(HPRIME(J),hpmax) |
|---|
| 1518 | FR = MIN(FR, FRMAX) |
|---|
| 1519 | XN(I) = UBAR(I) * ULOI(I) |
|---|
| 1520 | YN(I) = VBAR(I) * ULOI(I) |
|---|
| 1521 | ! |
|---|
| 1522 | ! Compute the base level stress and store it in TAUB |
|---|
| 1523 | ! CALCULATE ENHANCEMENT FACTOR, NUMBER OF MOUNTAINS & ASPECT |
|---|
| 1524 | ! RATIO CONST. USE SIMPLIFIED RELATIONSHIP BETWEEN STANDARD |
|---|
| 1525 | ! DEVIATION & CRITICAL HGT |
|---|
| 1526 | ! |
|---|
| 1527 | EFACT = (OA(I) + 2.) ** (CEOFRC*FR) |
|---|
| 1528 | EFACT = MIN( MAX(EFACT,EFMIN), EFMAX ) |
|---|
| 1529 | ! |
|---|
| 1530 | COEFM = (1. + CLX(I)) ** (OA(I)+1.) |
|---|
| 1531 | ! |
|---|
| 1532 | XLINV(I) = COEFM * CLEFF |
|---|
| 1533 | ! |
|---|
| 1534 | TEM = FR * FR * OC(J) |
|---|
| 1535 | GFOBNV = GMAX * TEM / ((TEM + CG)*BNV) ! G/N0 |
|---|
| 1536 | ! |
|---|
| 1537 | TAUB(I) = XLINV(I) * ROLL(I) * ULOW(I) * ULOW(I) & |
|---|
| 1538 | & * ULOW(I) * GFOBNV * EFACT ! BASE FLUX Tau0 |
|---|
| 1539 | ! |
|---|
| 1540 | ! tem = min(HPRIME(I),hpmax) |
|---|
| 1541 | ! TAUB(I) = XLINV(I) * ROLL(I) * ULOW(I) * BNV * tem * tem |
|---|
| 1542 | ! |
|---|
| 1543 | K = MAX(1, kref(I)-1) |
|---|
| 1544 | TEM = MAX(VELCO(I,K)*VELCO(I,K), HE_4) |
|---|
| 1545 | SCOR(I) = BNV2(I,K) / TEM ! Scorer parameter below ref level |
|---|
| 1546 | ENDDO !-- DO I = 1,npt |
|---|
| 1547 | ! |
|---|
| 1548 | |
|---|
| 1549 | !dbg |
|---|
| 1550 | !dbg if (lprnt) write(6,"(a,i2,10(a,e12.4))") & |
|---|
| 1551 | !dbg 'kint=',kint(npt),' bnv=',bnv,' fr=',fr,' xn=',xn(npt) & |
|---|
| 1552 | !dbg ,' yn=',yn(npt),' efact=',efact,' coefm=',coefm,' xlinv(npt)=',xlinv(npt) & |
|---|
| 1553 | !dbg ,' gfobnv=',gfobnv,' taub(npt)=',taub(npt),' scor(npt)=',scor(npt) |
|---|
| 1554 | |
|---|
| 1555 | ! |
|---|
| 1556 | !----SET UP BOTTOM VALUES OF STRESS |
|---|
| 1557 | ! |
|---|
| 1558 | DO K = 1, KBPS |
|---|
| 1559 | DO I = 1,npt |
|---|
| 1560 | IF (K .LE. kref(I)) TAUP(I,K) = TAUB(I) |
|---|
| 1561 | ENDDO |
|---|
| 1562 | ENDDO |
|---|
| 1563 | |
|---|
| 1564 | ! |
|---|
| 1565 | ! Now compute vertical structure of the stress. |
|---|
| 1566 | ! |
|---|
| 1567 | DO K = KMPS, KMM1 ! Vertical Level K Loop! |
|---|
| 1568 | KP1 = K + 1 |
|---|
| 1569 | DO I = 1, npt |
|---|
| 1570 | ! |
|---|
| 1571 | !-----UNSTABLE LAYER IF RI < RIC |
|---|
| 1572 | !-----UNSTABLE LAYER IF UPPER AIR VEL COMP ALONG SURF VEL <=0 (CRIT LAY) |
|---|
| 1573 | !---- AT (U-C)=0. CRIT LAYER EXISTS AND BIT VECTOR SHOULD BE SET (.LE.) |
|---|
| 1574 | ! |
|---|
| 1575 | IF (K .GE. kref(I)) THEN |
|---|
| 1576 | ICRILV(I) = ICRILV(I) .OR. ( ri_n(I,K) .LT. RIC) & |
|---|
| 1577 | & .OR. (VELCO(I,K) .LE. 0.0) |
|---|
| 1578 | ENDIF |
|---|
| 1579 | ENDDO |
|---|
| 1580 | ! |
|---|
| 1581 | DO I = 1,npt |
|---|
| 1582 | IF (K .GE. kref(I)) THEN |
|---|
| 1583 | |
|---|
| 1584 | !dbg |
|---|
| 1585 | !dbg if (lprnt) write(6,"(2(a,i2),a,L1,3(a,e12.4))") 'k=',k,' kref(i)=',kref(i) & |
|---|
| 1586 | !dbg ,' icrilv(i)=',icrilv(i),' taup(i,k)=',taup(i,k) & |
|---|
| 1587 | !dbg ,' ri_n(i,k)=',ri_n(i,k),' velco(i,k)=',velco(i,k) |
|---|
| 1588 | |
|---|
| 1589 | ! |
|---|
| 1590 | IF (.NOT.ICRILV(I) .AND. TAUP(I,K) .GT. 0.0 ) THEN |
|---|
| 1591 | TEMV = 1.0 / max(VELCO(I,K), HE_2) |
|---|
| 1592 | ! IF (OA(I) .GT. 0. .AND. PRSI(ipt(i),KP1).GT.RLOLEV) THEN |
|---|
| 1593 | IF (OA(I).GT.0. .AND. kp1 .lt. kint(i)) THEN |
|---|
| 1594 | SCORK = BNV2(I,K) * TEMV * TEMV |
|---|
| 1595 | RSCOR = MIN(HONE, SCORK / SCOR(I)) |
|---|
| 1596 | SCOR(I) = SCORK |
|---|
| 1597 | ELSE |
|---|
| 1598 | RSCOR = 1. |
|---|
| 1599 | ENDIF |
|---|
| 1600 | ! |
|---|
| 1601 | BRVF = SQRT(BNV2(I,K)) ! Brunt-Vaisala Frequency |
|---|
| 1602 | ! TEM1 = XLINV(I)*(RO(I,KP1)+RO(I,K))*BRVF*VELCO(I,K)*0.5 |
|---|
| 1603 | TEM1 = XLINV(I)*(RO(I,KP1)+RO(I,K))*BRVF*0.5 & |
|---|
| 1604 | & * max(VELCO(I,K),HE_2) |
|---|
| 1605 | HD = SQRT(TAUP(I,K) / TEM1) |
|---|
| 1606 | FRO = BRVF * HD * TEMV |
|---|
| 1607 | ! |
|---|
| 1608 | ! RIM is the MINIMUM-RICHARDSON NUMBER BY SHUTTS (1985) |
|---|
| 1609 | ! |
|---|
| 1610 | TEM2 = SQRT(ri_n(I,K)) |
|---|
| 1611 | TEM = 1. + TEM2 * FRO |
|---|
| 1612 | RIM = ri_n(I,K) * (1.-FRO) / (TEM * TEM) |
|---|
| 1613 | ! |
|---|
| 1614 | ! CHECK STABILITY TO EMPLOY THE SATURATION HYPOTHESIS |
|---|
| 1615 | ! OF LINDZEN (1981) EXCEPT AT TROPOSPHERIC DOWNSTREAM REGIONS |
|---|
| 1616 | ! |
|---|
| 1617 | ! ---------------------- |
|---|
| 1618 | |
|---|
| 1619 | !dbg |
|---|
| 1620 | !dbg if (lprnt) write(6,"(a,i2,10(a,e12.4))") & |
|---|
| 1621 | !dbg 'k=',k,' brvf=',brvf,' tem1=',tem1,' xlinv(i)=',xlinv(i) & |
|---|
| 1622 | !dbg ,'ROavg=',.5*(RO(I,KP1)+RO(I,K)),' hd=',hd,' temv=',temv,' fro=',fro & |
|---|
| 1623 | !dbg ,' tem2=',tem2,' tem=',tem,' rim=',rim |
|---|
| 1624 | |
|---|
| 1625 | ! |
|---|
| 1626 | IF (RIM .LE. RIC .AND. & |
|---|
| 1627 | ! & (OA(I) .LE. 0. .OR. PRSI(ipt(I),KP1).LE.RLOLEV )) THEN |
|---|
| 1628 | & (OA(I) .LE. 0. .OR. kp1 .ge. kint(i) )) THEN |
|---|
| 1629 | TEMC = 2.0 + 1.0 / TEM2 |
|---|
| 1630 | HD = VELCO(I,K) * (2.*SQRT(TEMC)-TEMC) / BRVF |
|---|
| 1631 | TAUP(I,KP1) = TEM1 * HD * HD |
|---|
| 1632 | ELSE |
|---|
| 1633 | TAUP(I,KP1) = TAUP(I,K) * RSCOR |
|---|
| 1634 | ENDIF |
|---|
| 1635 | taup(i,kp1) = min(taup(i,kp1), taup(i,k)) |
|---|
| 1636 | |
|---|
| 1637 | !dbg |
|---|
| 1638 | !dbg if (lprnt) write(6,"(a,i2,2(a,e12.4))") 'kp1=',kp1 & |
|---|
| 1639 | !dbg ,' taup(i,kp1)=',taup(i,kp1),' taup(i,k)=',taup(i,k) |
|---|
| 1640 | |
|---|
| 1641 | ENDIF !-- IF (.NOT.ICRILV(I) .AND. TAUP(I,K) .GT. 0.0 ) THEN |
|---|
| 1642 | ENDIF !-- IF (K .GE. kref(I)) THEN |
|---|
| 1643 | ENDDO !-- DO I = 1,npt |
|---|
| 1644 | ENDDO !-- DO K = KMPS, KMM1 |
|---|
| 1645 | ! |
|---|
| 1646 | ! DO I=1,IM |
|---|
| 1647 | ! taup(i,km+1) = taup(i,km) |
|---|
| 1648 | ! ENDDO |
|---|
| 1649 | ! |
|---|
| 1650 | IF(LCAP .LE. KM) THEN |
|---|
| 1651 | |
|---|
| 1652 | !dbg if (lprnt) print *,'lcap,lcapp1,km=',lcap,lcapp1,km !dbg |
|---|
| 1653 | |
|---|
| 1654 | DO KLCAP = LCAPP1, KM+1 |
|---|
| 1655 | DO I = 1,npt |
|---|
| 1656 | SIRA = PRSI(ipt(I),KLCAP) / PRSI(ipt(I),LCAP) |
|---|
| 1657 | TAUP(I,KLCAP) = SIRA * TAUP(I,LCAP) |
|---|
| 1658 | |
|---|
| 1659 | !dbg |
|---|
| 1660 | !dbg if (lprnt) write(6,"(a,i2,5(a,e12.4))") & |
|---|
| 1661 | !dbg 'klcap=',klcap,' sira=',sira,' prsi(ipt(i),klcap)=', prsi(ipt(i),klcap) & |
|---|
| 1662 | !dbg ,' prsi(ipt(i),lcap)=',prsi(ipt(i),lcap),' taup(i,lcap)=',taup(i,lcap) & |
|---|
| 1663 | !dbg ,' taup(i,klcap)=',taup(i,klcap) |
|---|
| 1664 | |
|---|
| 1665 | ! |
|---|
| 1666 | ENDDO |
|---|
| 1667 | ENDDO |
|---|
| 1668 | ENDIF |
|---|
| 1669 | ! |
|---|
| 1670 | ! Calculate - (g/p*)*d(tau)/d(sigma) and Decel terms DTAUX, DTAUY |
|---|
| 1671 | ! |
|---|
| 1672 | DO I=1,npt |
|---|
| 1673 | ! SCOR(I) = 1.0 / PSTAR(I) |
|---|
| 1674 | |
|---|
| 1675 | !dbg |
|---|
| 1676 | ! SCOR(I) = 1.0 |
|---|
| 1677 | SCOR(I) = 1.0/RCS |
|---|
| 1678 | |
|---|
| 1679 | ENDDO |
|---|
| 1680 | DO K = 1,KM |
|---|
| 1681 | DO I = 1,npt |
|---|
| 1682 | TAUD(I,K) = G * (TAUP(I,K+1) - TAUP(I,K)) * SCOR(I) & |
|---|
| 1683 | & / DEL(ipt(I),K) |
|---|
| 1684 | |
|---|
| 1685 | !dbg |
|---|
| 1686 | !dbg if (lprnt) write(6,"(a,i2,4(a,e12.4))") 'k=',k,' taud(i,k)=',taud(i,k) & |
|---|
| 1687 | !dbg ,' D(taup)=',TAUP(I,K+1)-TAUP(I,K),' del(ipt(i),k)=',del(ipt(i),k) & |
|---|
| 1688 | !dbg ,' scor(i)=',scor(i) |
|---|
| 1689 | |
|---|
| 1690 | ENDDO |
|---|
| 1691 | ENDDO |
|---|
| 1692 | |
|---|
| 1693 | ! |
|---|
| 1694 | !------LIMIT DE-ACCELERATION (MOMENTUM DEPOSITION ) AT TOP TO 1/2 VALUE |
|---|
| 1695 | !------THE IDEA IS SOME STUFF MUST GO OUT THE TOP |
|---|
| 1696 | ! |
|---|
| 1697 | DO KLCAP = LCAP, KM |
|---|
| 1698 | DO I = 1,npt |
|---|
| 1699 | TAUD(I,KLCAP) = TAUD(I,KLCAP) * FACTOP |
|---|
| 1700 | |
|---|
| 1701 | !dbg |
|---|
| 1702 | !dbg if (lprnt) write(6,"(a,i2,a,e12.4)") 'klcap=',klcap,' taud(i,klcap)=',taud(i,klcap) |
|---|
| 1703 | |
|---|
| 1704 | ENDDO |
|---|
| 1705 | ENDDO |
|---|
| 1706 | ! |
|---|
| 1707 | !------IF THE GRAVITY WAVE DRAG WOULD FORCE A CRITICAL LINE IN THE |
|---|
| 1708 | !------LAYERS BELOW SIGMA=RLOLEV DURING THE NEXT DELTIM TIMESTEP, |
|---|
| 1709 | !------THEN ONLY APPLY DRAG UNTIL THAT CRITICAL LINE IS REACHED. |
|---|
| 1710 | ! |
|---|
| 1711 | DO K = 1,KMM1 |
|---|
| 1712 | DO I = 1,npt |
|---|
| 1713 | IF (K .GT. kref(I) .and. PRSI(ipt(i),K) .GE. RLOLEV) THEN |
|---|
| 1714 | IF(TAUD(I,K).NE.0.) THEN |
|---|
| 1715 | |
|---|
| 1716 | !dbg |
|---|
| 1717 | ! TEM = DELTIM * TAUD(I,K) |
|---|
| 1718 | TEM = rcs*DELTIM * TAUD(I,K) |
|---|
| 1719 | |
|---|
| 1720 | DTFAC(I) = MIN(DTFAC(I),ABS(VELCO(I,K)/TEM)) |
|---|
| 1721 | |
|---|
| 1722 | !dbg |
|---|
| 1723 | !dbg if (lprnt) write(6,"(a,i2,2(a,e12.4))") 'k=',k & |
|---|
| 1724 | !dbg ,' tem=',tem,' dtfac(i)=',dtfac(i) |
|---|
| 1725 | |
|---|
| 1726 | ENDIF |
|---|
| 1727 | ENDIF |
|---|
| 1728 | ENDDO |
|---|
| 1729 | ENDDO |
|---|
| 1730 | ! if(lprnt .and. npr .gt. 0) then |
|---|
| 1731 | ! print *, before A=,A(npr,:) |
|---|
| 1732 | ! print *, before B=,B(npr,:) |
|---|
| 1733 | ! endif |
|---|
| 1734 | ! |
|---|
| 1735 | |
|---|
| 1736 | !dbg |
|---|
| 1737 | !dbg if (lprnt) write(6,"(a,i2,3(a,e12.4))") 'idxzb(npt)=',idxzb(npt) & |
|---|
| 1738 | !dbg ,' dtfac=',dtfac(npt),' xn=',xn(npt),' yn=',yn(npt) |
|---|
| 1739 | |
|---|
| 1740 | ! |
|---|
| 1741 | DO K = 1,KM |
|---|
| 1742 | DO I = 1,npt |
|---|
| 1743 | J = ipt(i) |
|---|
| 1744 | TAUD(I,K) = TAUD(I,K) * DTFAC(I) |
|---|
| 1745 | DTAUX = TAUD(I,K) * XN(I) |
|---|
| 1746 | DTAUY = TAUD(I,K) * YN(I) |
|---|
| 1747 | ! --- lm mb (*j*) changes overwrite GWD |
|---|
| 1748 | if ( K .lt. IDXZB(I) .AND. IDXZB(I) .ne. 0 ) then |
|---|
| 1749 | DBIM = DB(I,K) / (1.+DB(I,K)*DELTIM) |
|---|
| 1750 | A(J,K) = - DBIM * V1(J,K) + A(J,K) |
|---|
| 1751 | B(J,K) = - DBIM * U1(J,K) + B(J,K) |
|---|
| 1752 | DUsfc(J) = DUsfc(J) - DBIM * V1(J,K) * DEL(J,K) |
|---|
| 1753 | DVsfc(J) = DVsfc(J) - DBIM * U1(J,K) * DEL(J,K) |
|---|
| 1754 | |
|---|
| 1755 | !dbg |
|---|
| 1756 | !dbg if (lprnt .and. dbim > 0.) write(6,"(a,i2,4(a,e12.4))") & |
|---|
| 1757 | !dbg 'k=',k,' db(i,k)=',db(i,k),' dbim=',dbim & |
|---|
| 1758 | !dbg ,' dudt=',-dbim*u1(j,k),' dvdt=',-dbim*v1(j,k) |
|---|
| 1759 | |
|---|
| 1760 | ! |
|---|
| 1761 | else |
|---|
| 1762 | ! |
|---|
| 1763 | A(J,K) = DTAUY + A(J,K) |
|---|
| 1764 | B(J,K) = DTAUX + B(J,K) |
|---|
| 1765 | DUsfc(J) = DUsfc(J) + DTAUX * DEL(J,K) |
|---|
| 1766 | DVsfc(J) = DVsfc(J) + DTAUY * DEL(J,K) |
|---|
| 1767 | |
|---|
| 1768 | !dbg |
|---|
| 1769 | !dbg if (lprnt .and. dtaux+dtauy/=0.) write(6,"(a,i2,2(a,e12.4))") & |
|---|
| 1770 | !dbg ',k=',k,' dudt=dtaux=',dtaux,' dvdt=dtauy=',dtauy |
|---|
| 1771 | |
|---|
| 1772 | endif |
|---|
| 1773 | |
|---|
| 1774 | !dbg |
|---|
| 1775 | !dbg if (lprnt) write(6,"(a,i2,2(a,e12.4))") 'k=',k & |
|---|
| 1776 | !dbg ,' dusfc(j)=',dusfc(j),' dvsfc(j)=',dvsfc(j) |
|---|
| 1777 | |
|---|
| 1778 | ENDDO !-- DO I = 1,npt |
|---|
| 1779 | ENDDO !-- DO K = 1,KM |
|---|
| 1780 | ! if (lprnt) then |
|---|
| 1781 | ! print *, in gwdps_lm.f after A=,A(ipr,:) |
|---|
| 1782 | ! print *, in gwdps_lm.f after B=,B(ipr,:) |
|---|
| 1783 | ! print *, DB=,DB(ipr,:) |
|---|
| 1784 | ! endif |
|---|
| 1785 | DO I = 1,npt |
|---|
| 1786 | J = ipt(i) |
|---|
| 1787 | ! TEM = (-1.E3/G) * PSTAR(I) |
|---|
| 1788 | |
|---|
| 1789 | !dbg |
|---|
| 1790 | ! TEM = -1.E3/G |
|---|
| 1791 | TEM = -1.E3*ROG*rcs |
|---|
| 1792 | DUsfc(J) = TEM * DUsfc(J) |
|---|
| 1793 | DVsfc(J) = TEM * DVsfc(J) |
|---|
| 1794 | |
|---|
| 1795 | !dbg |
|---|
| 1796 | !dbg if (lprnt .and. i.eq.npr) write(6,"(3(a,e12.4))") 'tem=',tem & |
|---|
| 1797 | !dbg ,' dusfc(j)=',dusfc(j),' dvsfc(j)=',dvsfc(j) |
|---|
| 1798 | |
|---|
| 1799 | ENDDO |
|---|
| 1800 | ! |
|---|
| 1801 | END SUBROUTINE GWD_col |
|---|
| 1802 | ! |
|---|
| 1803 | !####################################################################### |
|---|
| 1804 | ! |
|---|
| 1805 | END MODULE module_gwd |
|---|