- Timestamp:
- Oct 16, 2020, 9:40:05 AM (4 years ago)
- Location:
- trunk/LMDZ.MARS
- Files:
-
- 1 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.MARS/README
r2416 r2417 3170 3170 + Resolved Ticket #61 : add comments in the code and in the output file to make the program more 3171 3171 transparent for the users 3172 3173 == 16/10/2020 == EM 3174 Add a new scheme to handle the dust and its radiative impact. Triggered using 3175 a new flag dustscaling_mode=2 (dustscaling_mod=0: no rescaling at all, and 3176 dustscaling_mode=1: full rescaling using tauscaling, GCMv5.3 style). Rescaling 3177 is then only done on the radiative impact (see dust_scaling_mod.F90) of dust. 3178 Moreover the scaling factor "dust_rad_adjust" is evaluated using the target dust 3179 scenario opacity for the next sol and left to evolve linearly until then to not 3180 impose the diurnal evolution of dust. 3181 In practice, main changes or additions in the code are: 3182 - renamed flag "tauscaling_mode" as "dustscaling_mode" 3183 - moved parameter "t_scenario_sol" to "dust_param_mod" 3184 - adapted "compute_dustscaling" routine in "dust_scaling_mod" 3185 - added module "dust_rad_adjust_mod" 3186 - 2D fields "dust_rad_adjust_prev" and "dust_rad_adjust_next" required to 3187 compute coefficient "dust_rad_adjust" need to be stored in (re)startfi files -
trunk/LMDZ.MARS/libf/phymars/aeropacity_mod.F
r2415 r2417 10 10 11 11 SUBROUTINE aeropacity(ngrid,nlayer,nq,zday,pplay,pplev,ls, 12 & pq,tauscaling, tau_pref_scenario,tau_pref_gcm,12 & pq,tauscaling,dust_rad_adjust,tau_pref_scenario,tau_pref_gcm, 13 13 & tau,taucloudtes,aerosol,dsodust,reffrad, 14 14 & QREFvis3d,QREFir3d,omegaREFir3d, … … 36 36 & iaer_topdust_doubleq 37 37 use dust_param_mod, only: odpref, freedust 38 use dust_scaling_mod, only: compute_ tauscaling38 use dust_scaling_mod, only: compute_dustscaling 39 39 IMPLICIT NONE 40 40 c======================================================================= … … 105 105 ! topdust, false to compute RT in the topdust 106 106 REAL, INTENT(IN) :: alpha_hmons(ngrid) 107 REAL, INTENT(OUT) :: tauscaling(ngrid) ! Scaling factor for qdust and Ndust 107 REAL,INTENT(OUT) :: tauscaling(ngrid) ! Scaling factor for qdust and Ndust 108 REAL,INTENT(OUT) :: dust_rad_adjust(ngrid) ! Radiative adjustment 109 ! factor for dust 108 110 REAL,INTENT(IN) :: totcloudfrac(ngrid) ! total water ice cloud fraction 109 111 LOGICAL,INTENT(IN) :: clearsky ! true to compute RT without water ice clouds … … 720 722 721 723 ! 722 ! 3.1. Compute "tauscaling", the dust rescaling coefficient and adjust 723 ! aerosol() dust opacities accordingly 724 call compute_tauscaling(ngrid,nlayer,naerkind,naerdust,zday,pplev, 725 & tau_pref_scenario,tauscaling,aerosol) 724 ! 3.1. Compute "tauscaling" and "dust_rad_adjust", the dust rescaling 725 ! coefficients and adjust aerosol() dust opacities accordingly 726 call compute_dustscaling(ngrid,nlayer,naerkind,naerdust,zday,pplev 727 & ,tau_pref_scenario,tauscaling, 728 & dust_rad_adjust,aerosol) 726 729 727 730 ! 3.2. Recompute tau_pref_gcm, the reference dust opacity, based on dust tracer -
trunk/LMDZ.MARS/libf/phymars/callradite_mod.F
r2415 r2417 9 9 $ dtlw,dtsw,fluxsurf_lw,fluxsurf_sw,fluxtop_lw, 10 10 $ fluxtop_sw,tau_pref_scenario,tau_pref_gcm, 11 & tau,aerosol,dsodust,tauscaling, 11 & tau,aerosol,dsodust,tauscaling,dust_rad_adjust, 12 12 $ taucloudtes,rdust,rice,nuice,co2ice,rstormdust,rtopdust, 13 13 $ totstormfract,clearatm,dsords,dsotop,alpha_hmons,nohmons, … … 177 177 REAL,INTENT(INOUT) :: tauscaling(ngrid) ! Conversion factor for 178 178 ! qdust and Ndust 179 REAL,INTENT(OUT) :: dust_rad_adjust(ngrid) ! Radiative adjustment 180 ! factor for dust 179 181 REAL,INTENT(IN) :: albedo(ngrid,2),emis(ngrid) 180 182 REAL,INTENT(IN) :: ls,zday … … 426 428 c Computing aerosol optical depth in each layer: 427 429 CALL aeropacity(ngrid,nlayer,nq,zday,pplay,pplev,ls, 428 & pq,tauscaling, tau_pref_scenario,tau_pref_gcm,430 & pq,tauscaling,dust_rad_adjust,tau_pref_scenario,tau_pref_gcm, 429 431 & tau,taucloudtes,aerosol,dsodust,reffrad, 430 432 & QREFvis3d,QREFir3d,omegaREFir3d, -
trunk/LMDZ.MARS/libf/phymars/compute_dtau_mod.F90
r2415 r2417 5 5 REAL,SAVE :: ti_injection_sol ! time of beginning injection 6 6 REAL,SAVE :: tf_injection_sol ! time of end injection 7 REAL,PARAMETER :: t_scenario_sol=14/24. ! time of day at which8 ! tau_pref_scenario is deemed exact9 7 10 8 REAL,SAVE,ALLOCATABLE :: dtau(:) ! Dust opacity difference (at 610Pa) … … 22 20 USE tracer_mod, only: alpha_lift,igcm_dust_mass,igcm_dust_number 23 21 USE dimradmars_mod, only: tauvis 24 USE dust_param_mod, only: odpref 22 USE dust_param_mod, only: odpref, t_scenario_sol 25 23 26 24 IMPLICIT NONE -
trunk/LMDZ.MARS/libf/phymars/conf_phys.F
r2413 r2417 47 47 use dust_param_mod, only: dustbin, doubleq, submicron, active, 48 48 & lifting, freedust, callddevil, 49 & tauscaling_mode49 & dustscaling_mode 50 50 use aeropacity_mod, only: iddist, topdustref 51 51 IMPLICIT NONE … … 432 432 ! dust rescaling mode (if any) 433 433 if (freedust) then 434 tauscaling_mode=0434 dustscaling_mode=0 435 435 else 436 tauscaling_mode=1 ! GCMv5.3 style437 endif 438 call getin_p(" tauscaling_mode",tauscaling_mode)439 write(*,*) " tauscaling_mode=",tauscaling_mode436 dustscaling_mode=1 ! GCMv5.3 style 437 endif 438 call getin_p("dustscaling_mode",dustscaling_mode) 439 write(*,*) "dustscaling_mode=",dustscaling_mode 440 440 441 441 #ifndef MESOSCALE -
trunk/LMDZ.MARS/libf/phymars/dust_param_mod.F90
r2415 r2417 15 15 16 16 REAL,SAVE,ALLOCATABLE :: tauscaling(:) ! Convertion factor for qdust and Ndust 17 INTEGER,SAVE :: tauscaling_mode ! =0, no rescaling (freedust) 18 ! =1, prescribed scaling GCM5.3 style 17 INTEGER,SAVE :: dustscaling_mode ! dust scaling modes 18 ! =0, no rescaling (freedust) 19 ! =1, prescribed scaling GCM5.3 style (using tauscaling) 20 ! =2, only radiative scaling (using dust_rad_adjust) 21 REAL,SAVE,ALLOCATABLE :: dust_rad_adjust(:) ! radiative scaling for dust 22 REAL,PARAMETER :: t_scenario_sol=14/24. ! time of day (sol) at which 23 ! tau_pref_scenario is deemed exact 19 24 20 25 contains … … 25 30 26 31 allocate(tauscaling(ngrid)) 32 allocate(dust_rad_adjust(ngrid)) 27 33 28 34 end subroutine ini_dust_param_mod … … 32 38 33 39 if (allocated(tauscaling)) deallocate(tauscaling) 40 if (allocated(dust_rad_adjust)) deallocate(dust_rad_adjust) 34 41 35 42 end subroutine end_dust_param_mod -
trunk/LMDZ.MARS/libf/phymars/dust_scaling_mod.F90
r2415 r2417 5 5 contains 6 6 7 subroutine compute_tauscaling(ngrid,nlayer,naerkind,naerdust, & 8 zday,pplev, & 9 tau_pref_scenario,tauscaling,aerosol) 7 subroutine compute_dustscaling(ngrid,nlayer,naerkind,naerdust, & 8 zday,pplev, & 9 tau_pref_scenario,tauscaling, & 10 dust_rad_adjust,aerosol) 10 11 11 use dust_param_mod, only: tauscaling_mode, odpref 12 use dust_param_mod, only: dustscaling_mode, odpref 13 use dust_rad_adjust_mod, only: compute_dust_rad_adjust 12 14 use dimradmars_mod, only: iaerdust ! dust aerosol indexes 13 15 … … 23 25 ! opacity column at odpref reference pressure 24 26 real,intent(out) :: tauscaling(ngrid) ! dust scaling factor 27 real,intent(out) :: dust_rad_adjust(ngrid) ! Radiative adjustment 28 ! factor for dust 25 29 real,intent(inout) :: aerosol(ngrid,nlayer,naerkind) ! opacities 26 30 27 31 integer :: ig, l , iaer 28 32 real :: taudust(ngrid) 29 33 30 34 ! 1. compute/set tauscaling 31 35 32 if ( tauscaling_mode == 0) then33 ! simple "freedust" case, no rescaling, ever36 if (dustscaling_mode /= 1) then 37 ! simple "freedust" case, no effective rescaling using tauscaling, ever 34 38 tauscaling(:) = 1 35 39 endif 36 40 37 if (tauscaling_mode == 1) then 38 ! GCM v5.3 style: tauscaling is computed so that 39 ! aerosol() opacities correspond to the prescribed tau_pref_scenario() 40 41 ! 1. compute dust column opacity using aerosol() dusts 41 if (dustscaling_mode == 1) then 42 ! Compute dust column opacity using aerosol() dusts 42 43 taudust(:) = 0 43 44 do iaer=1,naerdust ! loop on all dust aerosols … … 48 49 enddo 49 50 enddo 50 51 ! 2. compute the scaling factor 52 tauscaling(:)=tau_pref_scenario(:)*pplev(:,1)/odpref/taudust(:) 53 endif ! of if (tauscaling_mode == 1) 54 55 ! 2. dust opacities rescaling 56 do iaer=1,naerdust 51 52 elseif (dustscaling_mode == 2) then 53 ! Compute dust column opacity using only background dust 54 taudust(:) = 0 57 55 do l=1,nlayer 58 56 do ig=1,ngrid 57 taudust(ig)=taudust(ig)+aerosol(ig,l,iaerdust(1)) 58 enddo 59 enddo 60 61 endif ! of if (dustscaling_mode == 1) elseif (dustscaling_mode == 2) 62 63 ! 2. compute the scaling factors (tauscaling or dust_rad_adjust) 64 if (dustscaling_mode==1) then 65 ! GCM v5.3 style: tauscaling is computed so that 66 ! aerosol() opacities correspond to the prescribed tau_pref_scenario() 67 tauscaling(:)=tau_pref_scenario(:)*pplev(:,1)/odpref/taudust(:) 68 elseif (dustscaling_mode==2) then 69 ! GCM v6 style, compute dust_rad_adjust 70 call compute_dust_rad_adjust(ngrid,nlayer,zday,pplev, & 71 taudust,dust_rad_adjust) 72 endif 73 74 ! 3. Apply dust aerosol opacities rescaling 75 if (dustscaling_mode <=1) then 76 do iaer=1,naerdust 77 do l=1,nlayer 78 do ig=1,ngrid 59 79 aerosol(ig,l,iaerdust(iaer)) = max(1E-20, & 60 80 aerosol(ig,l,iaerdust(iaer))* tauscaling(ig)) 81 enddo 61 82 enddo 62 83 enddo 63 enddo 64 65 end subroutine compute_tauscaling 84 else ! duscaling_mode==2, use dust_rad_adjust 85 do iaer=1,naerdust 86 do l=1,nlayer 87 do ig=1,ngrid 88 aerosol(ig,l,iaerdust(iaer)) = max(1E-20, & 89 aerosol(ig,l,iaerdust(iaer))*dust_rad_adjust(ig)) 90 enddo 91 enddo 92 enddo 93 endif 94 end subroutine compute_dustscaling 66 95 67 96 end module dust_scaling_mod -
trunk/LMDZ.MARS/libf/phymars/phyetat0_mod.F90
r2378 r2417 18 18 use nonoro_gwd_ran_mod, only: du_nonoro_gwd, dv_nonoro_gwd 19 19 use compute_dtau_mod, only: dtau 20 20 use dust_rad_adjust_mod, only: dust_rad_adjust_prev,dust_rad_adjust_next 21 use dust_param_mod, only: dustscaling_mode 21 22 USE ioipsl_getin_p_mod, ONLY : getin_p 22 23 … … 411 412 minval(tauscaling), maxval(tauscaling) 412 413 414 ! dust_rad_adjust_* for radiative rescaling of dust 415 if (dustscaling_mode==2) then 416 if (startphy_file) then 417 call get_field("dust_rad_adjust_prev",dust_rad_adjust_prev,found,indextime) 418 if (.not.found) then 419 write(*,*) "phyetat0: <dust_rad_adjust_prev> not in file; set to 1" 420 dust_rad_adjust_prev(:) = 1 421 endif 422 call get_field("dust_rad_adjust_next",dust_rad_adjust_next,found,indextime) 423 if (.not.found) then 424 write(*,*) "phyetat0: <dust_rad_adjust_next> not in file; set to 1" 425 dust_rad_adjust_next(:) = 1 426 endif 427 else 428 dust_rad_adjust_prev(:)= 0 429 dust_rad_adjust_next(:)= 0 430 endif ! if (startphy_file) 431 write(*,*) "phyetat0: radiative scaling coeff <dust_rad_adjust_prev> range:", & 432 minval(dust_rad_adjust_prev), maxval(dust_rad_adjust_prev) 433 write(*,*) "phyetat0: radiative scaling coeff <dust_rad_adjust_next> range:", & 434 minval(dust_rad_adjust_next), maxval(dust_rad_adjust_next) 435 endif ! of if (dustscaling_mode==2) 413 436 414 437 ! dtau: opacity difference between GCM and dust scenario -
trunk/LMDZ.MARS/libf/phymars/phyredem.F90
r2312 r2417 157 157 use nonoro_gwd_ran_mod, only: du_nonoro_gwd, dv_nonoro_gwd 158 158 use compute_dtau_mod, only: dtau 159 use dust_rad_adjust_mod, only: dust_rad_adjust_prev,dust_rad_adjust_next 160 use dust_param_mod, only: dustscaling_mode 159 161 160 162 implicit none … … 229 231 call put_field("tauscaling","dust conversion factor",tauscaling,time) 230 232 233 ! Radiative scaling coefficients 234 if (dustscaling_mode==2) then 235 call put_field("dust_rad_adjust_prev", & 236 "radiative dust adjustement factor prev. sol", & 237 dust_rad_adjust_prev,time) 238 call put_field("dust_rad_adjust_next", & 239 "radiative dust adjustement factor next sol", & 240 dust_rad_adjust_next,time) 241 endif 242 231 243 if (dustinjection.gt.0) then 232 244 call put_field("dtau","dust opacity difference between GCM and scenario",& -
trunk/LMDZ.MARS/libf/phymars/phys_state_var_init_mod.F90
r2409 r2417 62 62 use dust_param_mod, only: ini_dust_param_mod, & 63 63 end_dust_param_mod 64 64 use dust_rad_adjust_mod, only: ini_dust_rad_adjust_mod, & 65 end_dust_rad_adjust_mod 65 66 IMPLICIT NONE 66 67 … … 161 162 call end_dust_param_mod 162 163 call ini_dust_param_mod(ngrid) 164 165 ! allocate arrays in "dust_rad_adjust_mod" 166 call end_dust_rad_adjust_mod 167 call ini_dust_rad_adjust_mod(ngrid) 163 168 164 169 END SUBROUTINE phys_state_var_init -
trunk/LMDZ.MARS/libf/phymars/physiq_mod.F
r2415 r2417 59 59 & iaer_stormdust_doubleq 60 60 use dust_param_mod, only: doubleq, lifting, callddevil, 61 & tauscaling, odpref, dustbin 61 & tauscaling, odpref, dustbin, 62 & dustscaling_mode, dust_rad_adjust 62 63 use turb_mod, only: q2, wstar, ustar, sensibFlux, 63 64 & zmax_th, hfmax_th, turb_resolved … … 931 932 & zdtlw,zdtsw,fluxsurf_lw,fluxsurf_sw,fluxtop_lw, 932 933 & fluxtop_sw,tau_pref_scenario,tau_pref_gcm, 933 & tau,aerosol,dsodust,tauscaling, 934 & tau,aerosol,dsodust,tauscaling,dust_rad_adjust, 934 935 & taucloudtes,rdust,rice,nuice,co2ice,rstormdust,rtopdust, 935 936 & totstormfract,clearatm,dsords,dsotop,alpha_hmons,nohmons, … … 948 949 & fluxsurf_swclf,fluxtop_lwclf,fluxtop_swclf, 949 950 & tau_pref_scenario,tau_pref_gcm, 950 & tau,aerosol,dsodust,tauscaling,taucloudtesclf,rdust, 951 & tau,aerosol,dsodust,tauscaling,dust_rad_adjust, 952 & taucloudtesclf,rdust, 951 953 & rice,nuice,co2ice,rstormdust,rtopdust,totstormfract, 952 954 & clearatm,dsords,dsotop,alpha_hmons,nohmons, … … 1137 1139 & clearatm,icount,zday,zls, 1138 1140 & tsurf,igout,totstormfract, 1139 & tauscaling, 1141 & tauscaling,dust_rad_adjust, 1140 1142 c input sub-grid scale cloud 1141 1143 & clearsky,totcloudfrac, … … 1204 1206 & zzlay,zdtsw,zdtlw, 1205 1207 & icount,zday,zls,tsurf,igout,aerosol, 1206 & tauscaling,totstormfract,clearatm, 1208 & tauscaling,dust_rad_adjust, 1209 & totstormfract,clearatm, 1207 1210 & clearsky,totcloudfrac, 1208 1211 & nohmons,hsummit, … … 2853 2856 call WRITEDIAGFI(ngrid,'lw_htrt','lw heat. rate', 2854 2857 & 'w.m-2',3,zdtlw) 2855 2858 call writediagfi(ngrid,"local_time","Local time", 2859 & 'sol',2,local_time) 2856 2860 if (.not.activice) then 2857 2861 CALL WRITEDIAGFI(ngrid,'tauTESap', … … 3232 3236 end select 3233 3237 endif ! (slpwind) 3238 3239 if (dustscaling_mode==2) then 3240 call writediagfi(ngrid,"dust_rad_adjust", 3241 & "radiative adjustment coefficient for dust", 3242 & "",2,dust_rad_adjust) 3243 endif 3234 3244 3235 3245 if (scavenging) then -
trunk/LMDZ.MARS/libf/phymars/rocketduststorm_mod.F90
r2415 r2417 24 24 clearatm,icount,zday,zls, & 25 25 tsurf,igout,totstormfract, & 26 tauscaling, 26 tauscaling,dust_rad_adjust, & 27 27 ! input sub-grid scale cloud 28 28 clearsky,totcloudfrac, & … … 77 77 REAL, INTENT(IN) :: totstormfract(ngrid) 78 78 REAL, INTENT(INOUT) :: tauscaling(ngrid) 79 REAL,INTENT(OUT) :: dust_rad_adjust(ngrid) 79 80 80 81 ! sbgrid scale water ice clouds … … 249 250 zdtlw1,zdtsw1,fluxsurf_lw1,fluxsurf_sw1,fluxtop_lw1, & 250 251 fluxtop_sw1,tau_pref_scenario,tau_pref_gcm, & 251 tau,aerosol,dsodust,tauscaling, &252 tau,aerosol,dsodust,tauscaling,dust_rad_adjust, & 252 253 taucloudtes,rdust,rice,nuice,co2ice,rstormdust,rtopdust, & 253 254 totstormfract,clearatm,dsords,dsotop,alpha_hmons,nohmons,& -
trunk/LMDZ.MARS/libf/phymars/topmons_mod.F90
r2415 r2417 24 24 ! input for radiative transfer 25 25 icount,zday,zls,tsurf,igout,aerosol, & 26 tauscaling, 26 tauscaling,dust_rad_adjust, & 27 27 ! input sub-grid scale rocket dust storm 28 28 totstormfract,clearatm, & … … 76 76 INTEGER, INTENT(IN) :: igout 77 77 REAL, INTENT(INOUT) :: tauscaling(ngrid) 78 REAL,INTENT(OUT) :: dust_rad_adjust(ngrid) 78 79 ! input sub-grid scale rocket dust storm 79 80 LOGICAL, INTENT(IN) :: clearatm … … 275 276 zdtlw1,zdtsw1,fluxsurf_lw1,fluxsurf_sw1,fluxtop_lw1, & 276 277 fluxtop_sw1,tau_pref_scenario,tau_pref_gcm, & 277 tau,aerosol,dsodust,tauscaling, &278 tau,aerosol,dsodust,tauscaling,dust_rad_adjust, & 278 279 taucloudtes,rdust,rice,nuice,co2ice,rstormdust,rtopdust, & 279 280 totstormfract,clearatm,dsords,dsotop,alpha_hmons,nohmons,&
Note: See TracChangeset
for help on using the changeset viewer.