module cloudsimulator_38 1,4 !----------------------------------------------------------------------- !Purpose: CAM interface to ! Name: ISCCP Simulator ICARUS/SCOPS ! What: Simulate ISCCP cloud products from GCM inputs ! Version: 3.8 ! Authors: Steve Klein (klein21@llnl.gov) ! Mark Webb (Mark.Webb@MetOffice.com) ! !Author: W. Lin, Original version ! J. Rosinski, Modifications, March 2003 ! B. Eaton, Update to simulator version 3.4, March 2004 ! S. Klein, Update to simulator version 3.8, September 2008 !----------------------------------------------------------------------- use shr_kind_mod, only: r8 => shr_kind_r8 use ppgrid, only: pcols, pver use cam_history, only: addfld, add_default, phys_decomp, outfld, fillvalue use icarus_scops_38, only: ntau, npres use perf_mod implicit none private save !Public functions/subroutines public :: & cloudsimulator_init, & cloudsimulator_run logical, public :: doisccp_38 = .false. ! whether to do ISCCP calcs and I/O CONTAINS subroutine cloudsimulator_init 1,32 !------------------------------------------------------------------------------ call addfld ('FISCCP1 ','mixed ',npres*ntau,'A', & 'grid box fraction covered by each ISCCP D level cloud types',phys_decomp,& flag_xyfill=.true., flag_isccplev=.true.) call addfld ('TCLDAREA','fraction',1,'A','Total cloud area',phys_decomp,flag_xyfill=.true.) call addfld ('MEANPTOP','mb ',1,'A','Mean cloud top pressure',phys_decomp,flag_xyfill=.true.) call addfld ('MEANTAU ','unitless',1,'A','Mean optical thickness',phys_decomp,flag_xyfill=.true.) call addfld ('MEANCLDALB','unitless',1,'A','Mean cloud albedo',phys_decomp,flag_xyfill=.true.) call addfld ('MEANTTOP','K ',1,'A','Mean cloud top temperature',phys_decomp,flag_xyfill=.true.) call addfld ('MEANTB', 'K ',1,'A','Mean Infrared Tb',phys_decomp,flag_xyfill=.true.) call addfld ('MEANTBCLR','K ',1,'A','Mean Clear-sky Infrared Tb',phys_decomp,flag_xyfill=.true.) call addfld ('CLOUDY ','fraction',1,'A','Binary flag for TCLDAREA > cldmin',phys_decomp,flag_xyfill=.true.) call add_default ('FISCCP1 ', 1, ' ') call add_default ('TCLDAREA', 1, ' ') call add_default ('MEANPTOP', 1, ' ') call add_default ('MEANTAU ', 1, ' ') call add_default ('MEANCLDALB', 1, ' ') call add_default ('MEANTTOP', 1, ' ') call add_default ('MEANTB', 1, ' ') call add_default ('MEANTBCLR', 1, ' ') call add_default ('CLOUDY ', 1, ' ') end subroutine cloudsimulator_init subroutine cloudsimulator_run(state, ts, concld, cld, & 1,21 cld_sw_od, emis, coszrs ) use physics_types, only: physics_state use icarus_scops_38, only: isccp_cloud_types type(physics_state), intent(in) :: state real(r8), intent(in) :: ts(pcols) ! skin temperature real(r8), intent(in) :: concld(pcols,pver) ! convective cloud cover real(r8), intent(in) :: cld(pcols,pver) ! cloud cover real(r8), intent(in) :: cld_sw_od(pcols,pver) ! cloud sw (extinction) ! optical depth real(r8), intent(in) :: emis(pcols,pver) ! Cloud longwave emissivity real(r8), intent(in) :: coszrs(pcols) ! cosine solar zenith angle (to tell if day or night) ! Local variables: integer, parameter :: debug = 0 ! set to non-zero value to print out inputs ! with step debug integer, parameter :: debugcol = 0 ! set to non-zero value to print out column ! decomposition with step debugcol integer, parameter :: top_height = 1 ! 1 = adjust top height using both a computed ! infrared brightness temperature and the visible ! optical depth to adjust cloud top pressure. Note ! that this calculation is most appropriate to compare ! to ISCCP data during sunlit hours. integer, parameter :: top_height_direction = 1 ! direction for finding atmosphere pressure level ! with interpolated temperature equal to the radiance ! determined cloud-top temperature ! ! 1 = find the *lowest* altitude (highest pressure) level ! with interpolated temperature equal to the radiance ! determined cloud-top temperature ! ! 2 = find the *highest* altitude (lowest pressure) level ! with interpolated temperature equal to the radiance ! determined cloud-top temperature ! ! ONLY APPLICABLE IF top_height EQUALS 1 or 3 ! ! 1 = default setting, and matches all versions of ! ISCCP simulator with versions numbers 3.5.1 and lower ! ! 2 = experimental setting integer, parameter :: overlap = 3 ! 3=max/rand integer, parameter :: nsubcol = 50 ! # of columns each grid box is subdivided into real(r8), parameter :: emsfc_lw = 0.99_r8 ! longwave emissivity of surface at 10.5 microns ! constants for optical depth calculation from radcswmx.F90 real(r8), parameter :: abarl = 2.817e-02_r8 ! A coefficient for extinction optical depth real(r8), parameter :: bbarl = 1.305_r8 ! b coefficient for extinction optical depth real(r8), parameter :: abari = 3.448e-03_r8 ! A coefficient for extinction optical depth real(r8), parameter :: bbari = 2.431_r8 ! b coefficient for extinction optical depth real(r8), parameter :: cldmin = 1.0e-80_r8 ! note: cldmin much less than cldmin from cldnrh real(r8), parameter :: cldeps = 0.0_r8 ! integer :: lchnk ! chunk identifier integer :: ncol ! number of atmospheric columns integer :: sunlit(pcols) ! 1 for day points, 0 for night time integer :: seed1(pcols) ! seed values for random number generator integer :: seed2(pcols) ! seed values for random number generator integer :: seed3(pcols) ! seed values for random number generator integer :: seed4(pcols) ! seed values for random number generator real(r8) :: tau(pcols,pver) ! optical depth real(r8) :: fq_isccp(pcols,ntau,npres) ! the fraction of the model grid box covered by ! each of the 49 ISCCP D level cloud types real(r8) :: totalcldarea(pcols) ! the fraction of model grid box columns ! with cloud somewhere in them. This should ! equal the sum over all entries of fq_isccp ! for which tau > isccp_taumin; that is entries ! with 2nd dimension indices between 2 and ntau real(r8) :: meanptop(pcols) ! mean cloud top pressure (mb) - linear averaging ! in cloud top pressure. - weighted by totalcldarea ! averaged only for clouds with tau > isccp_taumin real(r8) :: meanttop(pcols) ! mean cloud top temp (k) - linear averaging in temp- ! erature for clouds with tau > isccp_taumin ! weighted by totalcldarea real(r8) :: meantaucld(pcols) ! mean optical thickness ! linear averaging in albedo performed for clouds ! with tau > isccp_taumin ! Although albedo weighting is applied inside the ! simulator, it is not outside the simulator, so I ! don't recommend looking at this variable. real(r8) :: meanalbedocld(pcols) ! mean cloud albedo ! linear averaging in albedo performed for clouds ! with tau > isccp_taumin - weighted by totalcldarea real(r8) :: meantb(pcols) ! mean infrared brightness temperature (k) ! averaged over all sub-columns real(r8) :: meantbclr(pcols) ! mean clear-sky infrared brightness temperature (k) ! averaged over all sub-columns ! ! NOTE: TO RECOVER PROPER AVERAGES OF PTOP, ALBEDOCLD, and TTOP, you must compute ! them using TCLDAREA and CLOUDY diagnostic output as: ! ! mean cloud albedo = MEANCLDALB * CLOUDY / TCLDAREA ! mean cloud top temperature = MEANTTOP * CLOUDY / TCLDAREA ! mean cloud top pressure = MEANPTOP * CLOUDY / TCLDAREA ! ! This is necessary to remove the weighting by totalcldarea (when totalcldarea > cldmin). ! ! If you must have a proper (albedo and totalcldarea weigted) cloud optical thickness, ! then use the output of the above equation for mean cloud albedo and convert that to ! an optical thickness by inverting the formula: ! ! albedo = (tau**0.895) / ( tau**0.895 + 6.82 ) ! real(r8) :: boxtau(pcols,nsubcol) ! optical thickness in each column real(r8) :: boxptop(pcols,nsubcol) ! cloud top pressure (mb) in each column real(r8) :: fq_isccp_s1(pcols,ntau*npres)! accumulated fq_isccp integer :: i, k, it, ip, itaunpres ! indices real(r8) :: cloudy(pcols) ! cloudy flag, which may be used to derived mean values under cloudy ! conditions. The cloud flag itself is freuency of cloudy condition ! when average over an accumulation period. !------------------------------------------------------------------------------------------------ call t_startf ('cloudsimulator_run') lchnk = state%lchnk ncol = state%ncol sunlit = 0 do i=1,ncol if (coszrs(i) > 0._r8) sunlit(i) = 1 seed1(i) = (state%pmid(i,pver) - int(state%pmid(i,pver))) * 1000000000 seed2(i) = (state%pmid(i,pver-1) - int(state%pmid(i,pver-1))) * 1000000000 seed3(i) = (state%pmid(i,pver-2) - int(state%pmid(i,pver-2))) * 1000000000 seed4(i) = (state%pmid(i,pver-3) - int(state%pmid(i,pver-3))) * 1000000000 end do call ISCCP_CLOUD_TYPES( & debug, & debugcol, & ncol, & sunlit(:ncol), & pver, & nsubcol, & seed1(:ncol), & seed2(:ncol), & seed3(:ncol), & seed4(:ncol), & state%pmid(:ncol,:), & state%pint(:ncol,:), & state%q(:ncol,:,1), & cld(:ncol,:), & concld(:ncol,:), & cld_sw_od(:ncol,:), & cld_sw_od(:ncol,:), & top_height, & top_height_direction,& overlap, & ts(:ncol), & emsfc_lw, & state%t(:ncol,:), & emis(:ncol,:), & emis(:ncol,:), & fq_isccp(:ncol,:,:), & totalcldarea(:ncol), & meanptop(:ncol), & meanttop(:ncol), & meantaucld(:ncol), & meanalbedocld(:ncol),& meantb(:ncol), & meantbclr(:ncol), & boxtau(:ncol,:), & boxptop(:ncol,:) ) do i=1,ncol if (coszrs(i) > 0._r8) then ! save standard ISCCP type of 7x7 clouds do ip=1,npres do it=1,ntau itaunpres = (ip-1)*ntau+it fq_isccp_s1(i,itaunpres) = fq_isccp(i,it,ip) end do end do if (totalcldarea(i) >= cldmin) then ! cloudy daytime box cloudy(i) = 1.0_r8 meanptop(i) = meanptop(i) * totalcldarea(i) ! weight by TCLDAREA meantaucld(i) = meantaucld(i) * totalcldarea(i) meanalbedocld(i) = meanalbedocld(i) * totalcldarea(i) meanttop(i) = meanttop(i) * totalcldarea(i) else !cloud free in the (daytime) grid box totalcldarea(i) = 0._r8 meanptop(i) = fillvalue meantaucld(i) = fillvalue meanalbedocld(i) = fillvalue meanttop(i) = fillvalue cloudy(i) = 0._r8 endif else ! nighttime fq_isccp_s1(i,:) = fillvalue totalcldarea(i) = fillvalue meanptop(i) = fillvalue meantaucld(i) = fillvalue meanalbedocld(i) = fillvalue meanttop(i) = fillvalue cloudy(i) = fillvalue end if if (top_height .eq. 2 .or. coszrs(i) <= 0._r8) then meantb(i) = fillvalue meantbclr(i) = fillvalue end if end do ! ! dont need to call outfld if all points are nighttime ! if (any(coszrs(:ncol) > 0._r8)) then call outfld('FISCCP1 ',fq_isccp_s1, pcols,lchnk) call outfld('TCLDAREA',totalcldarea,pcols,lchnk) call outfld('MEANPTOP',meanptop ,pcols,lchnk) call outfld('MEANTAU ',meantaucld ,pcols,lchnk) call outfld('MEANCLDALB',meanalbedocld,pcols,lchnk) call outfld('MEANTTOP',meanttop ,pcols,lchnk) call outfld('CLOUDY ',cloudy ,pcols,lchnk) call outfld('MEANTB', meantb ,pcols,lchnk) call outfld('MEANTBCLR', meantbclr,pcols,lchnk) end if call t_stopf ('cloudsimulator_run') end subroutine cloudsimulator_run !####################################################################### end module cloudsimulator_38