Changeset 2220 for trunk/LMDZ.MARS/libf/phymars/nonoro_gwd_ran_mod.F90
- Timestamp:
- Jan 22, 2020, 11:41:33 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.MARS/libf/phymars/nonoro_gwd_ran_mod.F90
r2173 r2220 3 3 IMPLICIT NONE 4 4 5 REAL,allocatable,save :: du_nonoro_gwd(:,:) ! Zonal wind tendency due to GWD 6 REAL,allocatable,save :: dv_nonoro_gwd(:,:) ! Meridional wind tendency due to GWD 7 5 8 CONTAINS 6 9 7 SUBROUTINE NONORO_GWD_RAN( NLON,NLEV,DTIME, pp, &10 SUBROUTINE NONORO_GWD_RAN(ngrid,nlayer,DTIME, pp, & 8 11 zmax_therm, pt, pu, pv, pdt, pdu, pdv, & 9 zustr,zvstr,d_t, d_u, d_v) 12 zustr,zvstr,d_t, d_u, d_v, & 13 east_gwstress, west_gwstress) 10 14 11 15 !-------------------------------------------------------------------------------- … … 21 25 ! ADAPTED FOR MARS G.GILLI 02/2016 22 26 ! Revision with F.Forget 06/2016 Variable EP-flux according to 23 ! PBL variation (max velocity thermals) 27 ! PBL variation (max velocity thermals) 28 ! UPDATED D.BARDET 01/2020 - reproductibility of the 29 ! launching altitude calculation 30 ! - wave characteristic 31 ! calculation using MOD 32 ! - adding east_gwstress and 33 ! west_gwstress variables 24 34 !--------------------------------------------------------------------------------- 25 35 26 use dimphy, only: klon, klev27 ! use moyzon_mod, only: plevmoy28 36 use comcstfi_h, only: g, pi, cpp, r 29 ! use comgeomfi_h, only: latitude30 37 USE ioipsl_getin_p_mod, ONLY : getin_p 38 use assert_m, only : assert 39 use vertical_layers_mod, only : presnivs 31 40 implicit none 32 41 … … 34 43 include "paramet.h" 35 44 include "yoegwd.h" 45 include "callkeys.h" 46 47 CHARACTER (LEN=20) :: modname='flott_gwd_rando' 48 CHARACTER (LEN=80) :: abort_message 49 36 50 37 51 ! 0. DECLARATIONS: 38 52 39 53 ! 0.1 INPUTS 40 INTEGER, intent(in):: NLON, NLEV54 INTEGER, intent(in):: ngrid, nlayer 41 55 REAL, intent(in):: DTIME ! Time step of the Physics 42 REAL, intent(in):: zmax_therm( NLON) ! altitude of max velocity thermals (m)43 REAL, intent(in):: pp( NLON,NLEV) ! Pressure at full levels44 REAL, intent(in):: pt( NLON,NLEV) ! Temp at full levels45 REAL, intent(in):: pu( NLON,NLEV),pv(NLON,NLEV) ! Hor winds at full levels46 REAL,INTENT(in) :: pdt(n lon,nlev) ! tendency on temperature47 REAL,INTENT(in) :: pdu(n lon,nlev) ! tendency on zonal wind48 REAL,INTENT(in) :: pdv(n lon,nlev) ! tendency on meridional wind56 REAL, intent(in):: zmax_therm(ngrid) ! altitude of max velocity thermals (m) 57 REAL, intent(in):: pp(ngrid,nlayer) ! Pressure at full levels 58 REAL, intent(in):: pt(ngrid,nlayer) ! Temp at full levels 59 REAL, intent(in):: pu(ngrid,nlayer),pv(ngrid,nlayer) ! Hor winds at full levels 60 REAL,INTENT(in) :: pdt(ngrid,nlayer) ! tendency on temperature 61 REAL,INTENT(in) :: pdu(ngrid,nlayer) ! tendency on zonal wind 62 REAL,INTENT(in) :: pdv(ngrid,nlayer) ! tendency on meridional wind 49 63 50 64 ! 0.2 OUTPUTS 51 REAL, intent(out):: zustr(NLON), zvstr(NLON) ! Surface Stresses 52 REAL, intent(inout):: d_t(NLON, NLEV) ! Tendency on Temp. 53 54 55 REAL, intent(inout):: d_u(NLON, NLEV), d_v(NLON, NLEV) 56 ! Tendencies on winds 65 REAL, intent(out):: zustr(ngrid), zvstr(ngrid) ! Surface Stresses 66 REAL, intent(inout):: d_t(ngrid, nlayer) ! Tendency on Temp. 67 REAL, intent(inout):: d_u(ngrid, nlayer), d_v(ngrid, nlayer) ! tendency on winds 68 REAL, intent(inout):: east_gwstress(ngrid, nlayer) ! Profile of eastward stress 69 REAL, intent(inout):: west_gwstress(ngrid, nlayer) ! Profile of westward stress 57 70 58 71 ! O.3 INTERNAL ARRAYS 59 REAL :: TT( NLON, NLEV) ! Temp at full levels60 61 REAL :: UU(NLON, NLEV) , VV(NLON, NLEV)62 ! Hor winds at full levels63 64 INTEGER II, LL72 REAL :: TT(ngrid, nlayer) ! Temp at full levels 73 REAL :: UU(ngrid, nlayer) , VV(ngrid, nlayer) ! Hor winds at full levels 74 REAL :: BVLOW(ngrid) 75 REAL :: DZ 76 77 INTEGER II, JJ, LL 65 78 66 79 ! 0.3.0 TIME SCALE OF THE LIFE CYCLE OF THE WAVES PARAMETERIZED 67 80 68 REAL DELTAT81 REAL, parameter:: DELTAT = 24. * 3600. 69 82 70 83 ! 0.3.1 GRAVITY-WAVES SPECIFICATIONS 71 84 72 !! NO= values of C, NW= total of GW 73 INTEGER, PARAMETER:: N K = 2, NP = 2, NO = 2, NW = NK * NP * NO74 !Online output: change NO75 ! INTEGER, PARAMETER:: NK = 1, NP = 2, NO = 11, NW = NK * NP * NO 85 INTEGER, PARAMETER:: NK = 2 ! number of horizontal wavenumbers 86 INTEGER, PARAMETER:: NP = 2 ! directions (eastward and westward) phase speed 87 INTEGER, PARAMETER:: NO = 2 ! absolute values of phase speed 88 INTEGER, PARAMETER:: NW = NK * NP * NO ! Total numbers of gravity waves 76 89 INTEGER JK, JP, JO, JW 77 REAL KMIN, KMAX ! Min and Max horizontal wavenumbers 78 REAL CMIN, CMAX ! Min and Max absolute ph. vel. 79 REAL CPHA ! absolute PHASE VELOCITY frequency 80 REAL ZK(NW, KLON) ! Horizontal wavenumber amplitude 81 REAL ZP(NW) ! Horizontal wavenumber angle 82 REAL ZO(NW, KLON) ! Absolute frequency ! 83 84 ! Waves Intr. freq. at the 1/2 lev surrounding the full level 85 REAL ZOM(NW, KLON), ZOP(NW, KLON) 86 87 ! Wave EP-fluxes at the 2 semi levels surrounding the full level 88 REAL WWM(NW, KLON), WWP(NW, KLON) 89 ! Fluxes X and Y for each waves at 1/2 Levels 90 REAL RUWP(NW, KLON), RVWP(NW, KLON) 91 REAL RUW(KLON, KLEV + 1) ! Flux x at semi levels 92 REAL RVW(KLON, KLEV + 1) ! Flux y at semi levels 93 94 REAL RUW0(NW, KLON) ! Fluxes at launching level 95 REAL,SAVE :: RUWMAX ! Max value 90 INTEGER, PARAMETER:: NA = 5 ! number of realizations to get the phase speed 91 REAL, parameter:: kmax = 7.e-4 ! Max horizontal wavenumber 92 REAL, parameter:: kmin = 2.e-5 ! Min horizontal wavenumber 93 REAL, parameter:: cmax = 30. ! Max horizontal absolute phase velocity 94 REAL, parameter:: cmin = 1. ! Min horizontal absolute phase velocity 95 REAL CPHA ! absolute PHASE VELOCITY frequency 96 REAL ZK(NW, ngrid) ! Horizontal wavenumber amplitude 97 REAL ZP(NW, ngrid) ! Horizontal wavenumber angle 98 REAL ZO(NW, ngrid) ! Absolute frequency 99 100 REAL intr_freq_m(nw, ngrid) ! Waves Intr. freq. at the 1/2 lev below the full level (previous name: ZOM) 101 REAL intr_freq_p(nw, ngrid) ! Waves Intr. freq. at the 1/2 lev above the full level (previous name: ZOP) 102 REAL wwm(nw, ngrid) ! Wave EP-fluxes at the 1/2 level below the full level 103 REAL wwp(nw, ngrid) ! Wave EP-fluxes at the 1/2 level above the full level 104 REAL u_epflux_p(nw, ngrid) ! Partial zonal flux (=for each wave) at the 1/2 level above the full level (previous name: RUWP) 105 REAL v_epflux_p(nw, ngrid) ! Partial meridional flux (=for each wave) at the 1/2 level above the full level (previous name: RVWP) 106 REAL u_epflux_tot(ngrid, nlayer + 1) ! Total zonal flux (=for all waves (nw)) at the 1/2 level above the full level (3D) (previous name: RUW) 107 REAL v_epflux_tot(ngrid, nlayer + 1) ! Total meridional flux (=for all waves (nw)) at the 1/2 level above the full level (3D) (previous name: RVW) 108 REAL epflux_0(nw, ngrid) ! Fluxes at launching level (previous name: RUW0) 109 REAL, save :: epflux_max ! Max EP flux value at launching altitude (previous name: RUWMAX) 96 110 INTEGER LAUNCH ! Launching altitude 97 REAL XLAUNCH ! Control the launching altitude 98 REAL ZMAXTH_TOP ! Top of convective layer (approx.) 99 100 ! 0.3.2 PARAMETERS OF WAVES DISSIPATIONS 101 102 REAL SAT ! saturation parameter 103 REAL RDISS, ZOISEC ! COEFF DE DISSIPATION, SECURITY FOR INTRINSIC FREQ 104 105 ! 0.3.3 BACKGROUND FLOW AT 1/2 LEVELS AND VERTICAL COORDINATE 106 107 REAL H0bis(KLON, KLEV) ! Characteristic Height of the atmosphere 108 REAL H0 ! Characteristic Height of the atmosphere 109 REAL PR, TR ! Reference Pressure and Temperature 110 111 REAL ZH(KLON, KLEV + 1) ! Log-pressure altitude (constant H0) 112 REAL ZHbis(KLON, KLEV + 1) ! Log-pressure altitude (varying H) 113 114 REAL UH(KLON, KLEV + 1), VH(KLON, KLEV + 1) ! Winds at 1/2 levels 115 REAL PH(KLON, KLEV + 1) ! Pressure at 1/2 levels 116 REAL PSEC ! Security to avoid division by 0 pressure 117 REAL BV(KLON, KLEV + 1) ! Brunt Vaisala freq. (BVF) at 1/2 levels 118 REAL BVSEC ! Security to avoid negative BVF 111 REAL, parameter:: xlaunch = 0.4 ! Control the launching altitude 112 REAL, parameter:: zmaxth_top = 8000. ! Top of convective layer (approx.) 113 114 115 REAL PREC(ngrid) 116 REAL PRMAX ! Maximum value of PREC, and for which our linear formula 117 118 119 ! 0.3.2 PARAMETERS OF WAVES DISSIPATIONS 120 REAL, parameter:: sat = 1. ! saturation parameter 121 REAL, parameter:: rdiss = 1. ! coefficient of dissipation 122 REAL, parameter:: zoisec = 1.e-6 ! security for intrinsic freguency 123 124 ! 0.3.3 Background flow at 1/2 levels and vertical coordinate 125 REAL H0bis(ngrid, nlayer) ! Characteristic Height of the atmosphere 126 REAL, save:: H0 ! Characteristic Height of the atmosphere 127 REAL, parameter:: pr = 250 ! Reference pressure [Pa] 128 REAL, parameter:: tr = 220. ! Reference temperature [K] 129 REAL ZH(ngrid, nlayer + 1) ! Log-pressure altitude (constant H0) 130 REAL ZHbis(ngrid, nlayer + 1) ! Log-pressure altitude (varying H) 131 REAL UH(ngrid, nlayer + 1) ! zonal wind at 1/2 levels 132 REAL VH(ngrid, nlayer + 1) ! meridional wind at 1/2 levels 133 REAL PH(ngrid, nlayer + 1) ! Pressure at 1/2 levels 134 REAL, parameter:: psec = 1.e-6 ! Security to avoid division by 0 pressure 135 REAL BV(ngrid, nlayer + 1) ! Brunt Vaisala freq. (BVF) at 1/2 levels 136 REAL, parameter:: bvsec = 1.e-5 ! Security to avoid negative BV 137 REAL HREF(nlayer + 1) ! Reference altitude for launching alt. 138 119 139 120 140 ! COSMETICS TO DIAGNOSE EACH WAVES CONTRIBUTION. … … 125 145 integer ieq 126 146 127 ! ON CONSERVE LA MEMOIRE un certain temps AVEC UN SAVE 128 real,save,allocatable :: d_u_sav(:,:),d_v_sav(:,:) 147 REAL RAN_NUM_1,RAN_NUM_2,RAN_NUM_3 148 149 129 150 LOGICAL,SAVE :: firstcall = .true. 130 151 131 ! REAL ALEAS132 ! EXTERNAL ALEAS133 152 134 153 !----------------------------------------------------------------- 135 154 ! 1. INITIALISATIONS 136 155 137 156 IF (firstcall) THEN 138 157 write(*,*) "nonoro_gwd_ran: FLott non-oro GW scheme is active!" 139 allocate(d_u_sav(NLON,NLEV),d_v_sav(NLON,NLEV)) 140 d_u_sav(:,:) = 0. 141 d_v_sav(:,:) = 0. 142 RUWMAX=1.E-4 143 CALL getin_p("nonoro_gwd_RUWMAX",RUWMAX) 144 write(*,*) "nonoro_gwd_ran: RUWMAX=",RUWMAX 145 firstcall=.false. 146 ENDIF 158 epflux_max = 7.E-7 ! Mars' value !! 159 call getin_p("nonoro_gwd_epflux_max", epflux_max) 160 write(*,*) "nonoro_gwd_ran: epflux_max=", epflux_max 161 ! Characteristic vertical scale height 162 H0 = r * tr / g 163 ! Control 164 if (deltat .LT. dtime) THEN 165 call abort_physic("nonoro_gwd_ran","gwd random: deltat lower than dtime!",1) 166 endif 167 if (nlayer .LT. nw) THEN 168 call abort_physic("nonoro_gwd_ran","gwd random: nlayer lower than nw!",1) 169 endif 170 firstcall = .false. 171 ENDIF 172 173 gwd_convective_source=.false. 147 174 148 175 ! Compute current values of temperature and winds … … 150 177 uu(:,:)=pu(:,:)+dtime*pdu(:,:) 151 178 vv(:,:)=pv(:,:)+dtime*pdv(:,:) 152 153 ! 1.1 Basic parameter 154 155 ! PARAMETERS CORRESPONDING TO V3: 156 ! RUWMAX = 1.e-4 ! best-case for MCS comparison 157 ! RUWMAX = 5.e-6 158 ! RUWMAX = 1.e-3 159 160 ! SAT = 0.25 ! Saturation parameter: Sc in (12) 161 SAT = 1. ! GG: This is the bestcase value for MCS comparison, 162 ! ! but runs for 1 full MY in the thermosphere are instables. 163 !!! TESTS 164 ! SAT = 0.85 165 ! 166 ! RDISS = 40 ! Diffusion parameter 167 RDISS = 1 168 ! RDISS = 0.5 169 170 DELTAT=24.*3600. ! Time scale of the waves (first introduced in 9b) 171 ! DELTAT=DTIME 172 173 KMIN = 2.E-5 ! Min horizontal wavenumber 174 KMAX = 7.E-4 ! Max horizontal wavenumber 175 176 !Online output: one value only 177 if (output) then 178 KMIN = 6.3E-5 179 KMAX = 6.3E-5 180 endif 181 CMIN = 1. ! Min phase velocity 182 ! CMAX = 10. ! Max phase speed velocity 183 CMAX = 30. 184 ! CMAX = 60. 185 XLAUNCH=0.4 ! Parameter that control launching altitude P/Ps 186 !!! TEST: launching GW near the ground 187 ! XLAUNCH =0.8 188 189 ! MARS above typical convective cell at 250 Pa 190 PR = 250. ! Reference pressure [Pa] ! 191 TR = 220. ! Reference Temperature [K] ! 192 193 ZMAXTH_TOP = 8000. ! Reference max altitude of convective layer [m] 194 195 H0 = r * TR / g ! Characteristic vertical scale height 196 197 BVSEC = 1.E-5 ! Security to avoid negative BVF 198 PSEC = 1.E-6 ! Security to avoid division by 0 pressure 199 ZOISEC = 1.E-6 ! Security FOR 0 INTRINSIC FREQ 200 201 IF(DELTAT.LT.DTIME)THEN 202 PRINT *,'GWD RANDO: DELTAT LT DTIME!' 203 STOP 204 ENDIF 205 206 207 IF (NLEV < NW) THEN 208 PRINT *, 'YOU WILL HAVE PROBLEM WITH RANDOM NUMBERS' 209 PRINT *, 'FLOTT GWD STOP' 210 STOP 1 211 ENDIF 179 180 212 181 213 182 ! 2. EVALUATION OF THE BACKGROUND FLOW AT SEMI-LEVELS … … 218 187 219 188 ! Pressure and Inv of pressure, Temperature / at 1/2 level 220 DO LL = 2, KLEV189 DO LL = 2, nlayer 221 190 PH(:, LL) = EXP((LOG(PP(:, LL)) + LOG(PP(:, LL - 1))) / 2.) 222 191 end DO 223 192 224 PH(:, KLEV+ 1) = 0.193 PH(:, nlayer + 1) = 0. 225 194 PH(:, 1) = 2. * PP(:, 1) - PH(:, 2) 226 195 227 196 ! Launching altitude 228 197 229 DO LL = 1, NLEV 230 IF (PH(NLON / 2, LL) / PH(NLON / 2, 1) > XLAUNCH) LAUNCH = LL 231 ! IF (plevmoy(LL) / plevmoy(1) > XLAUNCH) LAUNCH = LL ! on venus 198 !Pour revenir a la version non reproductible en changeant le nombre de 199 !process 200 ! Reprend la formule qui calcule PH en fonction de PP=play 201 DO LL = 2, nlayer 202 HREF(LL) = EXP((LOG(presnivs(LL))+ LOG(presnivs(LL - 1))) / 2.) 203 end DO 204 HREF(nlayer + 1) = 0. 205 HREF(1) = 2. * presnivs(1) - HREF(2) 206 207 LAUNCH=0 208 DO LL = 1, nlayer 209 IF (HREF(LL) / HREF(1) > XLAUNCH) LAUNCH = LL 232 210 ENDDO 233 211 234 212 if (output) print*, " WE ARE IN FLOTT GW SCHEME " 235 213 236 !print*, "launch=",LAUNCH237 !print*,"launch p =",PH(NLON/2, LAUNCH)238 239 214 ! Log pressure vert. coordinate 240 DO LL = 1, KLEV+ 1215 DO LL = 1, nlayer + 1 241 216 ZH(:, LL) = H0 * LOG(PR / (PH(:, LL) + PSEC)) 242 ! print*,'ZH at each level',LL, ZH(NLON/2, LL)243 217 end DO 244 218 … … 246 220 ! altitude above surface 247 221 ZHbis(:,1) = 0. 248 DO LL = 2, KLEV+ 1222 DO LL = 2, nlayer + 1 249 223 H0bis(:, LL-1) = r * TT(:, LL-1) / g 250 224 ZHbis(:, LL) = ZHbis(:, LL-1) & … … 254 228 255 229 ! Winds and BV frequency 256 DO LL = 2, KLEV230 DO LL = 2, nlayer 257 231 UH(:, LL) = 0.5 * (UU(:, LL) + UU(:, LL - 1)) ! Zonal wind 258 232 VH(:, LL) = 0.5 * (VV(:, LL) + VV(:, LL - 1)) ! Meridional wind 259 233 ! GG test 260 !print*, 'TT, UH, VH, ZH at launch', TT( NLON/2,LAUNCH), UH(NLON/2,LAUNCH),VH(NLON/2, LAUNCH), ZH(NLON/2,LAUNCH)234 !print*, 'TT, UH, VH, ZH at launch', TT(ngrid/2,LAUNCH), UH(ngrid/2,LAUNCH),VH(ngrid/2, LAUNCH), ZH(ngrid/2,LAUNCH) 261 235 ! BVSEC: BV Frequency 262 236 BV(:, LL) = 0.5 * (TT(:, LL) + TT(:, LL - 1)) & … … 266 240 end DO 267 241 !GG test 268 !print*, 'BV freq in flott_gwnoro:',LAUNCH, BV( NLON/2, LAUNCH)242 !print*, 'BV freq in flott_gwnoro:',LAUNCH, BV(ngrid/2, LAUNCH) 269 243 270 244 BV(:, 1) = BV(:, 2) 271 245 UH(:, 1) = 0. 272 246 VH(:, 1) = 0. 273 BV(:, KLEV + 1) = BV(:, KLEV)274 UH(:, KLEV + 1) = UU(:, KLEV)275 VH(:, KLEV + 1) = VV(:, KLEV)247 BV(:, nlayer + 1) = BV(:, nlayer) 248 UH(:, nlayer + 1) = UU(:, nlayer) 249 VH(:, nlayer + 1) = VV(:, nlayer) 276 250 277 251 … … 283 257 ! in a stochastic way 284 258 285 !! A REVOIR: 286 !! - utilisation de MOD ou bien de aleas ? 287 !! - distribution gaussienne des CPHA ? (avec signe ZP qui est ajuste apres) 288 289 JW = 0 290 DO JP = 1, NP 291 DO JK = 1, NK 292 DO JO = 1, NO 293 JW = JW + 1 259 DO JW = 1, NW 294 260 ! Angle 295 ZP(JW) = 2. * pi * REAL(JP - 1) / REAL(NP) 296 DO II = 1, KLON 261 DO II = 1, ngrid 262 ! Angle (0 or PI so far) 263 RAN_NUM_1=MOD(TT(II, JW) * 10., 1.) 264 RAN_NUM_2= MOD(TT(II, JW) * 100., 1.) 265 ZP(JW, II) = (SIGN(1., 0.5 - RAN_NUM_1) + 1.) & 266 * PI / 2. 297 267 ! Horizontal wavenumber amplitude 298 ! ZK(JW, II) = KMIN + (KMAX - KMIN) * MOD(TT(II, JW) * 100., 1.) 299 ZK(JW, II) = KMIN + (KMAX - KMIN) * ALEAS(0.) 268 ZK(JW, II) = KMIN + (KMAX - KMIN) *RAN_NUM_2 300 269 ! Horizontal phase speed 301 ! CPHA = CMIN + (CMAX - CMIN) * MOD(TT(II, JW)**2, 1.) 302 CPHA = CMIN + (CMAX - CMIN) * ALEAS(0.) 270 CPHA = 0. 271 DO JJ = 1, NA 272 RAN_NUM_3=MOD(TT(II, JW+3*JJ)**2, 1.) 273 CPHA = CPHA + & 274 CMAX*2.*(RAN_NUM_3 -0.5)*SQRT(3.)/SQRT(NA*1.) 275 END DO 276 IF (CPHA.LT.0.) THEN 277 CPHA = -1.*CPHA 278 ZP(JW,II) = ZP(JW,II) + PI 279 ENDIF 303 280 !Online output: linear 304 281 if (output) CPHA = CMIN + (CMAX - CMIN) * (JO-1)/(NO-1) … … 307 284 ! Intrinsic frequency is imposed 308 285 ZO(JW, II) = ZO(JW, II) & 309 + ZK(JW, II) * COS(ZP(JW )) * UH(II, LAUNCH) &310 + ZK(JW, II) * SIN(ZP(JW )) * VH(II, LAUNCH)286 + ZK(JW, II) * COS(ZP(JW, II)) * UH(II, LAUNCH) & 287 + ZK(JW, II) * SIN(ZP(JW, II)) * VH(II, LAUNCH) 311 288 ! Momentum flux at launch lev 312 !! 313 !!! CHANGE on MARS GCM: variable EP-FLUX according to: 314 ! TEST1: PBL diurnal variation 315 !! 316 ! RUW0(JW, II) = MAX(RUWMAX / 100., & 317 ! zmax_therm(II)/ZMAXTH_TOP * RUWMAX) 318 319 !!! BELOW: previous version from Flott original version 320 RUW0(JW, II) = RUWMAX & 321 * ALEAS(0.) ! & 322 !!! The factor cos**8:Limit the fluxes to tropical regions 323 ! * COS(pi/180.*latitude(II))**8 289 ! epflux_0(JW, II) = epflux_max / REAL(NW) & 290 epflux_0(JW, II) = epflux_max & 291 * MOD(100. * (UU(II, JW)**2 + VV(II, JW)**2), 1.) 324 292 !Online output: fixed to max 325 if (output) RUW0(JW, II) = RUWMAX293 if (output) epflux_0(JW, II) = epflux_max 326 294 ENDDO 327 end DO 328 end DO 329 end DO 295 end DO 330 296 331 297 ! 4. COMPUTE THE FLUXES … … 336 302 ! 337 303 DO JW = 1, NW 338 339 304 ! Evaluate intrinsic frequency at launching altitude: 340 ZOP(JW, :) = ZO(JW, :) & 341 - ZK(JW, :) * COS(ZP(JW)) * UH(:, LAUNCH) & 342 - ZK(JW, :) * SIN(ZP(JW)) * VH(:, LAUNCH) 305 intr_freq_p(JW, :) = ZO(JW, :) & 306 - ZK(JW, :) * COS(ZP(JW, :)) * UH(:, LAUNCH) & 307 - ZK(JW, :) * SIN(ZP(JW, :)) * VH(:, LAUNCH) 308 end DO 309 310 IF (gwd_convective_source) THEN 311 DO JW = 1, NW 312 ! VERSION WITH CONVECTIVE SOURCE (designed for Earth) 313 314 ! Vertical velocity at launch level, value to ensure the 315 ! imposed mmt flux factor related to the convective forcing: 316 ! precipitations. 317 318 ! tanh limitation to values above prmax: 319 ! WWP(JW, :) = epflux_0(JW, :) & 320 ! * (r / cpp / H0 * RLVTT * PRMAX * TANH(PREC(:) / PRMAX))**2 321 ! Here, we neglected the kinetic energy providing of the thermodynamic 322 ! phase change 323 324 ! 325 326 ! Factor related to the characteristics of the waves: 327 WWP(JW, :) = WWP(JW, :) * ZK(JW, :)**3 / KMIN / BVLOW(:) & 328 / MAX(ABS(intr_freq_p(JW, :)), ZOISEC)**3 329 330 ! Moderation by the depth of the source (dz here): 331 WWP(JW, :) = WWP(JW, :) & 332 * EXP(- BVLOW(:)**2 / MAX(ABS(intr_freq_p(JW, :)), ZOISEC)**2 & 333 * ZK(JW, :)**2 * DZ**2) 334 335 ! Put the stress in the right direction: 336 u_epflux_p(JW, :) = intr_freq_p(JW, :) / MAX(ABS(intr_freq_p(JW, :)), ZOISEC)**2 & 337 * BV(:, LAUNCH) * COS(ZP(JW, :)) * WWP(JW, :)**2 338 v_epflux_p(JW, :) = intr_freq_p(JW, :) / MAX(ABS(intr_freq_p(JW, :)), ZOISEC)**2 & 339 * BV(:, LAUNCH) * SIN(ZP(JW, :)) * WWP(JW, :)**2 340 end DO 341 ELSE ! VERSION WITHOUT CONVECTIVE SOURCE 343 342 ! Vertical velocity at launch level, value to ensure the imposed 344 343 ! mom flux: 345 WWP(JW, :) = SQRT(ABS(ZOP(JW, :)) / MAX(BV(:, LAUNCH),BVSEC) & 346 * RUW0(JW,:)) 347 RUWP(JW, :) = COS(ZP(JW)) * SIGN(1., ZOP(JW, :)) * RUW0(JW, :) 348 RVWP(JW, :) = SIN(ZP(JW)) * SIGN(1., ZOP(JW, :)) * RUW0(JW, :) 349 350 end DO 351 352 !!! EARTH VERSION !!!! 353 ! 4.2 Uniform values below the launching altitude 354 355 DO LL = 1, LAUNCH 356 RUW(:, LL) = 0 357 RVW(:, LL) = 0 358 DO JW = 1, NW 359 RUW(:, LL) = RUW(:, LL) + RUWP(JW, :) 360 RVW(:, LL) = RVW(:, LL) + RVWP(JW, :) 361 end DO 362 end DO 363 364 !!! VENUS VERSION !!!! 344 DO JW = 1, NW 345 ! WW is directly a flux, here, not vertical velocity anymore 346 WWP(JW, :) = epflux_0(JW,:) 347 u_epflux_p(JW, :) = COS(ZP(JW, :)) * SIGN(1., intr_freq_p(JW, :)) * epflux_0(JW, :) 348 v_epflux_p(JW, :) = SIN(ZP(JW, :)) * SIGN(1., intr_freq_p(JW, :)) * epflux_0(JW, :) 349 350 end DO 351 ENDIF 365 352 ! 4.2 Initial flux at launching altitude 366 353 367 !RUW(:, LAUNCH) = 0368 !RVW(:, LAUNCH) = 0369 !DO JW = 1, NW370 ! RUW(:, LAUNCH) = RUW(:, LAUNCH) + RUWP(JW, :)371 ! RVW(:, LAUNCH) = RVW(:, LAUNCH) + RVWP(JW, :)372 !end DO354 u_epflux_tot(:, LAUNCH) = 0 355 v_epflux_tot(:, LAUNCH) = 0 356 DO JW = 1, NW 357 u_epflux_tot(:, LAUNCH) = u_epflux_tot(:, LAUNCH) + u_epflux_p(JW, :) 358 v_epflux_tot(:, LAUNCH) = v_epflux_tot(:, LAUNCH) + v_epflux_p(JW, :) 359 end DO 373 360 374 361 ! 4.3 Loop over altitudes, with passage from one level to the … … 379 366 !Online output 380 367 if (output) then 381 ieq=n lon/2+1368 ieq=ngrid/2+1 382 369 write(str2,'(i2)') NW+2 383 370 outform="("//str2//"(E12.4,1X))" 384 371 WRITE(11,outform) ZH(IEQ, 1) / 1000., ZHbis(IEQ, 1) / 1000., & 385 (ZO(JW, IEQ)/ZK(JW, IEQ)*COS(ZP(JW )), JW = 1, NW)372 (ZO(JW, IEQ)/ZK(JW, IEQ)*COS(ZP(JW, IEQ)), JW = 1, NW) 386 373 endif 387 374 388 DO LL = LAUNCH, KLEV- 1375 DO LL = LAUNCH, nlayer - 1 389 376 390 377 … … 392 379 ! TO THE NEXT) 393 380 DO JW = 1, NW 394 ZOM(JW, :) = ZOP(JW, :)381 intr_freq_m(JW, :) = intr_freq_p(JW, :) 395 382 WWM(JW, :) = WWP(JW, :) 396 383 ! Intrinsic Frequency 397 ZOP(JW, :) = ZO(JW, :) - ZK(JW, :) * COS(ZP(JW)) * UH(:, LL + 1) &398 - ZK(JW, :) * SIN(ZP(JW )) * VH(:, LL + 1)384 intr_freq_p(JW, :) = ZO(JW, :) - ZK(JW, :) * COS(ZP(JW,:)) * UH(:, LL + 1) & 385 - ZK(JW, :) * SIN(ZP(JW,:)) * VH(:, LL + 1) 399 386 400 387 WWP(JW, :) = MIN( & 401 388 ! No breaking (Eq.6) 402 389 WWM(JW, :) & 403 * SQRT(BV(:, LL ) / BV(:, LL+1) &404 * ABS(ZOP(JW, :)) / MAX(ABS(ZOM(JW, :)), ZOISEC)) &405 390 ! Dissipation (Eq. 8): 406 391 * EXP(- RDISS * PR / (PH(:, LL + 1) + PH(:, LL)) & 407 392 * ((BV(:, LL + 1) + BV(:, LL)) / 2.)**3 & 408 / MAX(ABS( ZOP(JW, :) + ZOM(JW, :)) / 2., ZOISEC)**4 &393 / MAX(ABS(intr_freq_p(JW, :) + intr_freq_m(JW, :)) / 2., ZOISEC)**4 & 409 394 * ZK(JW, :)**3 * (ZH(:, LL + 1) - ZH(:, LL))), & 410 395 ! Critical levels (forced to zero if intrinsic frequency changes sign) 411 MAX(0., SIGN(1., ZOP(JW, :) * ZOM(JW, :))) &396 MAX(0., SIGN(1., intr_freq_p(JW, :) * intr_freq_m(JW, :))) & 412 397 ! Saturation (Eq. 12) 413 * ABS( ZOP(JW, :))**3 /BV(:, LL+1) &398 * ABS(intr_freq_p(JW, :))**3 /BV(:, LL+1) & 414 399 * EXP(-ZH(:, LL + 1)/H0) * SAT**2*KMIN**2/ZK(JW, :)**4) 415 400 end DO … … 419 404 ! Give the right orientation to the stress 420 405 DO JW = 1, NW 421 RUWP(JW, :) = ZOP(JW, :)/MAX(ABS(ZOP(JW, :)), ZOISEC)**2 & 422 *BV(:,LL+1)& 423 * COS(ZP(JW)) * WWP(JW, :)**2 424 RVWP(JW, :) = ZOP(JW, :)/MAX(ABS(ZOP(JW, :)), ZOISEC)**2 & 425 *BV(:,LL+1)& 426 * SIN(ZP(JW)) * WWP(JW, :)**2 406 u_epflux_p(JW, :) = SIGN(1.,intr_freq_p(JW, :)) * COS(ZP(JW, :)) * WWP(JW, :) 407 v_epflux_p(JW, :) = SIGN(1.,intr_freq_p(JW, :)) * SIN(ZP(JW, :)) * WWP(JW, :) 427 408 end DO 428 409 429 ! 430 RUW(:, LL + 1) = 0. 431 RVW(:, LL + 1) = 0. 410 u_epflux_tot(:, LL + 1) = 0. 411 v_epflux_tot(:, LL + 1) = 0. 432 412 433 413 DO JW = 1, NW 434 RUW(:, LL + 1) = RUW(:, LL + 1) + RUWP(JW, :) 435 RVW(:, LL + 1) = RVW(:, LL + 1) + RVWP(JW, :) 414 u_epflux_tot(:, LL + 1) = u_epflux_tot(:, LL + 1) + u_epflux_p(JW, :) 415 v_epflux_tot(:, LL + 1) = v_epflux_tot(:, LL + 1) + v_epflux_p(JW, :) 416 EAST_GWSTRESS(:, LL)=EAST_GWSTRESS(:, LL)+MAX(0.,u_epflux_p(JW,:))/FLOAT(NW) 417 WEST_GWSTRESS(:, LL)=WEST_GWSTRESS(:, LL)+MIN(0.,u_epflux_p(JW,:))/FLOAT(NW) 436 418 end DO 437 419 !Online output 438 420 if (output) then 439 421 do JW=1,NW 440 if( RUWP(JW, IEQ).gt.0.) then441 RUWP(JW, IEQ) = max(RUWP(JW, IEQ), 1.e-99)422 if(u_epflux_p(JW, IEQ).gt.0.) then 423 u_epflux_p(JW, IEQ) = max(u_epflux_p(JW, IEQ), 1.e-99) 442 424 else 443 RUWP(JW, IEQ) = min(RUWP(JW, IEQ), -1.e-99)425 u_epflux_p(JW, IEQ) = min(u_epflux_p(JW, IEQ), -1.e-99) 444 426 endif 445 427 enddo 446 428 WRITE(11,outform) ZH(IEQ, LL+1) / 1000., & 447 429 ZHbis(IEQ, LL+1) / 1000., & 448 ( RUWP(JW, IEQ), JW = 1, NW)430 (u_epflux_p(JW, IEQ), JW = 1, NW) 449 431 endif 450 432 … … 456 438 ! 5.1 Rectification des flux au sommet et dans les basses couches: 457 439 458 RUW(:, KLEV + 1) = 0. 459 RVW(:, KLEV + 1) = 0. 460 RUW(:, 1) = RUW(:, LAUNCH) 461 RVW(:, 1) = RVW(:, LAUNCH) 462 DO LL = 2, LAUNCH 463 RUW(:, LL) = RUW(:, LL - 1) + (RUW(:, LAUNCH + 1) - RUW(:, 1)) * & 464 (PH(:, LL) - PH(:, LL - 1)) / (PH(:, LAUNCH + 1) - PH(:, 1)) 465 RVW(:, LL) = RVW(:, LL - 1) + (RVW(:, LAUNCH + 1) - RVW(:, 1)) * & 466 (PH(:, LL) - PH(:, LL - 1)) / (PH(:, LAUNCH + 1) - PH(:, 1)) 467 end DO 468 469 ! AR-1 RECURSIVE FORMULA (13) IN VERSION 4 470 DO LL = 1, KLEV 471 d_u(:, LL) = G * (RUW(:, LL + 1) - RUW(:, LL)) & 440 ! Attention, ici c'est le total sur toutes les ondes... 441 442 u_epflux_tot(:, nlayer + 1) = 0. 443 v_epflux_tot(:, nlayer + 1) = 0. 444 445 ! Here, big change compared to FLott version: 446 ! We compensate (u_epflux_tot(:, LAUNCH), ie total emitted upward flux 447 ! over the layers max(1,LAUNCH-3) to LAUNCH-1 448 DO LL = 1, max(1,LAUNCH-3) 449 u_epflux_tot(:, LL) = 0. 450 v_epflux_tot(:, LL) = 0. 451 end DO 452 DO LL = max(2,LAUNCH-2), LAUNCH-1 453 u_epflux_tot(:, LL) = u_epflux_tot(:, LL - 1) + u_epflux_tot(:, LAUNCH) * & 454 (PH(:,LL)-PH(:,LL-1)) / (PH(:,LAUNCH)-PH(:,max(1,LAUNCH-3))) 455 v_epflux_tot(:, LL) = v_epflux_tot(:, LL - 1) + v_epflux_tot(:, LAUNCH) * & 456 (PH(:,LL)-PH(:,LL-1)) / (PH(:,LAUNCH)-PH(:,max(1,LAUNCH-3))) 457 EAST_GWSTRESS(:,LL) = EAST_GWSTRESS(:, LL - 1) + & 458 EAST_GWSTRESS(:, LAUNCH) * (PH(:,LL)-PH(:,LL-1))/ & 459 (PH(:,LAUNCH)-PH(:,max(1,LAUNCH-3))) 460 WEST_GWSTRESS(:,LL) = WEST_GWSTRESS(:, LL - 1) + & 461 WEST_GWSTRESS(:, LAUNCH) * (PH(:,LL)-PH(:,LL-1))/ & 462 (PH(:,LAUNCH)-PH(:,max(1,LAUNCH-3))) 463 end DO 464 ! This way, the total flux from GW is zero, but there is a net transport 465 ! (upward) that should be compensated by circulation 466 ! and induce additional friction at the surface 467 468 !Online output 469 if (output) then 470 DO LL = 1, nlayer - 1 471 WRITE(11,*) ZHbis(IEQ, LL)/1000.,u_epflux_tot(IEQ,LL) 472 end DO 473 CLOSE(11) 474 stop 475 endif 476 477 478 ! 5.2 AR-1 RECURSIVE FORMULA (13) IN VERSION 4 479 !--------------------------------------------- 480 DO LL = 1, nlayer 481 d_u(:, LL) = G * (u_epflux_tot(:, LL + 1) - u_epflux_tot(:, LL)) & 472 482 / (PH(:, LL + 1) - PH(:, LL)) * DTIME 473 d_v(:, LL) = G * ( RVW(:, LL + 1) - RVW(:, LL)) &483 d_v(:, LL) = G * (v_epflux_tot(:, LL + 1) - v_epflux_tot(:, LL)) & 474 484 / (PH(:, LL + 1) - PH(:, LL)) * DTIME 475 485 ENDDO 476 486 d_t(:,:) = 0. 477 ! ON CONSERVE LA MEMOIRE un certain temps AVEC UN SAVE 478 d_u(:,:) = DTIME/DELTAT/REAL(NW) * d_u(:,:) + (1.-DTIME/DELTAT) * d_u_sav(:,:) 479 d_v(:,:) = DTIME/DELTAT/REAL(NW) * d_v(:,:) + (1.-DTIME/DELTAT) * d_v_sav(:,:) 480 d_u_sav(:,:) = d_u(:,:) 481 d_v_sav(:,:) = d_v(:,:) 487 488 ! 5.3 Update tendency of wind with the previous (and saved) values 489 !----------------------------------------------------------------- 490 d_u(:,:) = DTIME/DELTAT/REAL(NW) * d_u(:,:) & 491 + (1.-DTIME/DELTAT) * du_nonoro_gwd(:,:) 492 d_v(:,:) = DTIME/DELTAT/REAL(NW) * d_v(:,:) & 493 + (1.-DTIME/DELTAT) * dv_nonoro_gwd(:,:) 494 du_nonoro_gwd(:,:) = d_u(:,:) 495 dv_nonoro_gwd(:,:) = d_v(:,:) 482 496 483 497 ! Cosmetic: evaluation of the cumulated stress … … 485 499 ZUSTR(:) = 0. 486 500 ZVSTR(:) = 0. 487 DO LL = 1, KLEV501 DO LL = 1, nlayer 488 502 ZUSTR(:) = ZUSTR(:) + D_U(:, LL) / g * (PH(:, LL + 1) - PH(:, LL)) 489 503 ZVSTR(:) = ZVSTR(:) + D_V(:, LL) / g * (PH(:, LL + 1) - PH(:, LL)) … … 492 506 END SUBROUTINE NONORO_GWD_RAN 493 507 494 ! ===================================================================495 ! ===================================================================496 ! ===================================================================497 !=================================================================== 498 499 REAL FUNCTION ALEAS (R) 508 ! =================================================================== 509 ! Subroutines used to write variables of memory in start files 510 ! =================================================================== 511 512 SUBROUTINE ini_nonoro_gwd_ran(ngrid,nlayer) 513 500 514 IMPLICIT NONE 501 !***BEGIN PROLOGUE ALEAS 502 !***PURPOSE Generate a uniformly distributed random number. 503 !***LIBRARY SLATEC (FNLIB) 504 !***CATEGORY L6A21 505 !***TYPE SINGLE PRECISION (ALEAS-S) 506 !***KEYWORDS FNLIB, ALEAS NUMBER, SPECIAL FUNCTIONS, UNIFORM 507 !***AUTHOR Fullerton, W., (LANL) 508 !***DESCRIPTION 509 ! 510 ! This pseudo-random number generator is portable among a wide 511 ! variety of computers. RAND(R) undoubtedly is not as good as many 512 ! readily available installation dependent versions, and so this 513 ! routine is not recommended for widespread usage. Its redeeming 514 ! feature is that the exact same random numbers (to within final round- 515 ! off error) can be generated from machine to machine. Thus, programs 516 ! that make use of random numbers can be easily transported to and 517 ! checked in a new environment. 518 ! 519 ! The random numbers are generated by the linear congruential 520 ! method described, e.g., by Knuth in Seminumerical Methods (p.9), 521 ! Addison-Wesley, 1969. Given the I-th number of a pseudo-random 522 ! sequence, the I+1 -st number is generated from 523 ! X(I+1) = (A*X(I) + C) MOD M, 524 ! where here M = 2**22 = 4194304, C = 1731 and several suitable values 525 ! of the multiplier A are discussed below. Both the multiplier A and 526 ! random number X are represented in double precision as two 11-bit 527 ! words. The constants are chosen so that the period is the maximum 528 ! possible, 4194304. 529 ! 530 ! In order that the same numbers be generated from machine to 531 ! machine, it is necessary that 23-bit integers be reducible modulo 532 ! 2**11 exactly, that 23-bit integers be added exactly, and that 11-bit 533 ! integers be multiplied exactly. Furthermore, if the restart option 534 ! is used (where R is between 0 and 1), then the product R*2**22 = 535 ! R*4194304 must be correct to the nearest integer. 536 ! 537 ! The first four random numbers should be .0004127026, 538 ! .6750836372, .1614754200, and .9086198807. The tenth random number 539 ! is .5527787209, and the hundredth is .3600893021 . The thousandth 540 ! number should be .2176990509 . 541 ! 542 ! In order to generate several effectively independent sequences 543 ! with the same generator, it is necessary to know the random number 544 ! for several widely spaced calls. The I-th random number times 2**22, 545 ! where I=K*P/8 and P is the period of the sequence (P = 2**22), is 546 ! still of the form L*P/8. In particular we find the I-th random 547 ! number multiplied by 2**22 is given by 548 ! I = 0 1*P/8 2*P/8 3*P/8 4*P/8 5*P/8 6*P/8 7*P/8 8*P/8 549 ! RAND= 0 5*P/8 2*P/8 7*P/8 4*P/8 1*P/8 6*P/8 3*P/8 0 550 ! Thus the 4*P/8 = 2097152 random number is 2097152/2**22. 551 ! 552 ! Several multipliers have been subjected to the spectral test 553 ! (see Knuth, p. 82). Four suitable multipliers roughly in order of 554 ! goodness according to the spectral test are 555 ! 3146757 = 1536*2048 + 1029 = 2**21 + 2**20 + 2**10 + 5 556 ! 2098181 = 1024*2048 + 1029 = 2**21 + 2**10 + 5 557 ! 3146245 = 1536*2048 + 517 = 2**21 + 2**20 + 2**9 + 5 558 ! 2776669 = 1355*2048 + 1629 = 5**9 + 7**7 + 1 559 ! 560 ! In the table below LOG10(NU(I)) gives roughly the number of 561 ! random decimal digits in the random numbers considered I at a time. 562 ! C is the primary measure of goodness. In both cases bigger is better. 563 ! 564 ! LOG10 NU(I) C(I) 565 ! A I=2 I=3 I=4 I=5 I=2 I=3 I=4 I=5 566 ! 567 ! 3146757 3.3 2.0 1.6 1.3 3.1 1.3 4.6 2.6 568 ! 2098181 3.3 2.0 1.6 1.2 3.2 1.3 4.6 1.7 569 ! 3146245 3.3 2.2 1.5 1.1 3.2 4.2 1.1 0.4 570 ! 2776669 3.3 2.1 1.6 1.3 2.5 2.0 1.9 2.6 571 ! Best 572 ! Possible 3.3 2.3 1.7 1.4 3.6 5.9 9.7 14.9 573 ! 574 ! Input Argument -- 575 ! R If R=0., the next random number of the sequence is generated. 576 ! If R .LT. 0., the last generated number will be returned for 577 ! possible use in a restart procedure. 578 ! If R .GT. 0., the sequence of random numbers will start with 579 ! the seed R mod 1. This seed is also returned as the value of 580 ! RAND provided the arithmetic is done exactly. 581 ! 582 ! Output Value -- 583 ! RAND a pseudo-random number between 0. and 1. 584 ! 585 !***REFERENCES (NONE) 586 !***ROUTINES CALLED (NONE) 587 !***REVISION HISTORY (YYMMDD) 588 ! 770401 DATE WRITTEN 589 ! 890531 Changed all specific intrinsics to generic. (WRB) 590 ! 890531 REVISION DATE from Version 3.2 591 ! 891214 Prologue converted to Version 4.0 format. (BAB) 592 !***END PROLOGUE RAND 593 INTEGER IA1, IA0, IA1MA0, IC, IX1, IX0 594 SAVE IA1, IA0, IA1MA0, IC, IX1, IX0 595 DATA IA1, IA0, IA1MA0 /1536, 1029, 507/ 596 DATA IC /1731/ 597 DATA IX1, IX0 /0, 0/ 598 REAL R 599 INTEGER IY0,IY1 600 !***FIRST EXECUTABLE STATEMENT RAND 601 ! 602 ! A*X = 2**22*IA1*IX1 + 2**11*(IA1*IX1 + (IA1-IA0)*(IX0-IX1) 603 ! + IA0*IX0) + IA0*IX0 604 ! 605 IF (R.EQ.0.) THEN 606 IY0 = IA0*IX0 607 IY1 = IA1*IX1 + IA1MA0*(IX0-IX1) + IY0 608 IY0 = IY0 + IC 609 IX0 = MOD (IY0, 2048) 610 IY1 = IY1 + (IY0-IX0)/2048 611 IX1 = MOD (IY1, 2048) 612 ENDIF 613 614 IF (R.GT.0.) THEN 615 IX1 = MOD(R,1.)*4194304. + 0.5 616 IX0 = MOD (IX1, 2048) 617 IX1 = (IX1-IX0)/2048 618 ENDIF 619 620 ALEAS = IX1*2048 + IX0 621 ALEAS = ALEAS / 4194304. 622 RETURN 623 624 END FUNCTION ALEAS 515 516 INTEGER, INTENT (in) :: ngrid ! number of atmospheric columns 517 INTEGER, INTENT (in) :: nlayer ! number of atmospheric layers 518 519 allocate(du_nonoro_gwd(ngrid,nlayer)) 520 allocate(dv_nonoro_gwd(ngrid,nlayer)) 521 522 END SUBROUTINE ini_nonoro_gwd_ran 523 ! ---------------------------------- 524 SUBROUTINE end_nonoro_gwd_ran 525 526 IMPLICIT NONE 527 528 if (allocated(du_nonoro_gwd)) deallocate(du_nonoro_gwd) 529 if (allocated(dv_nonoro_gwd)) deallocate(dv_nonoro_gwd) 530 531 END SUBROUTINE end_nonoro_gwd_ran 625 532 626 533 END MODULE nonoro_gwd_ran_mod
Note: See TracChangeset
for help on using the changeset viewer.