- Timestamp:
- Jan 22, 2020, 11:41:33 AM (5 years ago)
- Location:
- trunk/LMDZ.MARS
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.MARS/README
r2218 r2220 2807 2807 Add the observer simulator program simu_MCS_temp.F90 to the LMDZ.MARS/util/ directory, as well as a simu_MCS_temp.def. This program reads a MCS file (binned by Luca Montabone), extracts the daytime and nighttime temperatures from a GCM simulation file, and outputs a netcdf file in the same format as the MCS file. 2808 2808 More details in simu_MCS_temp.def and in the preface of simu_MCS_temp.F90. 2809 <<<<<<< .mine 2810 2811 == 22/01/2020 == DB (the return!) 2812 Update the nonorographic gravity waves drag parametrization (from the r3599 of Earth s model LMDZ6): 1) add east_ and west_gwdstress variables, 2) delete aleas function: random waves are producted by the MOD function, 3) reproductibility concerning the number of procs is now validated, 4) changing name of some variables like RUW, RVW, ZOP, ZOM,..., 5) tendency of winds due to GW drag are now module variables and written in restart files. 2813 2814 ======= 2809 2815 2810 2816 == 07/01/2020 == AD … … 2829 2835 Change "latentheat" flag to a more descriptive "latentheat_surfwater" and 2830 2836 set its default value to .true. 2837 >>>>>>> .r2219 -
trunk/LMDZ.MARS/libf/phymars/callkeys.h
r2218 r2220 15 15 & ,calltherm,callrichsl,callslope,tituscap,callyamada4,co2clouds & 16 16 & ,co2useh2o,meteo_flux,CLFvaryingCO2,spantCO2,CLFvarying & 17 <<<<<<< .mine 18 & ,satindexco2,rdstorm,slpwind,calllott_nonoro,latentheat & 19 & ,gwd_convective_source 20 ======= 17 21 & ,satindexco2,rdstorm,slpwind,calllott_nonoro & 18 22 & ,latentheat_surfwater 23 >>>>>>> .r2219 19 24 20 25 COMMON/callkeys_i/iradia,iaervar,iddist,ilwd,ilwb,ilwn,ncouche & … … 37 42 logical callg2d 38 43 logical linear 44 logical gwd_convective_source 39 45 40 46 real topdustref -
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 -
trunk/LMDZ.MARS/libf/phymars/phyetat0_mod.F90
r2079 r2220 17 17 inquire_dimension, inquire_dimension_length 18 18 use ioipsl_getincom, only : getin 19 19 use nonoro_gwd_ran_mod, only: du_nonoro_gwd, dv_nonoro_gwd 20 20 implicit none 21 21 … … 415 415 endif 416 416 417 ! Non-orographic gravity waves 418 call get_field("du_nonoro_gwd",du_nonoro_gwd,found,indextime) 419 if (.not.found) then 420 write(*,*) "phyetat0: <du_nonoro_gwd> not in file" 421 du_nonoro_gwd(:,:)=0. 422 else 423 write(*,*) "phyetat0: Memory of zonal wind tendency due to non-orographic GW" 424 write(*,*) " <du_nonoro_gwd> range:", & 425 minval(du_nonoro_gwd), maxval(du_nonoro_gwd) 426 endif 427 428 call get_field("dv_nonoro_gwd",dv_nonoro_gwd,found,indextime) 429 if (.not.found) then 430 write(*,*) "phyetat0: <dv_nonoro_gwd> not in file" 431 dv_nonoro_gwd(:,:)=0. 432 else 433 write(*,*) "phyetat0: Memory of meridional wind tendency due to non-orographic GW" 434 write(*,*) " <dv_nonoro_gwd> range:", & 435 minval(dv_nonoro_gwd), maxval(dv_nonoro_gwd) 436 endif 417 437 418 438 ! tracer on surface -
trunk/LMDZ.MARS/libf/phymars/phyredem.F90
r2079 r2220 24 24 use comcstfi_h, only: g, mugaz, omeg, rad, rcp 25 25 use time_phylmdz_mod, only: daysec 26 27 26 implicit none 28 27 … … 156 155 put_var, put_field 157 156 use tracer_mod, only: noms ! tracer names 157 use nonoro_gwd_ran_mod, only: du_nonoro_gwd, dv_nonoro_gwd 158 158 159 159 implicit none … … 263 263 call put_field("mem_Mh2o_co2","H2O mass integred into CO2 crystal",mem_Mh2o_co2,time) 264 264 endif 265 265 266 ! Non-orographic gavity waves 267 if (calllott_nonoro) then 268 call put_field("du_nonoro_gwd","Zonal wind tendency due to GW",du_nonoro_gwd,time) 269 call put_field("dv_nonoro_gwd","Meridional wind tendency due to GW",dv_nonoro_gwd,time) 270 endif 266 271 ! Close file 267 272 call close_restartphy -
trunk/LMDZ.MARS/libf/phymars/phys_state_var_init_mod.F90
r2199 r2220 54 54 use watercloud_mod, only: ini_watercloud_mod, & 55 55 end_watercloud_mod 56 use nonoro_gwd_ran_mod, only: ini_nonoro_gwd_ran, & 57 end_nonoro_gwd_ran 56 58 57 59 IMPLICIT NONE … … 135 137 call ini_watercloud_mod(ngrid,nlayer,nq) 136 138 139 ! allocate arrays in "nonoro_gwd_ran_mod" 140 call end_nonoro_gwd_ran 141 call ini_nonoro_gwd_ran(ngrid,nlayer) 142 143 137 144 END SUBROUTINE phys_state_var_init 138 145 -
trunk/LMDZ.MARS/libf/phymars/physiq_mod.F
r2214 r2220 430 430 REAL d_u_hin(ngrid,nlayer), d_v_hin(ngrid,nlayer) 431 431 REAL d_t_hin(ngrid,nlayer) 432 REAL east_gwstress(ngrid,nlayer) 433 REAL west_gwstress(ngrid,nlayer) 432 434 c Diagnostics 2D of gw_nonoro 433 435 REAL zustrhi(ngrid), zvstrhi(ngrid) 434 435 436 c Variables for PBL 436 437 REAL zz1(ngrid) … … 1381 1382 & pdt, pdu, pdv, 1382 1383 & zustrhi,zvstrhi, 1383 & d_t_hin, d_u_hin, d_v_hin) 1384 & d_t_hin, d_u_hin, d_v_hin, 1385 & east_gwstress, west_gwstress) 1384 1386 1385 1387 ! Update tendencies
Note: See TracChangeset
for help on using the changeset viewer.