Changeset 4657
- Timestamp:
- Aug 30, 2023, 6:24:49 PM (16 months ago)
- Location:
- LMDZ6/trunk/libf/phylmd
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmd/calltherm.F90
r4590 r4657 78 78 real fmc_therm(klon,klev+1),zqasc(klon,klev) 79 79 real zqla(klon,klev) 80 real zqta(klon,klev)81 80 real ztv(klon,klev),ztva(klon,klev) 82 81 real zpspsk(klon,klev) -
LMDZ6/trunk/libf/phylmd/coef_diff_turb_mod.F90
r4654 r4657 159 159 !!$! ycdragm(1:knon) = ycoefh(1:knon,1) 160 160 !!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 161 CALL ustarhb(knon,yu,yv,ycdragm, yustar) 161 162 ! Normalement, on peut passer dans les codes avec knon=0 163 ! Mais ca fait planter le replay. 164 ! En attendant une réécriture, on a joute des if (Fredho) 165 if ( klon>1 .or. (klon==1 .and. knon==1) ) then 166 CALL ustarhb(knon,klev,knon,yu,yv,ycdragm, yustar) 167 endif 162 168 163 169 IF (prt_level > 9) THEN … … 167 173 ! iflag_pbl peut etre utilise comme longuer de melange 168 174 IF (iflag_pbl.GE.31) THEN 169 if ( knon>0) then170 CALL vdif_kcay(knon,klev, dtime,RG,RD,ypaprs,yt, &175 if ( klon>1 .or. (klon==1 .and. knon==1) ) then 176 CALL vdif_kcay(knon,klev,knon,dtime,RG,RD,ypaprs,yt, & 171 177 yzlev,yzlay,yu,yv,yteta, & 172 178 ycdragm,yq2,q2diag,ykmm,ykmn,yustar, & -
LMDZ6/trunk/libf/phylmd/physiq_mod.F90
r4653 r4657 1 1 2 ! 2 3 ! $Id$ … … 3513 3514 ! ==== 3514 3515 IF (prt_level>9) WRITE(lunout,*)'pas de convection seche' 3516 WRITE(lunout,*) 'WARNING : running without dry convection. Somme intermediate variables are not properly defined in physiq_mod.F90' 3517 ! Reprendre proprement les initialisation ci dessouds si on veut vraiment utiliser l'option (FH) 3518 fraca(:,:)=0. 3519 fm_therm(:,:)=0. 3520 ztv(:,:)=t_seri(:,:) 3521 zqasc(:,:)=q_seri(:,:) 3522 ztla(:,:)=0. 3523 zthl(:,:)=0. 3524 zpspsk(:,:)=(pplay(:,:)/100000.)**RKAPPA 3525 3515 3526 3516 3527 -
LMDZ6/trunk/libf/phylmd/physiqex_mod.F90
r4655 r4657 9 9 & debut,lafin,pdtphys, & 10 10 & paprs,pplay,pphi,pphis,presnivs, & 11 & u,v,rot,t ,qx, &11 & u,v,rot,temp,qx, & 12 12 & flxmass_w, & 13 13 & d_u, d_v, d_t, d_qx, d_ps) 14 14 15 USE dimphy, only : klon,klev 16 USE infotrac_phy, only : nqtot 17 USE geometry_mod, only : latitude 18 ! USE comcstphy, only : rg 19 USE ioipsl, only : ymds2ju 20 USE phys_state_var_mod, only : phys_state_var_init 21 USE phyetat0_mod, only: phyetat0 22 USE output_physiqex_mod, ONLY: output_physiqex 15 16 USE dimphy, only : klon,klev 17 USE infotrac_phy, only : nqtot 18 USE geometry_mod, only : latitude 19 USE ioipsl, only : ymds2ju 20 USE phys_state_var_mod, only : phys_state_var_init 21 USE phyetat0_mod, only: phyetat0 22 USE output_physiqex_mod, ONLY: output_physiqex 23 use vdif_ini, only : vdif_ini_ 24 USE lmdz_thermcell_ini, ONLY : thermcell_ini 25 USE ioipsl_getin_p_mod, ONLY : getin_p 26 USE wxios, ONLY: missing_val, using_xios 27 USE lscp_mod, ONLY : lscp 28 USE lscp_ini_mod, ONLY : lscp_ini 29 USE add_phys_tend_mod, ONLY : add_phys_tend 30 23 31 24 32 IMPLICIT none 33 34 include "YOETHF.h" 35 36 37 38 25 39 ! 26 40 ! Routine argument: … … 32 46 logical,intent(in) :: lafin ! signals last call to physics 33 47 real,intent(in) :: pdtphys ! physics time step (s) 34 real,intent(in) :: paprs(klon,klev+1) ! interlayer pressure (Pa) 35 real,intent(in) :: pplay(klon,klev) ! mid-layer pressure (Pa) 36 real,intent(in) :: pphi(klon,klev) ! geopotential at mid-layer 37 real,intent(in) :: pphis(klon) ! surface geopotential 38 real,intent(in) :: presnivs(klev) ! pseudo-pressure (Pa) of mid-layers 39 real,intent(in) :: u(klon,klev) ! eastward zonal wind (m/s) 40 real,intent(in) :: v(klon,klev) ! northward meridional wind (m/s) 41 real,intent(in) :: rot(klon,klev) ! northward meridional wind (m/s) 42 real,intent(in) :: t(klon,klev) ! temperature (K) 43 real,intent(in) :: qx(klon,klev,nqtot) ! tracers (.../kg_air) 44 real,intent(in) :: flxmass_w(klon,klev) ! vertical mass flux 45 real,intent(out) :: d_u(klon,klev) ! physics tendency on u (m/s/s) 46 real,intent(out) :: d_v(klon,klev) ! physics tendency on v (m/s/s) 47 real,intent(out) :: d_t(klon,klev) ! physics tendency on t (K/s) 48 real,intent(out) :: d_qx(klon,klev,nqtot) ! physics tendency on tracers 49 real,intent(out) :: d_ps(klon) ! physics tendency on surface pressure 48 real,dimension(klon,klev+1),intent(in) :: paprs ! interlayer pressure (Pa) 49 real,dimension(klon,klev),intent(in) :: pplay ! mid-layer pressure (Pa) 50 real,dimension(klon,klev),intent(in) :: pphi ! geopotential at mid-layer 51 real,dimension(klon),intent(in) :: pphis ! surface geopotential 52 real,dimension(klev),intent(in) :: presnivs ! pseudo-pressure (Pa) of mid-layers 53 real,dimension(klon,klev),intent(in) :: u ! eastward zonal wind (m/s) 54 real,dimension(klon,klev),intent(in) :: v ! northward meridional wind (m/s) 55 real,dimension(klon,klev),intent(in) :: rot ! northward meridional wind (m/s) 56 real,dimension(klon,klev),intent(in) :: temp ! temperature (K) 57 real,dimension(klon,klev,nqtot),intent(in) :: qx ! tracers (.../kg_air) 58 real,dimension(klon,klev),intent(in) :: flxmass_w ! vertical mass flux 59 real,dimension(klon,klev),intent(out) :: d_u ! physics tendency on u (m/s/s) 60 real,dimension(klon,klev),intent(out) :: d_v ! physics tendency on v (m/s/s) 61 real,dimension(klon,klev),intent(out) :: d_t ! physics tendency on t (K/s) 62 real,dimension(klon,klev,nqtot),intent(out) :: d_qx ! physics tendency on tracers 63 real,dimension(klon),intent(out) :: d_ps ! physics tendency on surface pressure 64 65 real, dimension(klon,klev) :: u_loc 66 real, dimension(klon,klev) :: v_loc 67 real, dimension(klon,klev) :: t_loc 68 real, dimension(klon,klev) :: h_loc 69 real, dimension(klon,klev) :: d_u_loc,d_v_loc,d_t_loc,d_h_loc 70 71 real, dimension(klon,klev) :: d_u_dyn,d_v_dyn,d_t_dyn 72 real, dimension(klon,klev,nqtot) :: d_q_dyn 73 real, allocatable, dimension(:,:), save :: u_prev,v_prev,t_prev 74 real, allocatable, dimension(:,:,:), save :: q_prev 75 !$OMP THREADPRIVATE(u_prev,v_prev,t_prev,q_prev) 76 77 78 79 real, dimension(klon,klev) :: d_u_vdif,d_v_vdif,d_t_vdif,d_h_vdif 80 real, dimension(klon,klev) :: d_u_the,d_v_the,d_t_the 81 real, dimension(klon,klev,nqtot) :: q_loc,d_q_loc,d_q_vdif,d_q_the 82 83 real, dimension(klon) :: capcal,z0m,z0h,dtsrf,emis,fluxsrf,cdh,cdv,tsrf_ 84 real, dimension(klon,klev) :: zzlay,masse 85 real, dimension(klon,klev+1) :: zzlev,kz_v,kz_h,richardson 86 87 real, save, allocatable, dimension(:) :: tsrf,f0,zmax0 88 real, save, allocatable, dimension(:,:) :: q2 89 !$OMP THREADPRIVATE(tsrf,q2,f0,zmax0) 90 91 real,save :: ratqsbas=0.002,ratqshaut=0.3,ratqsp0=50000.,ratqsdp=20000. 92 !$OMP THREADPRIVATE(ratqsbas,ratqshaut,ratqsp0,ratqsdp) 93 94 95 real :: z1,z2,tau_thermals 96 logical :: lwrite 97 integer :: iflag_replay 98 99 integer :: iflag_thermals=18 100 101 !-------------------------------------------------------------- 102 ! Declaration lscp 103 !-------------------------------------------------------------- 104 INTEGER :: iflag_cld_th ! flag that determines the distribution of convective clouds ! IN 105 INTEGER :: iflag_ice_thermo! flag to activate the ice thermodynamics ! IN 106 LOGICAL :: ok_ice_sursat ! flag to determine if ice sursaturation is activated ! IN 107 LOGICAL, DIMENSION(klon,klev) :: ptconv ! grid points where deep convection scheme is active ! IN 108 REAL, DIMENSION(klon,klev) :: ztv ! virtual potential temperature [K] ! IN 109 REAL, DIMENSION(klon,klev) :: zqta ! specific humidity within thermals [kg/kg] ! IN 110 REAL, DIMENSION(klon,klev+1) :: frac_the,fm_the 111 REAL, DIMENSION(klon,klev) :: zpspsk ! exner potential (p/100000)**(R/cp) ! IN 112 REAL, DIMENSION(klon,klev) :: ztla ! liquid temperature within thermals [K] ! IN 113 REAL, DIMENSION(klon,klev) :: zthl ! liquid potential temperature [K] ! INOUT 114 REAL, DIMENSION(klon,klev) :: ratqs ! function of pressure that sets the large-scale ! INOUT 115 REAL, DIMENSION(klon,klev) :: beta ! conversion rate of condensed water ! INOUT 116 REAL, DIMENSION(klon,klev) :: rneb_seri ! fraction nuageuse en memoire ! INOUT 117 REAL, DIMENSION(klon,klev) :: d_t_lscp ! temperature increment [K] ! OUT 118 REAL, DIMENSION(klon,klev) :: d_q_lscp ! specific humidity increment [kg/kg] ! OUT 119 REAL, DIMENSION(klon,klev) :: d_ql_lscp ! liquid water increment [kg/kg] ! OUT 120 REAL, DIMENSION(klon,klev) :: d_qi_lscp ! cloud ice mass increment [kg/kg] ! OUT 121 REAL, DIMENSION(klon,klev) :: rneb ! cloud fraction [-] ! OUT 122 REAL, DIMENSION(klon,klev) :: rneblsvol ! cloud fraction per unit volume [-] ! OUT 123 REAL, DIMENSION(klon,klev) :: pfraclr ! precip fraction clear-sky part [-] ! OUT 124 REAL, DIMENSION(klon,klev) :: pfracld ! precip fraction cloudy part [-] ! OUT 125 REAL, DIMENSION(klon,klev) :: radocond ! condensed water used in the radiation scheme [kg/kg] ! OUT 126 REAL, DIMENSION(klon,klev) :: radicefrac ! ice fraction of condensed water for radiation scheme ! OUT 127 REAL, DIMENSION(klon,klev) :: rhcl ! clear-sky relative humidity [-] ! OUT 128 REAL, DIMENSION(klon) :: rain ! surface large-scale rainfall [kg/s/m2] ! OUT 129 REAL, DIMENSION(klon) :: snow ! surface large-scale snowfall [kg/s/m2] ! OUT 130 REAL, DIMENSION(klon,klev) :: qsatl ! saturation specific humidity wrt liquid [kg/kg] ! OUT 131 REAL, DIMENSION(klon,klev) :: qsats ! saturation specific humidity wrt ice [kg/kg] ! OUT 132 REAL, DIMENSION(klon,klev+1) :: prfl ! large-scale rainfall flux in the column [kg/s/m2] ! OUT 133 REAL, DIMENSION(klon,klev+1) :: psfl ! large-scale snowfall flux in the column [kg/s/m2] ! OUT 134 REAL, DIMENSION(klon,klev) :: distcltop ! distance to cloud top [m] ! OUT 135 REAL, DIMENSION(klon,klev) :: temp_cltop ! temperature of cloud top [K] ! OUT 136 REAL, DIMENSION(klon,klev) :: frac_impa ! scavenging fraction due tu impaction [-] ! OUT 137 REAL, DIMENSION(klon,klev) :: frac_nucl ! scavenging fraction due tu nucleation [-] ! OUT 138 REAL, DIMENSION(klon,klev) :: qclr ! specific total water content in clear sky region [kg/kg] ! OUT 139 REAL, DIMENSION(klon,klev) :: qcld ! specific total water content in cloudy region [kg/kg] ! OUT 140 REAL, DIMENSION(klon,klev) :: qss ! specific total water content in supersat region [kg/kg] ! OUT 141 REAL, DIMENSION(klon,klev) :: qvc ! specific vapor content in clouds [kg/kg] ! OUT 142 REAL, DIMENSION(klon,klev) :: rnebclr ! mesh fraction of clear sky [-] ! OUT 143 REAL, DIMENSION(klon,klev) :: rnebss ! mesh fraction of ISSR [-] ! OUT 144 REAL, DIMENSION(klon,klev) :: gamma_ss ! coefficient governing the ice nucleation RHi threshold [-] ! OUT 145 REAL, DIMENSION(klon,klev) :: Tcontr ! threshold temperature for contrail formation [K] ! OUT 146 REAL, DIMENSION(klon,klev) :: qcontr ! threshold humidity for contrail formation [kg/kg] ! OUT 147 REAL, DIMENSION(klon,klev) :: qcontr2 ! // (2nd expression more consistent with LMDZ expression of q)! OUT 148 REAL, DIMENSION(klon,klev) :: fcontrN ! fraction of grid favourable to non-persistent contrails ! OUT 149 REAL, DIMENSION(klon,klev) :: fcontrP ! fraction of grid favourable to persistent contrails ! OUT 150 !-------------------------------------------------------------- 151 152 REAL, DIMENSION(klon,klev) :: d_t_eva,d_q_eva,d_ql_eva,d_qi_eva 153 include "YOMCST.h" 50 154 51 155 ! include "clesphys.h" … … 57 161 !$OMP THREADPRIVATE(clesphy0) 58 162 59 60 real :: temp_newton(klon,klev) 61 integer :: k 163 real,dimension(klon,klev) :: temp_newton 164 integer :: i,k,iq 165 INTEGER, SAVE :: itap=0 166 !$OMP THREADPRIVATE(itap) 167 INTEGER, SAVE :: abortphy=0 ! Reprere si on doit arreter en fin de phys 168 !$OMP THREADPRIVATE(abortphy) 169 170 integer, save :: iflag_reevap=1,iflag_newton=0,iflag_vdif=1,iflag_lscp=1,iflag_cloudth_vert=3,iflag_ratqs=4 171 !$OMP THREADPRIVATE(iflag_reevap,iflag_newton,iflag_vdif,iflag_lscp,iflag_cloudth_vert,iflag_ratqs) 172 62 173 logical, save :: first=.true. 63 174 !$OMP THREADPRIVATE(first) 64 65 real,save :: rg=9.8166 !$OMP THREADPRIVATE(rg)67 175 68 176 ! For I/Os 69 177 integer :: itau0 70 178 real :: zjulian 179 real,dimension(klon,klev) :: du0,dv0,dqbs0 180 real,dimension(klon,klev) :: cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv 71 181 72 182 … … 93 203 ! Initialize IOIPSL output file 94 204 #endif 205 call suphel 206 call vdif_ini_(klon,RCPD,RD,RG,RKAPPA) 207 ! Pourquoi ce tau_thermals en argument ??? AFAIRE 208 tau_thermals=0. 209 call getin_p('iflag_thermals',iflag_thermals) 210 211 call getin_p('iflag_newton',iflag_newton) 212 call getin_p('iflag_reevap',iflag_reevap) 213 call getin_p('iflag_cloudth_vert',iflag_cloudth_vert) 214 call getin_p('iflag_ratqs',iflag_ratqs) 215 call getin_p('iflag_vdif',iflag_vdif) 216 call getin_p('iflag_lscp',iflag_lscp) 217 call getin_p('ratqsbas',ratqsbas) 218 call getin_p('ratqshaut',ratqshaut) 219 call getin_p('ratqsp0',ratqsp0) 220 call getin_p('ratqsdp',ratqsdp) 221 CALL thermcell_ini(iflag_thermals,0,tau_thermals,6, & 222 & RG,RD,RCPD,RKAPPA,RLVTT,RETV) 223 CALL lscp_ini(pdtphys,.false.,iflag_ratqs, RCPD, RLSTT, RLVTT, RLMLT, RVTMP2, RTT,RD,RG) 224 225 226 227 allocate(tsrf(klon),q2(klon,klev+1),f0(klon),zmax0(klon)) 228 allocate(u_prev(klon,klev),v_prev(klon,klev),t_prev(klon,klev),q_prev(klon,klev,nqtot)) 229 230 u_prev(:,:)=u(:,:) 231 v_prev(:,:)=v(:,:) 232 t_prev(:,:)=temp(:,:) 233 q_prev(:,:,:)=qx(:,:,:) 234 235 q2=1.e-10 236 tsrf=temp(:,1) 237 f0=0. 238 zmax0=0. 239 240 iflag_replay=0 241 call getin_p('iflag_replay',iflag_replay) 242 if ( iflag_replay >= 0 ) CALL iophys_ini(pdtphys) 243 95 244 96 245 endif ! of if (debut) … … 100 249 !------------------------------------------------------------ 101 250 251 d_u_dyn(:,:)=(u(:,:)-u_prev(:,:))/pdtphys 252 d_v_dyn(:,:)=(v(:,:)-v_prev(:,:))/pdtphys 253 d_t_dyn(:,:)=(temp(:,:)-t_prev(:,:))/pdtphys 254 d_q_dyn(:,:,:)=(qx(:,:,:)-q_prev(:,:,:))/pdtphys 102 255 103 256 ! set all tendencies to zero … … 108 261 d_ps(1:klon)=0. 109 262 263 u_loc(1:klon,1:klev)=u(1:klon,1:klev) 264 v_loc(1:klon,1:klev)=v(1:klon,1:klev) 265 t_loc(1:klon,1:klev)=temp(1:klon,1:klev) 266 d_u_loc(1:klon,1:klev)=0. 267 d_v_loc(1:klon,1:klev)=0. 268 d_t_loc(1:klon,1:klev)=0. 269 do iq=1,nqtot 270 do k=1,klev 271 do i=1,klon 272 q_loc(i,k,iq)=qx(i,k,iq) 273 enddo 274 enddo 275 enddo 276 277 du0(1:klon,1:klev)=0. 278 dv0(1:klon,1:klev)=0. 279 dqbs0(1:klon,1:klev)=0. 280 281 282 110 283 !------------------------------------------------------------ 111 284 ! Calculs 112 285 !------------------------------------------------------------ 113 286 114 ! compute tendencies to return to the dynamics: 115 ! "friction" on the first layer 116 d_u(1:klon,1)=-u(1:klon,1)/86400. 117 d_v(1:klon,1)=-v(1:klon,1)/86400. 118 ! newtonian relaxation towards temp_newton() 287 !------------------------------------------------------------ 288 ! Rappel en temperature et frottement dans la premiere chouche 289 !------------------------------------------------------------ 290 291 if ( iflag_newton == 1 ) then 292 ! compute tendencies to return to the dynamics: 293 ! "friction" on the first layer 294 d_u(1:klon,1)=-u(1:klon,1)/86400. 295 d_v(1:klon,1)=-v(1:klon,1)/86400. 296 ! newtonian relaxation towards temp_newton() 297 do k=1,klev 298 temp_newton(1:klon,k)=280.+cos(latitude(1:klon))*40.-pphi(1:klon,k)/rg*6.e-3 299 d_t(1:klon,k)=(temp_newton(1:klon,k)-temp(1:klon,k))/5.e5 300 enddo 301 else 302 temp_newton(:,:)=0. 303 endif 304 305 306 !------------------------------------------------------------ 307 ! Reevaporation de la pluie 308 !------------------------------------------------------------ 309 310 iflag_ice_thermo=1 311 if ( iflag_reevap == 1 ) then 312 CALL reevap (klon,klev,iflag_ice_thermo,t_loc,q_loc(:,:,1),q_loc(:,:,2),q_loc(:,:,3), & 313 & d_t_eva,d_q_eva,d_ql_eva,d_qi_eva) 314 do k=1,klev 315 do i=1,klon 316 t_loc(i,k)=t_loc(i,k)+d_t_eva(i,k) 317 q_loc(i,k,1)=q_loc(i,k,1)+d_q_eva(i,k) 318 q_loc(i,k,2)=q_loc(i,k,2)+d_ql_eva(i,k) 319 q_loc(i,k,3)=q_loc(i,k,3)+d_qi_eva(i,k) 320 ! q_loc(i,k,2)=0. 321 ! q_loc(i,k,3)=0. 322 enddo 323 enddo 324 else 325 d_t_eva(:,:)=0. 326 d_q_eva(:,:)=0. 327 d_ql_eva(:,:)=0. 328 d_qi_eva(:,:)=0. 329 endif 330 331 !----------------------------------------------------------------------- 332 ! Variables intermédiaires (altitudes, temperature potentielle ...) 333 !----------------------------------------------------------------------- 334 335 DO k=1,klev 336 DO i=1,klon 337 zzlay(i,k)=pphi(i,k)/rg 338 ENDDO 339 ENDDO 340 DO i=1,klon 341 zzlev(i,1)=0. 342 ENDDO 343 DO k=2,klev 344 DO i=1,klon 345 z1=(pplay(i,k-1)+paprs(i,k))/(pplay(i,k-1)-paprs(i,k)) 346 z2=(paprs(i,k)+pplay(i,k))/(paprs(i,k)-pplay(i,k)) 347 zzlev(i,k)=(z1*zzlay(i,k-1)+z2*zzlay(i,k))/(z1+z2) 348 ENDDO 349 ENDDO 350 351 ! Transformation de la temperature en temperature potentielle 352 DO k=1,klev 353 DO i=1,klon 354 ! zpspsk(i,k)=(pplay(i,k)/paprs(i,1))**rkappa 355 zpspsk(i,k)=(pplay(i,k)/paprs(i,1))**rkappa 356 masse(i,k)=(paprs(i,k)-paprs(i,k+1))/rg 357 ENDDO 358 ENDDO 359 DO k=1,klev 360 DO i=1,klon 361 h_loc(i,k)=t_loc(i,k)/zpspsk(i,k) 362 d_h_loc(i,k)=d_t_loc(i,k)/zpspsk(i,k) 363 d_q_loc(i,k,1)=0. 364 ENDDO 365 ENDDO 366 367 !----------------------------------------------------------------------- 368 ! Diffusion verticale 369 !----------------------------------------------------------------------- 370 371 if ( iflag_vdif == 1 ) then 372 emis(:)=1. 373 !tsrf=300. 374 z0m=0.035 375 z0h=0.035 376 capcal=1e2 377 lwrite=.false. 378 print*,'lwrite ',lwrite 379 call vdif(klon,klev, & 380 & pdtphys,capcal,z0m,z0h, & 381 & pplay,paprs,zzlay,zzlev, & 382 & u_loc,v_loc,t_loc,h_loc,q_loc,tsrf,emis, & 383 & d_u_loc,d_v_loc,d_h_loc,d_q_loc,fluxsrf, & 384 & d_u_vdif,d_v_vdif,d_h_vdif,d_q_vdif,dtsrf,q2,kz_v,kz_h, & 385 & richardson,cdv,cdh, & 386 & lwrite) 119 387 do k=1,klev 120 temp_newton(1:klon,k)=280.+cos(latitude(1:klon))*40.-pphi(1:klon,k)/rg*6.e-3 121 d_t(1:klon,k)=(temp_newton(1:klon,k)-t(1:klon,k))/1.e5 388 do i=1,klon 389 d_t_vdif(i,k)=d_h_vdif(i,k)*zpspsk(i,k) 390 t_loc(i,k)=t_loc(i,k)+d_t_vdif(i,k)*pdtphys 391 u_loc(i,k)=u_loc(i,k)+d_u_vdif(i,k)*pdtphys 392 v_loc(i,k)=v_loc(i,k)+d_v_vdif(i,k)*pdtphys 393 q_loc(i,k,1)=q_loc(i,k,1)+d_q_vdif(i,k,1)*pdtphys 394 enddo 122 395 enddo 123 396 do i=1,klon 397 tsrf(i)=tsrf(i)+dtsrf(i)*pdtphys 398 enddo 399 else 400 d_u_vdif(:,:)=0. 401 d_v_vdif(:,:)=0. 402 d_t_vdif(:,:)=0. 403 d_h_vdif(:,:)=0. 404 d_q_vdif(:,:,1)=0. 405 kz_v(:,:)=0. 406 kz_h(:,:)=0. 407 richardson(:,:)=0. 408 endif 409 410 !----------------------------------------------------------------------- 411 ! Thermiques 412 !----------------------------------------------------------------------- 413 414 do k=1,klev 415 do i=1,klon 416 d_u_the(i,k)=0. 417 d_v_the(i,k)=0. 418 d_t_the(i,k)=0. 419 d_q_the(i,k,1)=0. 420 enddo 421 enddo 422 423 if ( iflag_thermals > 0 ) then 424 425 426 zqta(:,:)=q_loc(:,:,1) 427 call caltherm(pdtphys & 428 & ,pplay,paprs,pphi & 429 & ,u_loc,v_loc,t_loc,q_loc,debut & 430 & ,f0,zmax0,d_u_the,d_v_the,d_t_the,d_q_the & 431 & ,frac_the,fm_the,zqta,ztv,zpspsk,ztla,zthl & 432 & ) 433 434 do k=1,klev 435 do i=1,klon 436 t_loc(i,k)=t_loc(i,k)+d_t_the(i,k) 437 u_loc(i,k)=u_loc(i,k)+d_u_the(i,k) 438 v_loc(i,k)=v_loc(i,k)+d_v_the(i,k) 439 q_loc(i,k,1)=q_loc(i,k,1)+d_q_the(i,k,1) 440 enddo 441 enddo 442 443 else 444 frac_the(:,:)=0. 445 fm_the(:,:)=0. 446 ztv(:,:)=t_loc(:,:) 447 zqta(:,:)=q_loc(:,:,1) 448 ztla(:,:)=0. 449 zthl(:,:)=0. 450 endif 451 452 !----------------------------------------------------------------------- 453 ! Condensation grande échelle 454 !----------------------------------------------------------------------- 455 456 iflag_cld_th=5 457 ok_ice_sursat=.false. 458 ptconv(:,:)=.false. 459 distcltop=0. 460 temp_cltop=0. 461 beta(:,:)=1. 462 rneb_seri(:,:)=0. 463 do k=1,klev 464 ratqs(:,k)=ratqsbas+0.5*(ratqshaut-ratqsbas) & 465 *( tanh( (ratqsp0-pplay(:,k))/ratqsdp) + 1.) 466 enddo 467 468 469 if ( iflag_lscp == 1 ) then 470 471 call lscp(klon,klev,pdtphys,missing_val, & 472 paprs,pplay,t_loc,q_loc,ptconv,ratqs, & 473 d_t_lscp, d_q_lscp, d_ql_lscp, d_qi_lscp, rneb, rneblsvol, rneb_seri, & 474 pfraclr,pfracld, & 475 radocond, radicefrac, rain, snow, & 476 frac_impa, frac_nucl, beta, & 477 prfl, psfl, rhcl, zqta, frac_the, & 478 ztv, zpspsk, ztla, zthl, iflag_cld_th, & 479 iflag_ice_thermo, ok_ice_sursat, qsatl, qsats, & 480 distcltop,temp_cltop, & 481 qclr, qcld, qss, qvc, rnebclr, rnebss, gamma_ss, & 482 Tcontr, qcontr, qcontr2, fcontrN, fcontrP, & 483 cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv) 484 485 486 do k=1,klev 487 do i=1,klon 488 t_loc(i,k)=t_loc(i,k)+d_t_lscp(i,k) 489 q_loc(i,k,1)=q_loc(i,k,1)+d_q_lscp(i,k) 490 q_loc(i,k,2)=q_loc(i,k,2)+d_ql_lscp(i,k) 491 q_loc(i,k,3)=q_loc(i,k,3)+d_qi_lscp(i,k) 492 enddo 493 enddo 494 495 else 496 d_t_lscp(:,:)=0. 497 d_q_lscp(:,:)=0. 498 d_ql_lscp(:,:)=0. 499 d_qi_lscp(:,:)=0. 500 rneb(:,:)=0. 501 rneblsvol(:,:)=0. 502 pfraclr(:,:)=0. 503 pfracld(:,:)=0. 504 radocond(:,:)=0. 505 rain(:)=0. 506 snow(:)=0. 507 radicefrac(:,:)=0. 508 rhcl (:,:)=0. 509 qsatl (:,:)=0. 510 qsats (:,:)=0. 511 prfl (:,:)=0. 512 psfl (:,:)=0. 513 distcltop (:,:)=0. 514 temp_cltop(:,:)=0. 515 frac_impa (:,:)=0. 516 frac_nucl (:,:)=0. 517 qclr (:,:)=0. 518 qcld (:,:)=0. 519 qss (:,:)=0. 520 qvc (:,:)=0. 521 rnebclr (:,:)=0. 522 rnebss (:,:)=0. 523 gamma_ss (:,:)=0. 524 Tcontr (:,:)=0. 525 qcontr (:,:)=0. 526 qcontr2 (:,:)=0. 527 fcontrN (:,:)=0. 528 fcontrP (:,:)=0. 529 endif 530 531 532 d_u(:,:)=(u_loc(:,:)-u(:,:))/pdtphys 533 d_v(:,:)=(v_loc(:,:)-v(:,:))/pdtphys 534 d_t(:,:)=(t_loc(:,:)-temp(:,:))/pdtphys 535 d_qx(:,:,:)=(q_loc(:,:,:)-qx(:,:,:))/pdtphys 124 536 125 537 !------------------------------------------------------------ … … 128 540 129 541 130 call output_physiqex(debut,zjulian,pdtphys,presnivs,paprs,u,v,t,qx,0.*t,0.*t,0.*t,0.*t,0.*t,0.*t) 542 tsrf_(:)=tsrf(:) 543 if ( iflag_replay == -1 ) then 544 call output_physiqex(debut,zjulian,pdtphys,presnivs,paprs,u,v,temp,qx,0.*u,0.*u,0.*u,0.*u,q2,0.*u) 545 else if (iflag_replay == 0 ) then 546 ! En mode replay, on sort aussi les variables de base 547 ! Les lignes qui suivent ont été générées automatiquement avec : 548 ! ( for i in `grep -i 'real.*::' physiqex_mod.F90 | sed -e '/^!/d' | grep '(klon,klev' | cut -d: -f3 | cut -d! -f1 | sed -e 's/,/ /g' -e '/rot/d'` ; do echo ' call iophys_ecrit("'$i'",klev,"","",'$i')' ; done ) > physiqex_out.h 549 ! ( for i in `grep -i 'real.*::' physiqex_mod.F90 | sed -e '/^!/d' | grep '(klon)' | cut -d: -f3 | cut -d! -f1 | sed -e 's/,/ /g' -e '/rot/d'` ; do echo ' call iophys_ecrit("'$i'",1,"","",'$i')' ; done ) >> physiqex_out.h 550 include "physiqex_out.h" 551 552 endif 131 553 132 554 … … 136 558 endif 137 559 560 print*,'Fin physiqex' 138 561 139 562 end subroutine physiqex -
LMDZ6/trunk/libf/phylmd/ustarhb.F90
r2346 r4657 2 2 ! $Header$ 3 3 4 SUBROUTINE ustarhb(knon, u, v, cd_m, ustar) 5 USE dimphy 4 SUBROUTINE ustarhb(klon, klev, knon, u, v, cd_m, ustar) 6 5 IMPLICIT NONE 7 6 ! ====================================================================== … … 18 17 ! model. J. of Climate, vol. 6, 1825-1842. 19 18 ! ====================================================================== 20 include "YOMCST.h"21 19 22 20 ! Arguments: 23 21 24 INTEGER knon ! nombre de points a calculer 25 REAL u(klon, klev) ! vitesse U (m/s) 26 REAL v(klon, klev) ! vitesse V (m/s) 27 REAL cd_m(klon) ! coefficient de friction au sol pour vitesse 28 REAL ustar(klon) 22 INTEGER, INTENT(IN) :: klon, klev, knon ! nombre de points a calculer 23 REAL, DIMENSION(klon, klev), INTENT(IN) :: u,v ! vent horizontal (m/s) 24 REAL, DIMENSION(klon), INTENT(IN) :: cd_m ! coefficient de friction au sol pour vitesse 25 REAL, DIMENSION(klon), INTENT(OUT) :: ustar 29 26 30 INTEGER i, k 31 REAL zxt, zxq, zxu, zxv, zxmod, taux, tauy 32 REAL zx_alf1, zx_alf2 ! parametres pour extrapolation 33 LOGICAL unssrf(klon) ! unstb pbl w/lvls within srf pbl lyr 34 LOGICAL unsout(klon) ! unstb pbl w/lvls in outer pbl lyr 35 LOGICAL check(klon) ! True=>chk if Richardson no.>critcal 27 INTEGER :: i, k 28 REAL :: zxt, zxq, zxu, zxv, zxmod, taux, tauy 29 REAL :: zx_alf1, zx_alf2 ! parametres pour extrapolation 36 30 37 include "YOETHF.h"38 include "FCTTRE.h"39 31 DO i = 1, knon 40 32 zx_alf1 = 1.0 … … 46 38 tauy = zxv*zxmod*cd_m(i) 47 39 ustar(i) = sqrt(taux**2+tauy**2) 48 ! print*,'Ust ',zxu,zxmod,taux,ustar(i)49 40 END DO 50 41 -
LMDZ6/trunk/libf/phylmd/vdif_kcay.F90
r4654 r4657 2 2 ! $Header$ 3 3 4 SUBROUTINE vdif_kcay(klon,klev, 4 SUBROUTINE vdif_kcay(klon,klev,ngrid,dt, g, rconst, plev, temp, zlev, zlay, u, v, & 5 5 teta, cd, q2, q2diag, km, kn, ustar, l_mix) 6 6 … … 28 28 29 29 ! ....................................................................... 30 INTEGER, INTENT(IN) :: klon,klev 30 INTEGER, INTENT(IN) :: klon,klev,ngrid 31 31 REAL,INTENT(IN) :: dt, g, rconst 32 32 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: plev 33 33 REAL,DIMENSION(klon,klev),INTENT(IN) :: temp 34 REAL,DIMENSION(klon),INTENT(IN) :: ustar (klon)34 REAL,DIMENSION(klon),INTENT(IN) :: ustar 35 35 REAL,DIMENSION(klon,klev+1),INTENT(INOUT) :: zlev 36 36 REAL,DIMENSION(klon,klev),INTENT(IN) :: zlay … … 38 38 REAL,DIMENSION(klon,klev),INTENT(IN) :: v 39 39 REAL,DIMENSION(klon,klev),INTENT(IN) :: teta 40 REAL,DIMENSION(klon),INTENT(IN) :: cd (klon)40 REAL,DIMENSION(klon),INTENT(IN) :: cd 41 41 REAL,DIMENSION(klon,klev+1),INTENT(INOUT) :: q2 42 REAL,DIMENSION(klon,klev+1),INTENT( INOUT) :: q2diag42 REAL,DIMENSION(klon,klev+1),INTENT(OUT) :: q2diag 43 43 REAL,DIMENSION(klon,klev+1),INTENT(OUT) :: km 44 44 REAL,DIMENSION(klon,klev+1),INTENT(OUT) :: kn … … 62 62 63 63 ! ....................................................................... 64 INTEGER :: nlay, nlev , ngrid64 INTEGER :: nlay, nlev 65 65 REAL, DIMENSION(klon,klev) :: unsdz 66 66 REAL, DIMENSION(klon, klev+1) :: unsdzdec,q … … 200 200 201 201 LOGICAL :: first 202 SAVE first203 DATA first/.TRUE./204 !$OMP THREADPRIVATE(first)202 ! SAVE first 203 ! DATA first/.TRUE./ 204 ! !$OMP THREADPRIVATE(first) 205 205 ! ....................................................................... 206 206 ! traitment des valeur de q2 en entree … … 208 208 209 209 ! Initialisation de q2 210 ngrid=klon211 210 nlay = klev 212 211 nlev = klev + 1 … … 360 359 gninf = .FALSE. 361 360 gnsup = .FALSE. 362 long(igrid, ilev) = long(igrid, ilev)363 long(igrid, ilev) = long(igrid, ilev)364 361 365 362 IF (gn<gnmin) THEN
Note: See TracChangeset
for help on using the changeset viewer.