Changeset 3197 for trunk/LMDZ.PLUTO
- Timestamp:
- Feb 1, 2024, 11:17:06 AM (10 months ago)
- Location:
- trunk/LMDZ.PLUTO
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.PLUTO/deftank/callphys.def
r3195 r3197 87 87 sedimentation = .true. 88 88 89 naerkind = 089 naerkind = 1 90 90 hazeprop = optprop_tholins_fractal100nm.dat 91 91 -
trunk/LMDZ.PLUTO/deftank/traceur.def
r3195 r3197 1 0 1 1 2 n2 -
trunk/LMDZ.PLUTO/libf/phypluto/callcorrk.F90
r3195 r3197 486 486 end do 487 487 488 ! Get 3D aerosol optical properties. 489 call aeroptproperties(ngrid,nlayer,reffrad,nueffrad, & 490 QVISsQREF3d,omegaVIS3d,gVIS3d, & 491 QIRsQREF3d,omegaIR3d,gIR3d, & 492 QREFvis3d,QREFir3d) 493 494 ! Get aerosol optical depths. 495 call aeropacity(ngrid,nlayer,nq,pplay,pplev, pt,pq,aerosol, & 496 reffrad,nueffrad,QREFvis3d,QREFir3d, & 497 tau_col,cloudfrac,totcloudfrac,clearsky) 488 if (aerohaze) then 489 ! if (haze_radproffix) then 490 ! call haze_reffrad_fix(ngrid,nlayer,zzlay,& 491 ! reffrad,nueffrad) 492 ! endif 493 494 ! Get 3D aerosol optical properties. 495 call aeroptproperties(ngrid,nlayer,reffrad,nueffrad, & 496 QVISsQREF3d,omegaVIS3d,gVIS3d, & 497 QIRsQREF3d,omegaIR3d,gIR3d, & 498 QREFvis3d,QREFir3d) 499 500 ! Get aerosol optical depths. 501 call aeropacity(ngrid,nlayer,nq,pplay,pplev, pt,pq,aerosol, & 502 reffrad,nueffrad,QREFvis3d,QREFir3d, & 503 tau_col,cloudfrac,totcloudfrac,clearsky) 504 endif 498 505 499 506 !----------------------------------------------------------------------- … … 513 520 514 521 522 if (aerohaze) then 515 523 do iaer=1,naerkind 516 524 ! Shortwave. … … 620 628 end do ! naerkind 621 629 630 endif ! aerohaze 622 631 !----------------------------------------------------------------------- 623 632 ! Aerosol optical depths 624 633 !----------------------------------------------------------------------- 625 634 IF (aerohaze) THEN 626 635 do iaer=1,naerkind ! a bug was here 627 636 do k=0,nlayer-1 … … 642 651 643 652 end do ! naerkind 653 ELSE 654 tauaero(:,:)=0 655 ENDIF ! aerohaze 644 656 645 657 ! Albedo and Emissivity. -
trunk/LMDZ.PLUTO/libf/phypluto/inifis_mod.F90
r3195 r3197 34 34 ! ------- 35 35 ! 36 ! Initialisation for the physical parametrisations of the LMD 36 ! Initialisation for the physical parametrisations of the LMD 37 37 ! Generic Model. 38 38 ! … … 78 78 INTEGER ig 79 79 CHARACTER(len=20) :: rname="inifis" ! routine name, for messages 80 80 81 81 EXTERNAL iniorbit,orbite 82 82 EXTERNAL SSUM 83 83 REAL SSUM 84 84 85 85 ! Initialize flags lunout, prt_level, debug (in print_control_mod) 86 86 CALL init_print_control … … 110 110 ! do we read a startphy.nc file? (default: .true.) 111 111 call getin_p("startphy_file",startphy_file) 112 112 113 113 ! -------------------------------------------------------------- 114 114 ! Reading the "callphys.def" file controlling some key options 115 115 ! -------------------------------------------------------------- 116 116 117 117 IF (is_master) THEN 118 118 ! check if 'callphys.def' file is around … … 139 139 if (is_master) write(*,*) "Haze optical properties datafile" 140 140 hazeprop="../../../datadir" ! default path 141 call getin_p("hazeprop",hazeprop) 141 call getin_p("hazeprop",hazeprop) 142 142 if (is_master) write(*,*) trim(rname)//" hazeprop = ",trim(hazeprop) 143 143 … … 175 175 call getin_p("season",season) 176 176 if (is_master) write(*,*) trim(rname)//": season = ",season 177 177 178 178 if (is_master) write(*,*) trim(rname)//& 179 179 ": No seasonal cycle: initial day to lock the run during restart" … … 235 235 call getin_p("tplanckmin",tplanckmin) 236 236 if (is_master) write(*,*) trim(rname)//": tplanckmin = ",tplanckmin 237 237 238 238 if (is_master) write(*,*) trim(rname)//& 239 239 ": Maximum atmospheric temperature for Planck function integration ?" … … 241 241 call getin_p("tplanckmax",tplanckmax) 242 242 if (is_master) write(*,*) trim(rname)//": tplanckmax = ",tplanckmax 243 243 244 244 if (is_master) write(*,*) trim(rname)//& 245 245 ": Temperature step for Planck function integration ?" … … 247 247 call getin_p("dtplanck",dtplanck) 248 248 if (is_master) write(*,*) trim(rname)//": dtplanck = ",dtplanck 249 249 250 250 if (is_master) write(*,*) trim(rname)//& 251 251 ": call gaseous absorption in the visible bands?"//& … … 254 254 call getin_p("callgasvis",callgasvis) 255 255 if (is_master) write(*,*) trim(rname)//": callgasvis = ",callgasvis 256 256 257 257 if (is_master) write(*,*) trim(rname)//& 258 258 ": call continuum opacities in radiative transfer ?"//& … … 290 290 call getin_p("callsoil",callsoil) 291 291 if (is_master) write(*,*) trim(rname)//": callsoil = ",callsoil 292 292 293 293 if (is_master) write(*,*)trim(rname)//& 294 294 ": Rad transfer is computed every iradia", & … … 297 297 call getin_p("iradia",iradia) 298 298 if (is_master) write(*,*)trim(rname)//": iradia = ",iradia 299 299 300 300 if (is_master) write(*,*)trim(rname)//": Rayleigh scattering ?" 301 301 rayleigh=.false. … … 347 347 call getin_p("nsoilmx",nsoilmx) 348 348 if (is_master) write(*,*)trim(rname)//": nsoilmx=",nsoilmx 349 349 350 350 if (is_master) write(*,*)trim(rname)//& 351 351 ": Thickness of topmost soil layer (m)?" … … 353 353 call getin_p("lay1_soil",lay1_soil) 354 354 if (is_master) write(*,*)trim(rname)//": lay1_soil = ",lay1_soil 355 355 356 356 if (is_master) write(*,*)trim(rname)//& 357 357 ": Coefficient for soil layer thickness distribution?" … … 380 380 call getin_p("global1d",global1d) 381 381 write(*,*) "global1d = ",global1d 382 382 383 383 ! Test of incompatibility : if global1d is true, there should not be any diurnal cycle. 384 384 if (global1d.and.diurnal) then … … 464 464 if(kastprof)then 465 465 radfixed=.true. 466 endif 466 endif 467 467 468 468 if (is_master) write(*,*)trim(rname)//& … … 472 472 if (is_master) write(*,*)trim(rname)//": naerkind = ",naerkind 473 473 474 474 475 475 !*************************************************************** 476 476 !! TRACERS options … … 478 478 if (is_master)write(*,*)trim(rname)//& 479 479 "call N2 condensation ?" 480 N2cond=.true. ! default value481 call getin_p(" N2cond",N2cond)482 if (is_master)write(*,*)trim(rname)//& 483 " N2cond = ",N2cond480 n2cond=.true. ! default value 481 call getin_p("n2cond",n2cond) 482 if (is_master)write(*,*)trim(rname)//& 483 " n2cond = ",n2cond 484 484 485 485 if (is_master)write(*,*)trim(rname)//& … … 655 655 if (is_master)write(*,*)trim(rname)//& 656 656 "nb_monomer = ",nb_monomer 657 657 658 658 if (is_master)write(*,*)trim(rname)//& 659 659 "fixed radius profile from txt file ?" … … 750 750 if (is_master)write(*,*)trim(rname)//& 751 751 " thres_ch4ice = ",thres_ch4ice 752 fdch4_latn=-1. 753 fdch4_lats=0. 754 fdch4_lone=0. 755 fdch4_lonw=-1. 756 fdch4_depalb=0.5 757 fdch4_finalb=0.95 758 fdch4_maxalb=0.99 759 fdch4_ampl=200. 760 fdch4_maxice=100. 752 fdch4_latn=-1. 753 fdch4_lats=0. 754 fdch4_lone=0. 755 fdch4_lonw=-1. 756 fdch4_depalb=0.5 757 fdch4_finalb=0.95 758 fdch4_maxalb=0.99 759 fdch4_ampl=200. 760 fdch4_maxice=100. 761 761 call getin_p(" fdch4_latn",fdch4_latn) 762 762 call getin_p(" fdch4_lats",fdch4_lats) … … 903 903 if (is_master)write(*,*)trim(rname)//& 904 904 " tholateq = ",tholateq 905 tholatn=-1. 906 tholats=0. 907 tholone=0. 908 tholonw=-1. 905 tholatn=-1. 906 tholats=0. 907 tholone=0. 908 tholonw=-1. 909 909 alb_tho_spe=0.1 ! default value 910 910 emis_tho_spe=1. ! default value … … 1039 1039 if (is_master) write(*,*)trim(rname)//& 1040 1040 ": optprop_back2lay_ir = ",trim(optprop_back2lay_ir) 1041 1041 1042 1042 if (is_master) write(*,*)trim(rname)//& 1043 1043 ": TWOLAY AEROSOL: pres_bottom_tropo? in pa" … … 1132 1132 1133 1133 ! This is necessary, we just set the number of aerosol layers 1134 IF(.NOT.ALLOCATED(aeronlay_tauref)) ALLOCATE(aeronlay_tauref(nlayaero)) 1135 IF(.NOT.ALLOCATED(aeronlay_lamref)) ALLOCATE(aeronlay_lamref(nlayaero)) 1136 IF(.NOT.ALLOCATED(aeronlay_choice)) ALLOCATE(aeronlay_choice(nlayaero)) 1137 IF(.NOT.ALLOCATED(aeronlay_pbot)) ALLOCATE(aeronlay_pbot(nlayaero)) 1138 IF(.NOT.ALLOCATED(aeronlay_ptop)) ALLOCATE(aeronlay_ptop(nlayaero)) 1139 IF(.NOT.ALLOCATED(aeronlay_sclhght)) ALLOCATE(aeronlay_sclhght(nlayaero)) 1140 IF(.NOT.ALLOCATED(aeronlay_size)) ALLOCATE(aeronlay_size(nlayaero)) 1141 IF(.NOT.ALLOCATED(aeronlay_nueff)) ALLOCATE(aeronlay_nueff(nlayaero)) 1142 IF(.NOT.ALLOCATED(optprop_aeronlay_ir)) ALLOCATE(optprop_aeronlay_ir(nlayaero)) 1143 IF(.NOT.ALLOCATED(optprop_aeronlay_vis)) ALLOCATE(optprop_aeronlay_vis(nlayaero)) 1134 IF(.NOT.ALLOCATED(aeronlay_tauref)) ALLOCATE(aeronlay_tauref(nlayaero)) 1135 IF(.NOT.ALLOCATED(aeronlay_lamref)) ALLOCATE(aeronlay_lamref(nlayaero)) 1136 IF(.NOT.ALLOCATED(aeronlay_choice)) ALLOCATE(aeronlay_choice(nlayaero)) 1137 IF(.NOT.ALLOCATED(aeronlay_pbot)) ALLOCATE(aeronlay_pbot(nlayaero)) 1138 IF(.NOT.ALLOCATED(aeronlay_ptop)) ALLOCATE(aeronlay_ptop(nlayaero)) 1139 IF(.NOT.ALLOCATED(aeronlay_sclhght)) ALLOCATE(aeronlay_sclhght(nlayaero)) 1140 IF(.NOT.ALLOCATED(aeronlay_size)) ALLOCATE(aeronlay_size(nlayaero)) 1141 IF(.NOT.ALLOCATED(aeronlay_nueff)) ALLOCATE(aeronlay_nueff(nlayaero)) 1142 IF(.NOT.ALLOCATED(optprop_aeronlay_ir)) ALLOCATE(optprop_aeronlay_ir(nlayaero)) 1143 IF(.NOT.ALLOCATED(optprop_aeronlay_vis)) ALLOCATE(optprop_aeronlay_vis(nlayaero)) 1144 1144 1145 1145 if (is_master) write(*,*)trim(rname)//& … … 1161 1161 ": Generic n-layer aerosols: Vertical profile choice : " 1162 1162 write(*,*)trim(rname)//& 1163 " (1) Tau btwn ptop and pbot follows atm. scale height" 1163 " (1) Tau btwn ptop and pbot follows atm. scale height" 1164 1164 write(*,*)trim(rname)//& 1165 1165 " or (2) Tau above pbot follows its own scale height" … … 1214 1214 if (is_master) write(*,*)trim(rname)//& 1215 1215 ": optprop_aeronlay_ir = ",optprop_aeronlay_ir 1216 1216 1217 1217 1218 1218 !================================= … … 1250 1250 1251 1251 if (is_master) write(*,*)trim(rname)//": Generic Condensation of tracers ?" 1252 generic_condensation=.false. !default value 1252 generic_condensation=.false. !default value 1253 1253 call getin_p("generic_condensation",generic_condensation) 1254 1254 if (is_master) write(*,*)trim(rname)//": generic_condensation = ",generic_condensation 1255 1255 1256 1256 ! Test of incompatibility: 1257 1257 if (is_master) write(*,*)trim(rname)//": Spectral Dependant albedo ?" … … 1269 1269 call getin_p("albedosnow",albedosnow) 1270 1270 if (is_master) write(*,*)trim(rname)//": albedosnow = ",albedosnow 1271 1271 1272 1272 if (is_master) write(*,*)trim(rname)//": N2 ice albedo ?" 1273 1273 albedon2ice=0.5 ! default value … … 1331 1331 if (is_master) write(*,*)'New Cp from callfis is ',cpp,'J kg^-1 K^-1' 1332 1332 if (is_master) write(*,*)'New Mg from callfis is ',mugaz,'amu' 1333 1333 1334 1334 endif ! of if (cpp_mugaz_mode == 1) 1335 1335 call su_gases … … 1382 1382 ! initialize variables and allocate arrays in radcommon_h 1383 1383 call ini_radcommon_h(naerkind) 1384 1384 1385 1385 ! allocate "comsoil_h" arrays 1386 1386 call ini_comsoil_h(ngrid) 1387 1387 1388 1388 END SUBROUTINE inifis 1389 1389 -
trunk/LMDZ.PLUTO/libf/phypluto/physiq_mod.F90
r3196 r3197 19 19 use radinc_h, only : L_NSPECTI,L_NSPECTV,naerkind, corrkdir, banddir 20 20 use generic_cloud_common_h, only : epsi_generic, Psat_generic 21 use thermcell_mod, only: init_thermcell_mod22 21 use gases_h, only: gnom, gfrac 23 22 use radcommon_h, only: sigma, glat, grav, BWNV, WNOI, DWNI, DWNV, WNOV -
trunk/LMDZ.PLUTO/libf/phypluto/turbdiff_mod.F90
r3184 r3197 1 1 module turbdiff_mod 2 2 3 3 implicit none 4 4 5 5 contains 6 6 7 7 subroutine turbdiff(ngrid,nlay,nq, & 8 ptimestep,pcapcal, & 8 ptimestep,pcapcal, & 9 9 pplay,pplev,pzlay,pzlev,pz0, & 10 10 pu,pv,pt,ppopsk,pq,ptsrf,pemis,pqsurf, & … … 24 24 25 25 !================================================================== 26 ! 26 ! 27 27 ! Purpose 28 28 ! ------- 29 29 ! Turbulent diffusion (mixing) for pot. T, U, V and tracers 30 ! 30 ! 31 31 ! Implicit scheme 32 32 ! We start by adding to variables x the physical tendencies … … 34 34 ! 35 35 ! x(t+1) = x(t) + dt * (dx/dt)phys(t) + dt * (dx/dt)difv(t+1) 36 ! 36 ! 37 37 ! Authors 38 ! ------- 38 ! ------- 39 39 ! F. Hourdin, F. Forget, R. Fournier (199X) 40 40 ! R. Wordsworth, B. Charnay (2010) … … 43 43 ! by accounting for dissipation of turbulent kinetic energy. 44 44 ! - Accounting for lost mean flow kinetic energy should come soon. 45 ! 45 ! 46 46 !================================================================== 47 47 … … 75 75 ! Tracers 76 76 ! -------- 77 integer,intent(in) :: nq 77 integer,intent(in) :: nq 78 78 real,intent(in) :: pqsurf(ngrid,nq) 79 real,intent(in) :: pq(ngrid,nlay,nq), pdqfi(ngrid,nlay,nq) 80 real,intent(out) :: pdqdif(ngrid,nlay,nq) 81 real,intent(out) :: pdqsdif(ngrid,nq) 82 79 real,intent(in) :: pq(ngrid,nlay,nq), pdqfi(ngrid,nlay,nq) 80 real,intent(out) :: pdqdif(ngrid,nlay,nq) 81 real,intent(out) :: pdqsdif(ngrid,nq) 82 83 83 ! local 84 84 ! ----- … … 110 110 LOGICAL,SAVE :: firstcall=.true. 111 111 !$OMP THREADPRIVATE(firstcall) 112 112 113 113 ! Tracers 114 114 ! ------- … … 130 130 real cd0, roughratio 131 131 132 real dqsdif_total(ngrid) 133 real zq0(ngrid) 132 real dqsdif_total(ngrid) 133 real zq0(ngrid) 134 134 135 135 … … 199 199 ! 200 200 ! Source of turbulent kinetic energy at the surface 201 ! ------------------------------------------------- 201 ! ------------------------------------------------- 202 202 ! Formula is Cd_0 = (karman / log[1+z1/z0])^2 203 203 … … 210 210 if(nosurf)then 211 211 zcdv_true(ig)=0.D+0 !JL12 disable atm/surface momentum flux 212 zcdh_true(ig)=0.D+0 !JL12 disable sensible heat flux 212 zcdh_true(ig)=0.D+0 !JL12 disable sensible heat flux 213 213 endif 214 214 ENDDO … … 221 221 222 222 ! Turbulent diffusion coefficients in the boundary layer 223 ! ------------------------------------------------------ 224 225 call vdif_kc(ngrid,nlay,ptimestep,g,pzlev,pzlay,pu,pv,zh,zcdv_true,pq2,zkv,zkh) !JL12 why not call vdif_kc with updated winds and temperature 226 223 ! ------------------------------------------------------ 224 225 call vdif_kc(ngrid,nlay,ptimestep,g,pzlev,pzlay,pu,pv,zh,zcdv_true,pq2,zkv,zkh) !JL12 why not call vdif_kc with updated winds and temperature 226 227 227 ! Adding eddy mixing to mimic 3D general circulation in 1D 228 228 ! R. Wordsworth & F. Forget (2010) … … 246 246 ! do ig=1,ngrid 247 247 ! zkh(ig,ilev) = max(kzz_eddy(ilev),zkh(ig,ilev)) 248 ! zkv(ig,ilev) = max(kzz_eddy(ilev),zkv(ig,ilev)) 248 ! zkv(ig,ilev) = max(kzz_eddy(ilev),zkv(ig,ilev)) 249 249 ! end do 250 250 251 251 do ig=1,ngrid 252 252 zkh(ig,ilev) = max(kmixmin,zkh(ig,ilev)) 253 zkv(ig,ilev) = max(kmixmin,zkv(ig,ilev)) 253 zkv(ig,ilev) = max(kmixmin,zkv(ig,ilev)) 254 254 end do 255 255 end do … … 263 263 !JL12 calculate the flux coefficients (tables multiplied elements by elements) 264 264 zfluxv(1:ngrid,1:nlay)=zkv(1:ngrid,1:nlay)*zb0(1:ngrid,1:nlay) 265 265 266 266 !----------------------------------------------------------------------- 267 267 ! 4. Implicit inversion of u … … 312 312 313 313 DO ig=1,ngrid 314 z1(ig)=1./(zmass(ig,nlay)+zfluxv(ig,nlay)) 314 z1(ig)=1./(zmass(ig,nlay)+zfluxv(ig,nlay)) 315 315 zcv(ig,nlay)=zmass(ig,nlay)*zv(ig,nlay)*z1(ig) 316 316 zdv(ig,nlay)=zfluxv(ig,nlay)*z1(ig) … … 412 412 DO ig=1,ngrid 413 413 z1(ig)=pcapcal(ig)*ptsrf(ig)+cpp*zfluxt(ig,1)*zct(ig,1)*zovExner(ig,1) & 414 + pfluxsrf(ig)*ptimestep + zdplanck(ig)*ptsrf(ig) 415 z2(ig) = pcapcal(ig)+zdplanck(ig)+cpp*zfluxt(ig,1)*(1.-zovExner(ig,1)*zdt(ig,1)) 414 + pfluxsrf(ig)*ptimestep + zdplanck(ig)*ptsrf(ig) 415 z2(ig) = pcapcal(ig)+zdplanck(ig)+cpp*zfluxt(ig,1)*(1.-zovExner(ig,1)*zdt(ig,1)) 416 416 ztsrf(ig) = z1(ig) / z2(ig) 417 417 pdtsrf(ig) = (ztsrf(ig) - ptsrf(ig))/ptimestep 418 418 zt(ig,1) = zct(ig,1) + zdt(ig,1)*ztsrf(ig) 419 419 ENDDO 420 ! JL12 note that the black body radiative flux emitted by the surface has been updated by the implicit scheme 420 ! JL12 note that the black body radiative flux emitted by the surface has been updated by the implicit scheme 421 421 422 422 … … 448 448 ! Implicit inversion of q 449 449 ! ----------------------- 450 do iq=1,nq 450 do iq=1,nq 451 451 452 452 if (iq.ne.ivap) then … … 456 456 zcq(ig,nlay)=zmass(ig,nlay)*zq(ig,nlay,iq)*z1(ig) 457 457 zdq(ig,nlay)=zfluxq(ig,nlay)*z1(ig) 458 ENDDO 459 458 ENDDO 459 460 460 DO ilay=nlay-1,2,-1 461 461 DO ig=1,ngrid … … 466 466 ENDDO 467 467 468 do ig=1,ngrid 469 z1(ig)=1./(zmass(ig,1)+zfluxq(ig,2)*(1.-zdq(ig,2))) 470 zcq(ig,1)=(zmass(ig,1)*zq(ig,1,iq)+zfluxq(ig,2)*zcq(ig,2)+(-pdqsdif(ig,iq))*ptimestep)*z1(ig) 471 ! tracer flux from surface 472 ! currently pdqsdif always zero here, 473 ! so last line is superfluous 474 enddo 475 468 476 ! Starting upward calculations for simple tracer mixing (e.g., dust) 469 477 do ig=1,ngrid … … 483 491 ! and assuming an infinite source of water on the ground 484 492 ! ------------------------------------------------------------------ 485 493 486 494 endif ! tracer 487 495 … … 498 506 enddo 499 507 enddo 500 508 501 509 DO ig=1,ngrid ! computing sensible heat flux (atm => surface) 502 510 sensibFlux(ig)=cpp*zfluxt(ig,1)/ptimestep*(zt(ig,1)*zovExner(ig,1)-ztsrf(ig)) … … 511 519 enddo 512 520 enddo 513 endif 521 endif 514 522 end subroutine turbdiff 515 523 516 524 end module turbdiff_mod
Note: See TracChangeset
for help on using the changeset viewer.