88! !
99! ###########################################################################################
1010module GFS_cosp
11- use machine, only: kind_phys
12- use mod_cosp, only: cosp_outputs, cosp_optical_inputs, cosp_column_inputs,&
13- cosp_simulator
14- use mod_cosp_config, only: R_UNDEF_COSP = > R_UNDEF, nHydro = > N_HYDRO
15- use mod_cosp_modis_interface, only: cosp_modis_init
16- use mod_cosp_misr_interface, only: cosp_misr_init
17- use mod_cosp_isccp_interface, only: cosp_isccp_init
18- use mod_rng, only: rng_state, init_rng
19- use mod_scops, only: scops
20- use mod_prec_scops, only: prec_scops
11+ use machine, only: kind_phys
12+ use mod_cosp, only: cosp_outputs, cosp_optical_inputs, cosp_column_inputs
13+
2114 implicit none
2215
2316 real (kind_phys), parameter :: R_UNDEF = 0._kind_phys
2417 real (kind_phys), parameter :: emsfc_lw = 0.99_kind_phys ! longwave emissivity of surface at 10.5 microns
2518
26- !
27- integer ,parameter :: &
28- I_LSCLIQ = 1 , & ! Large-scale (stratiform) liquid
29- I_LSCICE = 2 , & ! Large-scale (stratiform) ice
30- I_LSRAIN = 3 , & ! Large-scale (stratiform) rain
31- I_LSSNOW = 4 , & ! Large-scale (stratiform) snow
32- I_CVCLIQ = 5 , & ! Convective liquid
33- I_CVCICE = 6 , & ! Convective ice
34- I_CVRAIN = 7 , & ! Convective rain
35- I_CVSNOW = 8 , & ! Convective snow
36- I_LSGRPL = 9 ! Large-scale (stratiform) groupel
37-
38- ! Stratiform and convective clouds in frac_out (scops output).
39- integer , parameter :: &
40- I_LSC = 1 , & ! Large-scale clouds
41- I_CVC = 2 ! Convective clouds
42-
4319contains
4420
4521! ###########################################################################################
@@ -57,6 +33,12 @@ module GFS_cosp
5733 subroutine GFS_cosp_init (mpirank , mpiroot , do_cosp , do_isccp , do_misr , do_modis , &
5834 cosp_nsubcol , imp_physics , imp_physics_thompson , imp_physics_gfdl , isccp_topht , &
5935 isccp_topht_dir , errmsg , errflg )
36+ use mod_cosp_config, only: modis_histTau, modis_histTauEdges, modis_histTauCenters
37+ use mod_cosp_config, only: numMODISTauBins, ntau
38+ use mod_cosp_config, only: tau_binBounds, tau_binEdges, tau_binCenters
39+ use mod_cosp_modis_interface, only: cosp_modis_init
40+ use mod_cosp_misr_interface, only: cosp_misr_init
41+ use mod_cosp_isccp_interface, only: cosp_isccp_init
6042
6143 ! Inputs
6244 logical , intent (in ) :: &
@@ -92,6 +74,14 @@ subroutine GFS_cosp_init(mpirank, mpiroot, do_cosp, do_isccp, do_misr, do_modis,
9274 call cosp_isccp_init(isccp_topht, isccp_topht_dir)
9375 endif
9476 if (do_modis) then
77+ ! Initialize MODIS optical-depth bin boundaries for joint-histogram. (defined in cosp_config.F90)
78+ if (.not. allocated (modis_histTau)) then
79+ allocate (modis_histTau(ntau+1 ),modis_histTauEdges(2 ,ntau),modis_histTauCenters(ntau))
80+ numMODISTauBins = ntau
81+ modis_histTau = tau_binBounds
82+ modis_histTauEdges = tau_binEdges
83+ modis_histTauCenters = tau_binCenters
84+ endif
9585 call cosp_modis_init()
9686 endif
9787 if (do_misr) then
@@ -135,7 +125,12 @@ subroutine GFS_cosp_run(nCol, nLay, cosp_nlvgrid, cosp_nsubcol, tsfc, coszen, sl
135125 n_misr_hgt_bins , misr_hgt_bins , n_misr_tau_bins , misr_tau_bins , doSWrad , doLWrad , &
136126 do_cosp , do_isccp , do_misr , do_modis , overlap , &
137127 f1isccp_cosp , cldtot_isccp , meancldalb_isccp , meanptop_isccp , meantau_isccp , &
138- meantb_isccp , meantbclr_isccp , tau_isccp , cldptop_isccp , errmsg , errflg )
128+ meantb_isccp , meantbclr_isccp , tau_isccp , cldptop_isccp , &
129+ clt_modis , clw_modis , cli_modis , clh_modis , clm_modis , cll_modis , taut_modis , &
130+ tauw_modis , taui_modis , tautlog_modis , tauwlog_modis , tauilog_modis , reffclw_modis , &
131+ reffcli_modis , pct_modis , lwp_modis , iwp_modis , cl_modis , clri_modis , clrl_modis , &
132+ errmsg , errflg )
133+ use mod_cosp, only: cosp_simulator
139134
140135 ! Inputs
141136 logical , intent (in ) :: &
@@ -206,7 +201,10 @@ subroutine GFS_cosp_run(nCol, nLay, cosp_nlvgrid, cosp_nsubcol, tsfc, coszen, sl
206201 integer , intent (out ) :: &
207202 errflg ! CCPP error flag
208203 real (kind_phys), dimension (:,:,:), intent (out ) :: &
209- f1isccp_cosp ! ISCCP CFAD
204+ f1isccp_cosp, & ! ISCCP CFAD
205+ cl_modis, & ! MODIS CFAD
206+ clri_modis, & ! MODIS CFAD
207+ clrl_modis ! MODIS CFAD
210208 real (kind_phys), dimension (:,:), intent (out ) :: &
211209 tau_isccp, & ! ISCCP subcolumn optical-depth
212210 cldptop_isccp ! ISCCP subcolumn cloud-top pressure
@@ -216,7 +214,24 @@ subroutine GFS_cosp_run(nCol, nLay, cosp_nlvgrid, cosp_nsubcol, tsfc, coszen, sl
216214 meanptop_isccp, & ! ISCCP mean cloud-top pressure
217215 meantau_isccp, & ! ISCCP mean optical-depth
218216 meantb_isccp, & ! ISCCP mean brightness temperature
219- meantbclr_isccp ! ISCCP mean brightness temperature (clear-sky)
217+ meantbclr_isccp, & ! ISCCP mean brightness temperature (clear-sky)
218+ clt_modis, & ! MODIS
219+ clw_modis, & ! MODIS
220+ cli_modis, & ! MODIS
221+ clh_modis, & ! MODIS
222+ clm_modis, & ! MODIS
223+ cll_modis, & ! MODIS
224+ taut_modis, & ! MODIS
225+ tauw_modis, & ! MODIS
226+ taui_modis, & ! MODIS
227+ tautlog_modis, & ! MODIS
228+ tauwlog_modis, & ! MODIS
229+ tauilog_modis, & ! MODIS
230+ reffclw_modis, & ! MODIS
231+ reffcli_modis, & ! MODIS
232+ pct_modis, & ! MODIS
233+ lwp_modis, & ! MODIS
234+ iwp_modis ! MODIS
220235
221236 ! Local
222237 type (cosp_outputs) :: cospOUT
@@ -347,17 +362,81 @@ subroutine GFS_cosp_run(nCol, nLay, cosp_nlvgrid, cosp_nsubcol, tsfc, coszen, sl
347362 end do
348363 end do
349364 end if
365+ if (do_modis) then
366+ ! 1D
367+ where (sunlit(1 :nCol) .eq. 0 )
368+ cospOUT% modis_Cloud_Fraction_Total_Mean(1 :ncol) = 0._kind_phys
369+ cospOUT% modis_Cloud_Fraction_Water_Mean(1 :ncol) = 0._kind_phys
370+ cospOUT% modis_Cloud_Fraction_Ice_Mean(1 :ncol) = 0._kind_phys
371+ cospOUT% modis_Cloud_Fraction_High_Mean(1 :ncol) = 0._kind_phys
372+ cospOUT% modis_Cloud_Fraction_Mid_Mean(1 :ncol) = 0._kind_phys
373+ cospOUT% modis_Cloud_Fraction_Low_Mean(1 :ncol) = 0._kind_phys
374+ cospOUT% modis_Optical_Thickness_Total_Mean(1 :ncol) = 0._kind_phys
375+ cospOUT% modis_Optical_Thickness_Water_Mean(1 :ncol) = 0._kind_phys
376+ cospOUT% modis_Optical_Thickness_Ice_Mean(1 :ncol) = 0._kind_phys
377+ cospOUT% modis_Optical_Thickness_Total_LogMean(1 :ncol) = 0._kind_phys
378+ cospOUT% modis_Optical_Thickness_Water_LogMean(1 :ncol) = 0._kind_phys
379+ cospOUT% modis_Optical_Thickness_Ice_LogMean(1 :ncol) = 0._kind_phys
380+ cospOUT% modis_Cloud_Particle_Size_Water_Mean(1 :ncol) = 0._kind_phys
381+ cospOUT% modis_Cloud_Particle_Size_Ice_Mean(1 :ncol) = 0._kind_phys
382+ cospOUT% modis_Cloud_Top_Pressure_Total_Mean(1 :ncol) = 0._kind_phys
383+ cospOUT% modis_Liquid_Water_Path_Mean(1 :ncol) = 0._kind_phys
384+ cospOUT% modis_Ice_Water_Path_Mean(1 :ncol) = 0._kind_phys
385+ end where
386+ ! 3D
387+ do iprs= 1 ,n_modis_pres_bins
388+ do itau= 1 ,n_modis_tau_bins
389+ where (sunlit(1 :ncol) .eq. 0 )
390+ cospOUT% modis_Optical_Thickness_vs_Cloud_Top_Pressure(1 :ncol,itau,iprs) = 0._kind_phys
391+ end where
392+ enddo
393+ do itau= 1 ,n_modis_reffi_bins
394+ where (sunlit(1 :ncol) .eq. 0 )
395+ cospOUT% modis_Optical_Thickness_vs_ReffICE(1 :ncol,itau,iprs) = 0._kind_phys
396+ end where
397+ end do
398+ do itau= 1 ,n_modis_reffl_bins
399+ where (sunlit(1 :ncol) .eq. 0 )
400+ cospOUT% modis_Optical_Thickness_vs_ReffLIQ(1 :ncol,itau,iprs) = 0._kind_phys
401+ end where
402+ enddo
403+ enddo
404+ end if
350405
351406 ! Copy COSP outputs to host interstitials.
352- f1isccp_cosp = cospOUT% isccp_fq
353- tau_isccp = cospOUT% isccp_boxtau
354- cldptop_isccp = cospOUT% isccp_boxptop
355- cldtot_isccp = cospOUT% isccp_totalcldarea
356- meanptop_isccp = cospOUT% isccp_meanptop
357- meantau_isccp = cospOUT% isccp_meantaucld
358- meancldalb_isccp = cospOUT% isccp_meanalbedocld
359- meantb_isccp = cospOUT% isccp_meantb
360- meantbclr_isccp = cospOUT% isccp_meantbclr
407+ if (do_isccp) then
408+ f1isccp_cosp = cospOUT% isccp_fq
409+ tau_isccp = cospOUT% isccp_boxtau
410+ cldptop_isccp = cospOUT% isccp_boxptop
411+ cldtot_isccp = cospOUT% isccp_totalcldarea
412+ meanptop_isccp = cospOUT% isccp_meanptop
413+ meantau_isccp = cospOUT% isccp_meantaucld
414+ meancldalb_isccp = cospOUT% isccp_meanalbedocld
415+ meantb_isccp = cospOUT% isccp_meantb
416+ meantbclr_isccp = cospOUT% isccp_meantbclr
417+ endif
418+ if (do_modis) then
419+ clt_modis = cospOUT% modis_Cloud_Fraction_Total_Mean
420+ clw_modis = cospOUT% modis_Cloud_Fraction_Water_Mean
421+ cli_modis = cospOUT% modis_Cloud_Fraction_Ice_Mean
422+ clh_modis = cospOUT% modis_Cloud_Fraction_High_Mean
423+ clm_modis = cospOUT% modis_Cloud_Fraction_Mid_Mean
424+ cll_modis = cospOUT% modis_Cloud_Fraction_Low_Mean
425+ taut_modis = cospOUT% modis_Optical_Thickness_Total_Mean
426+ tauw_modis = cospOUT% modis_Optical_Thickness_Water_Mean
427+ taui_modis = cospOUT% modis_Optical_Thickness_Ice_Mean
428+ tautlog_modis = cospOUT% modis_Optical_Thickness_Total_LogMean
429+ tauwlog_modis = cospOUT% modis_Optical_Thickness_Water_LogMean
430+ tauilog_modis = cospOUT% modis_Optical_Thickness_Ice_LogMean
431+ reffclw_modis = cospOUT% modis_Cloud_Particle_Size_Water_Mean
432+ reffcli_modis = cospOUT% modis_Cloud_Particle_Size_Ice_Mean
433+ pct_modis = cospOUT% modis_Cloud_Top_Pressure_Total_Mean
434+ lwp_modis = cospOUT% modis_Liquid_Water_Path_Mean
435+ iwp_modis = cospOUT% modis_Ice_Water_Path_Mean
436+ cl_modis = cospOUT% modis_Optical_Thickness_vs_Cloud_Top_Pressure
437+ clri_modis = cospOUT% modis_Optical_Thickness_vs_ReffICE
438+ clrl_modis = cospOUT% modis_Optical_Thickness_vs_ReffLIQ
439+ endif
361440
362441 ! Clean up
363442 call destroy_cospIN(cospIN)
@@ -367,62 +446,6 @@ subroutine GFS_cosp_run(nCol, nLay, cosp_nlvgrid, cosp_nsubcol, tsfc, coszen, sl
367446 end subroutine GFS_cosp_run
368447! > @}
369448
370- ! ###########################################################################################
371- ! ! \section arg_table_GFS_cosp_timestep_finalize
372- ! ! \htmlinclude GFS_cosp_timestep_finalize.html
373- ! !
374- ! ###########################################################################################
375- subroutine GFS_cosp_timestep_finalize (do_cosp , doLWrad , doSWrad , do_isccp , f1isccp_cosp , &
376- f1isccp_cosp_avg , n_isccp_pres_bins , n_isccp_tau_bins , errmsg , errflg )
377- ! Inputs
378- logical , intent (in ) :: &
379- do_cosp, & ! Flag for COSP
380- do_isccp, & ! Flag for COSP ISCCP diagnostics
381- doLWrad, & ! Flag for LW radiation
382- doSWrad ! Flag for SW radiaiton
383- integer , intent (in ) :: &
384- n_isccp_pres_bins, & ! Number of pressure bins in ISCCP CFAD.
385- n_isccp_tau_bins ! Number of optical-depth bins in ISCCP CFAD.
386- real (kind_phys), dimension (:,:,:), intent (in ) :: &
387- f1isccp_cosp ! ISCCP CFAD
388-
389- ! Outputs
390- real (kind_phys), dimension (:,:), intent (out ) :: &
391- f1isccp_cosp_avg ! ISCCP CFAD (globally averaged)
392- character (len=* ), intent (out ) :: &
393- errmsg ! CCPP error message
394- integer , intent (out ) :: &
395- errflg ! CCPP error flag
396-
397- ! Locals
398- integer :: iprs, itau, iCol, count
399-
400- if (.not. do_cosp) return
401-
402- ! Only call COSP on radiation time-step.
403- if (.not. (doLWrad .or. doSWrad)) return
404-
405- ! Initialize CCPP error handling variables
406- errmsg = ' '
407- errflg = 0
408-
409- ! Compute spatially averaged diagnsotics for timestep.
410- if (do_isccp) then
411- do iprs= 1 ,n_isccp_pres_bins
412- do itau= 1 ,n_isccp_tau_bins
413- count = 0
414- do iCol= 1 ,size (f1isccp_cosp,dim= 3 )
415- if (f1isccp_cosp(iCol,iprs,itau) .ne. R_UNDEF) then
416- f1isccp_cosp_avg(iprs,itau) = f1isccp_cosp(iCol,iprs,itau)
417- count = count + 1
418- endif
419- end do
420- f1isccp_cosp_avg(iprs,itau) = f1isccp_cosp_avg(iprs,itau)/ count
421- end do
422- end do
423- endif
424-
425- end subroutine GFS_cosp_timestep_finalize
426449 ! #########################################################################################
427450 ! SUBROUTINE subsample_and_optics
428451 !
@@ -433,7 +456,11 @@ end subroutine GFS_cosp_timestep_finalize
433456 subroutine subsample_and_optics (nCol , nSubCol , nLay , do_isccp , do_misr , do_modis , &
434457 sfcP , cld_frac , ccld_frac , overlap , cldtau_lw , cldtau_sw , cld_liq , ccld_liq , cld_ice ,&
435458 cld_rain , cld_snow , cld_graupel , cld_reliq , cld_reice , cld_rerain , cld_resnow , cospIN )
436-
459+ use cosp_optics, only: modis_optics, modis_optics_partition
460+ use mod_scops, only: scops
461+ use mod_prec_scops, only: prec_scops
462+ use mod_rng, only: rng_state, init_rng
463+ use mod_cosp_config, only: nHydro = > N_HYDRO
437464 ! Inputs
438465 logical , intent (in ) :: &
439466 do_isccp, & ! Flag for COSP ISCCP diagnostics
@@ -483,6 +510,23 @@ subroutine subsample_and_optics(nCol, nSubCol, nLay, do_isccp, do_misr, do_modis
483510 real (kind_phys),dimension (:,:,:,:), allocatable :: &
484511 mr_hydro, Reff
485512
513+ !
514+ integer ,parameter :: &
515+ I_LSCLIQ = 1 , & ! Large-scale (stratiform) liquid
516+ I_LSCICE = 2 , & ! Large-scale (stratiform) ice
517+ I_LSRAIN = 3 , & ! Large-scale (stratiform) rain
518+ I_LSSNOW = 4 , & ! Large-scale (stratiform) snow
519+ I_CVCLIQ = 5 , & ! Convective liquid
520+ I_CVCICE = 6 , & ! Convective ice
521+ I_CVRAIN = 7 , & ! Convective rain
522+ I_CVSNOW = 8 , & ! Convective snow
523+ I_LSGRPL = 9 ! Large-scale (stratiform) groupel
524+
525+ ! Stratiform and convective clouds in frac_out (scops output).
526+ integer , parameter :: &
527+ I_LSC = 1 , & ! Large-scale clouds
528+ I_CVC = 2 ! Convective clouds
529+
486530 ! #####################################################################################
487531 !
488532 ! Set default values for optional MP arguments
@@ -647,6 +691,8 @@ subroutine subsample_and_optics(nCol, nSubCol, nLay, do_isccp, do_misr, do_modis
647691 ! 11-micron emissivity (in-cloud), needed by ISCCP simulator.
648692 ! ##################################################################################
649693 if (do_isccp) then
694+ ! Assume same radiative properties for stratiform and convective clouds
695+ ! True in current RRTMG and RRTMGP implementations
650696 cldemis_lw_strat = 1._kind_phys - exp (- cldtau_lw)
651697 cldemis_lw_conv = cldemis_lw_strat
652698 !
@@ -665,6 +711,8 @@ subroutine subsample_and_optics(nCol, nSubCol, nLay, do_isccp, do_misr, do_modis
665711 ! 0.67 micron optical-depth (in-cloud), needed by ISCCP, MISR and MODIS simulators.
666712 ! ##################################################################################
667713 if (do_isccp .or. do_modis .or. do_misr) then
714+ ! Assume same radiative properties for stratiform and convective clouds
715+ ! True in current RRTMG and RRTMGP implementations
668716 cldtau_sw_strat = cldtau_sw
669717 cldtau_sw_conv = cldtau_sw
670718 !
@@ -734,6 +782,16 @@ subroutine subsample_and_optics(nCol, nSubCol, nLay, do_isccp, do_misr, do_modis
734782 MODIS_iceSize(:,iSub,:) = Reff(:,iSub,:,I_LSCICE)
735783 endwhere
736784 enddo
785+
786+ ! Partition optical thickness into liquid and ice parts
787+ call modis_optics_partition(nCol, nLay, nSubCol, MODIS_cloudWater, &
788+ MODIS_cloudIce, MODIS_waterSize, MODIS_iceSize, cospIN% tau_067, &
789+ MODIS_opticalThicknessLiq, MODIS_opticalThicknessIce)
790+
791+ ! Compute assymetry parameter and single scattering albedo
792+ call modis_optics(nCol, nLay, nSubCol, MODIS_opticalThicknessLiq, &
793+ MODIS_waterSize* 1.0e6_kind_phys , MODIS_opticalThicknessIce, &
794+ MODIS_iceSize* 1.0e6_kind_phys , cospIN% fracLiq, cospIN% asym, cospIN% ss_alb)
737795
738796 deallocate (MODIS_cloudWater, MODIS_cloudIce, MODIS_waterSize)
739797 deallocate (MODIS_iceSize, MODIS_opticalThicknessLiq)
0 commit comments