module icarus_scops_38 2,5
!-----------------------------------------------------------------------
!Purpose: Create module for:
! 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: B. Eaton March 2004
!Author: S. Klein September 2008 (update simulator to version 3.8)
!-----------------------------------------------------------------------
use shr_kind_mod
, only: r8 => shr_kind_r8
use abortutils
, only: endrun
use marsaglia
, only: kissvec
use units
use cam_logfile
, only: iulog
implicit none
private
save
! Public interfaces
public :: &
isccp_cloud_types
! Public data
integer, public, parameter :: &
ntau = 7, &! number of optical depth ranges
npres = 7 ! number of pressure ranges
real(r8), public, parameter :: &
prlim(npres+1) = (/0._r8, 180._r8, 310._r8, 440._r8, 560._r8, 680._r8, 800._r8, 1000._r8/), &
taulim(ntau+1) = (/0._r8, 0.3_r8, 1.3_r8, 3.6_r8, 9.4_r8, 23._r8, 60._r8, 379._r8/)
!##############################################################################
CONTAINS
!##############################################################################
!########################################################################################################
!
! 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)
!
! Modifications to downloaded code:
! 1. convert to free format
! 2. convert types of real arguments to real
! 4. add diagnostic meanttop
!
! Steve Klein modified the CAM code for version 3.4. for updates to
! version 3.8
! New diagnostic output variables meantaucld, meanalbedocld, meantb, meantbclr
SUBROUTINE ISCCP_CLOUD_TYPES( & 2,20
debug, &
debugcol, &
npoints, &
sunlit, &
nlev, &
ncol, &
seed1, &
seed2, &
seed3, &
seed4, &
pfull, &
phalf, &
qv, &
cc, &
conv, &
dtau_s, &
dtau_c, &
top_height, &
top_height_direction, &
overlap, &
skt, &
emsfc_lw, &
at, &
dem_s, &
dem_c, &
fq_isccp, &
totalcldarea, &
meanptop, &
meanttop, &
meantaucld, &
meanalbedocld, &
meantb, &
meantbclr, &
boxtau, &
boxptop &
)
! CVSId: isccp_cloud_types.f,v 3.4 2003/05/06 08:45:28 hadmw Exp
implicit none
! NOTE: the maximum number of levels and columns is set by
! the following parameter statement
INTEGER ncolprint
! -----
! Input
! -----
INTEGER npoints ! number of model points in the horizontal
INTEGER nlev ! number of model levels in column
INTEGER ncol ! number of subcolumns
INTEGER sunlit(npoints) ! 1 for day points, 0 for night time
INTEGER seed1(npoints) ! seed value for random number generator
INTEGER seed2(npoints) ! It is recommended that the seed is set
INTEGER seed3(npoints) ! to a different value for each model
INTEGER seed4(npoints) ! gridbox it is called on, as it is
! possible that the choice of the same
! seed value every time may introduce some
! statistical bias in the results, particularly
! for low values of NCOL.
! four integer seeds are needed by generator
REAL(R8) pfull(npoints,nlev) ! pressure of full model levels (Pascals)
! pfull(npoints,1) is top level of model
! pfull(npoints,nlev) is bottom level of model
REAL(R8) phalf(npoints,nlev+1) ! pressure of half model levels (Pascals)
! phalf(npoints,1) is top of model
! phalf(npoints,nlev+1) is the surface pressure
REAL(R8) qv(npoints,nlev) ! water vapor specific humidity (kg vapor/ kg air)
! on full model levels
REAL(R8) cc(npoints,nlev) ! input cloud cover in each model level (fraction)
! NOTE: This is the HORIZONTAL area of each
! grid box covered by clouds
REAL(R8) conv(npoints,nlev) ! input convective cloud cover in each model level (fraction)
! NOTE: This is the HORIZONTAL area of each
! grid box covered by convective clouds
REAL(R8) dtau_s(npoints,nlev) ! mean 0.67 micron optical depth of stratiform
! clouds in each model level
! NOTE: this the cloud optical depth of only the
! cloudy part of the grid box, it is not weighted
! with the 0 cloud optical depth of the clear
! part of the grid box
REAL(R8) dtau_c(npoints,nlev) ! mean 0.67 micron optical depth of convective
! clouds in each
! model level. Same note applies as in dtau_s.
INTEGER overlap ! overlap type
! 1=max
! 2=rand
! 3=max/rand
INTEGER top_height ! 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.
! 2 = do not adjust top height, that is cloud top
! pressure is the actual cloud top pressure
! in the model
! 3 = adjust top height using only the computed
! infrared brightness temperature. Note that this
! calculation is most appropriate to compare to ISCCP
! IR only algortihm (i.e. you can compare to nighttime
! ISCCP data with this option)
INTEGER top_height_direction ! 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
!
! The following input variables are used only if top_height = 1 or top_height = 3
!
REAL(R8) skt(npoints) ! skin Temperature (K)
REAL(R8) emsfc_lw ! 10.5 micron emissivity of surface (fraction)
REAL(R8) at(npoints,nlev) ! temperature in each model level (K)
REAL(R8) dem_s(npoints,nlev) ! 10.5 micron longwave emissivity of stratiform
! clouds in each
! model level. Same note applies as in dtau_s.
REAL(R8) dem_c(npoints,nlev) ! 10.5 micron longwave emissivity of convective
! clouds in each
! model level. Same note applies as in dtau_s.
! ------
! Output
! ------
REAL(R8) fq_isccp(npoints,7,7) ! the fraction of the model grid box covered by
! each of the 49 ISCCP D level cloud types
REAL(R8) totalcldarea(npoints) ! the fraction of model grid box columns
! with cloud somewhere in them. NOTE: This diagnostic
! does not count model clouds with tau < isccp_taumin
!
! Thus this diagnostic does not equal the sum over all entries of fq_isccp.
! However, this diagnostic does equal the sum over entries of fq_isccp with
! itau = 2:7 (omitting itau = 1)
! The following four means are averages only over the cloudy areas with tau > isccp_taumin.
! If no clouds with tau > isccp_taumin are in grid box all three quantities should equal zero.
REAL(R8) meanptop(npoints) ! mean cloud top pressure (mb) - linear averaging
! in cloud top pressure.
REAL(R8) meanttop(npoints) ! mean cloud top temp (k) - linear averaging
REAL(R8) meantaucld(npoints) ! mean optical thickness
! linear averaging in albedo performed.
REAL(R8) meanalbedocld(npoints) ! mean cloud albedo
! linear averaging in albedo performed.
REAL(R8) meantb(npoints) ! mean all-sky 10.5 micron brightness temperature (K)
REAL(R8) meantbclr(npoints) ! mean clear-sky 10.5 micron brightness temperature (K)
REAL(R8) boxtau(npoints,ncol) ! optical thickness in each column
REAL(R8) boxptop(npoints,ncol) ! cloud top pressure (mb) in each column
!
! ------
! Working variables added when program updated to mimic Mark Webb's PV-Wave code
! ------
REAL(R8) frac_out(npoints,ncol,nlev) ! boxes gridbox divided up into
! Equivalent of BOX in original version, but
! indexed by column then row, rather than
! by row then column
REAL(R8) tca(npoints,0:nlev) ! total cloud cover in each model level (fraction)
! with extra layer of zeroes on top
! in this version this just contains the values input
! from cc but with an extra level
REAL(R8) cca(npoints,nlev) ! convective cloud cover in each model level (fraction)
! from conv
REAL(R8) threshold(npoints,ncol) ! pointer to position in gridbox
REAL(R8) maxocc(npoints,ncol) ! Flag for max overlapped conv cld
REAL(R8) maxosc(npoints,ncol) ! Flag for max overlapped strat cld
REAL(R8) boxpos(npoints,ncol) ! ordered pointer to position in gridbox
REAL(R8) threshold_min(npoints,ncol) ! minimum value to define range in with new threshold
! is chosen
REAL(R8) dem(npoints,ncol),bb(npoints) ! working variables for 10.5 micron longwave
! emissivity in part of
! gridbox under consideration
REAL(R8) ran(npoints) ! vector of random numbers
REAL(R8) ptrop(npoints)
REAL(R8) attrop(npoints)
REAL(R8) attropmin (npoints)
REAL(R8) atmax(npoints)
REAL(R8) atmin(npoints)
REAL(R8) btcmin(npoints)
REAL(R8) transmax(npoints)
INTEGER i,j,ilev,ibox,itrop(npoints)
INTEGER ipres(npoints)
INTEGER itau(npoints),ilev2
INTEGER acc(nlev,ncol)
INTEGER match(npoints,nlev-1)
INTEGER nmatch(npoints)
INTEGER levmatch(npoints,ncol)
!variables needed for water vapor continuum absorption
real(r8) fluxtop_clrsky(npoints),trans_layers_above_clrsky(npoints)
real(r8) taumin(npoints)
real(r8) dem_wv(npoints,nlev), wtmair, wtmh20, Navo, grav, pstd, t0
real(r8) press(npoints), dpress(npoints), atmden(npoints)
real(r8) rvh20(npoints), wk(npoints), rhoave(npoints)
real(r8) rh20s(npoints), rfrgn(npoints)
real(r8) tmpexp(npoints),tauwv(npoints)
character*1 cchar(6),cchar_realtops(6)
integer icycle
REAL(R8) tau(npoints,ncol)
LOGICAL box_cloudy(npoints,ncol)
REAL(R8) tb(npoints,ncol)
REAL(R8) ptop(npoints,ncol)
REAL(R8) ttop(npoints,ncol)
REAL(R8) emcld(npoints,ncol)
REAL(R8) fluxtop(npoints,ncol)
REAL(R8) trans_layers_above(npoints,ncol)
real(r8) isccp_taumin,fluxtopinit(npoints),tauir(npoints)
REAL(R8) albedocld(npoints,ncol)
real(r8) boxarea
integer debug ! set to non-zero value to print out inputs
! with step debug
integer debugcol ! set to non-zero value to print out column
! decomposition with step debugcol
integer index1(npoints),num1,jj,k1,k2
real(r8) rec2p13,tauchk,logp,logp1,logp2,atd
real(r8) output_missing_value
integer unitn ! output file unit number
character*10 ftn09
DATA isccp_taumin / 0.3_r8 /
DATA output_missing_value / -1.E+30 /
DATA cchar / ' ','-','1','+','I','+'/
DATA cchar_realtops / ' ',' ','1','1','I','I'/
tauchk = -1._r8*log(0.9999999_r8)
rec2p13=1._r8/2.13_r8
ncolprint=0
if ( debug.ne.0 ) then
j=1
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(a10)') 'debug='
write(iulog,'(8I10)') debug
write(iulog,'(a10)') 'debugcol='
write(iulog,'(8I10)') debugcol
write(iulog,'(a10)') 'npoints='
write(iulog,'(8I10)') npoints
write(iulog,'(a10)') 'nlev='
write(iulog,'(8I10)') nlev
write(iulog,'(a10)') 'ncol='
write(iulog,'(8I10)') ncol
write(iulog,'(a11)') 'top_height='
write(iulog,'(8I10)') top_height
write(iulog,'(a21)') 'top_height_direction='
write(iulog,'(8I10)') top_height_direction
write(iulog,'(a10)') 'overlap='
write(iulog,'(8I10)') overlap
write(iulog,'(a10)') 'emsfc_lw='
write(iulog,'(8f10.2)') emsfc_lw
do j=1,npoints,debug
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(a10)') 'sunlit='
write(iulog,'(8I10)') sunlit(j)
write(iulog,'(a10)') 'seed1='
write(iulog,'(8I10)') seed1(j)
write(iulog,'(a10)') 'seed2='
write(iulog,'(8I10)') seed2(j)
write(iulog,'(a10)') 'seed3='
write(iulog,'(8I10)') seed3(j)
write(iulog,'(a10)') 'seed4='
write(iulog,'(8I10)') seed4(j)
write(iulog,'(a10)') 'pfull='
write(iulog,'(8f10.2)') (pfull(j,i),i=1,nlev)
write(iulog,'(a10)') 'phalf='
write(iulog,'(8f10.2)') (phalf(j,i),i=1,nlev+1)
write(iulog,'(a10)') 'qv='
write(iulog,'(8f10.3)') (qv(j,i),i=1,nlev)
write(iulog,'(a10)') 'cc='
write(iulog,'(8f10.3)') (cc(j,i),i=1,nlev)
write(iulog,'(a10)') 'conv='
write(iulog,'(8f10.2)') (conv(j,i),i=1,nlev)
write(iulog,'(a10)') 'dtau_s='
write(iulog,'(8g12.5)') (dtau_s(j,i),i=1,nlev)
write(iulog,'(a10)') 'dtau_c='
write(iulog,'(8f10.2)') (dtau_c(j,i),i=1,nlev)
write(iulog,'(a10)') 'skt='
write(iulog,'(8f10.2)') skt(j)
write(iulog,'(a10)') 'at='
write(iulog,'(8f10.2)') (at(j,i),i=1,nlev)
write(iulog,'(a10)') 'dem_s='
write(iulog,'(8f10.3)') (dem_s(j,i),i=1,nlev)
write(iulog,'(a10)') 'dem_c='
write(iulog,'(8f10.2)') (dem_c(j,i),i=1,nlev)
enddo
endif
! ---------------------------------------------------!
! assign 2d tca array using 1d input array cc
do j=1,npoints
tca(j,0)=0
enddo
do ilev=1,nlev
do j=1,npoints
tca(j,ilev)=cc(j,ilev)
enddo
enddo
! assign 2d cca array using 1d input array conv
do ilev=1,nlev
do ibox=1,ncol
do j=1,npoints
cca(j,ilev)=conv(j,ilev)
enddo
enddo
enddo
if (ncolprint.ne.0) then
do j=1,npoints,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(a)') 'seed1:'
write(iulog,'(I3.2)') seed1(j)
write(iulog,'(a)') 'seed2:'
write(iulog,'(I3.2)') seed2(j)
write(iulog,'(a)') 'seed3:'
write(iulog,'(I3.2)') seed3(j)
write(iulog,'(a)') 'seed4:'
write(iulog,'(I3.2)') seed4(j)
write(iulog,'(a)') 'tca_pp_rev:'
write(iulog,'(8f5.2)') &
((tca(j,ilev)), &
ilev=1,nlev)
write(iulog,'(a)') 'cca_pp_rev:'
write(iulog,'(8f5.2)') &
((cca(j,ilev),ibox=1,ncolprint),ilev=1,nlev)
enddo
endif
if (top_height .eq. 1 .or. top_height .eq. 3) then
do j=1,npoints
ptrop(j)=5000._r8
atmin(j) = 400._r8
attropmin(j) = 400._r8
atmax(j) = 0._r8
attrop(j) = 120._r8
itrop(j) = 1
enddo
do 12 ilev=1,nlev
do j=1,npoints
if (pfull(j,ilev) .lt. 40000._r8 .and. &
pfull(j,ilev) .gt. 5000._r8 .and. &
at(j,ilev) .lt. attropmin(j)) then
ptrop(j) = pfull(j,ilev)
attropmin(j) = at(j,ilev)
attrop(j) = attropmin(j)
itrop(j)=ilev
end if
if (at(j,ilev) .gt. atmax(j)) atmax(j)=at(j,ilev)
if (at(j,ilev) .lt. atmin(j)) atmin(j)=at(j,ilev)
enddo
12 continue
end if
if (top_height .eq. 1 .or. top_height .eq. 3) then
do j=1,npoints
meantb(j) = 0._r8
meantbclr(j) = 0._r8
end do
else
do j=1,npoints
meantb(j) = output_missing_value
meantbclr(j) = output_missing_value
end do
end if
! -----------------------------------------------------!
! ---------------------------------------------------!
do 13 ilev=1,nlev
num1=0
do j=1,npoints
if (cc(j,ilev) .lt. 0._r8 .or. cc(j,ilev) .gt. 1._r8) then
num1=num1+1
index1(num1)=j
end if
enddo
do jj=1,num1
j=index1(jj)
write(iulog,*) ' error = cloud fraction less than zero'
write(iulog,*) ' or '
write(iulog,*) ' error = cloud fraction greater than 1'
write(iulog,*) 'value at point ',j,' is ',cc(j,ilev)
write(iulog,*) 'level ',ilev
call endrun
('ISCCP_CLOUD_TYPES ERROR: cloud fraction')
enddo
num1=0
do j=1,npoints
if (conv(j,ilev) .lt. 0._r8 .or. conv(j,ilev) .gt. 1._r8) then
num1=num1+1
index1(num1)=j
end if
enddo
do jj=1,num1
j=index1(jj)
write(iulog,*) &
' error = convective cloud fraction less than zero'
write(iulog,*) ' or '
write(iulog,*) &
' error = convective cloud fraction greater than 1'
write(iulog,*) 'value at point ',j,' is ',conv(j,ilev)
write(iulog,*) 'level ',ilev
call endrun
('ISCCP_CLOUD_TYPES ERROR: convective cloud fraction')
enddo
num1=0
do j=1,npoints
if (dtau_s(j,ilev) .lt. 0._r8) then
num1=num1+1
index1(num1)=j
end if
enddo
do jj=1,num1
j=index1(jj)
write(iulog,*) &
' error = stratiform cloud opt. depth less than zero'
write(iulog,*) 'value at point ',j,' is ',dtau_s(j,ilev)
write(iulog,*) 'level ',ilev
call endrun
('ISCCP_CLOUD_TYPES ERROR: stratiform cloud opt. depth')
enddo
num1=0
do j=1,npoints
if (dtau_c(j,ilev) .lt. 0._r8) then
num1=num1+1
index1(num1)=j
end if
enddo
do jj=1,num1
j=index1(jj)
write(iulog,*) &
' error = convective cloud opt. depth less than zero'
write(iulog,*) 'value at point ',j,' is ',dtau_c(j,ilev)
write(iulog,*) 'level ',ilev
call endrun
('ISCCP_CLOUD_TYPES ERROR: convective cloud opt. depth')
enddo
num1=0
do j=1,npoints
if (dem_s(j,ilev) .lt. 0._r8 .or. dem_s(j,ilev) .gt. 1._r8) then
num1=num1+1
index1(num1)=j
end if
enddo
do jj=1,num1
j=index1(jj)
write(iulog,*) &
' error = stratiform cloud emissivity less than zero'
write(iulog,*)'or'
write(iulog,*) &
' error = stratiform cloud emissivity greater than 1'
write(iulog,*) 'value at point ',j,' is ',dem_s(j,ilev)
write(iulog,*) 'level ',ilev
call endrun
('ISCCP_CLOUD_TYPES ERROR: stratiform cloud emissivity')
enddo
num1=0
do j=1,npoints
if (dem_c(j,ilev) .lt. 0._r8 .or. dem_c(j,ilev) .gt. 1._r8) then
num1=num1+1
index1(num1)=j
end if
enddo
do jj=1,num1
j=index1(jj)
write(iulog,*) &
' error = convective cloud emissivity less than zero'
write(iulog,*)'or'
write(iulog,*) &
' error = convective cloud emissivity greater than 1'
write(iulog,*) &
'j=',j,'ilev=',ilev,'dem_c(j,ilev) =',dem_c(j,ilev)
call endrun
('ISCCP_CLOUD_TYPES ERROR: convective cloud emissivity')
enddo
13 continue
do ibox=1,ncol
do j=1,npoints
boxpos(j,ibox)=(ibox-.5_r8)/ncol
enddo
enddo
! ---------------------------------------------------!
! Initialise working variables
! ---------------------------------------------------!
! Initialised frac_out to zero
do ibox=1,ncol
do ilev=1,nlev
do j=1,npoints
frac_out(j,ibox,ilev)=0.0_r8
enddo
enddo
enddo
if (ncolprint.ne.0) then
write(iulog,'(a)') 'frac_out_pp_rev:'
do j=1,npoints,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(8f5.2)') &
((frac_out(j,ibox,ilev),ibox=1,ncolprint),ilev=1,nlev)
enddo
write(iulog,'(a)') 'ncol:'
write(iulog,'(I3)') ncol
endif
if (ncolprint.ne.0) then
write(iulog,'(a)') 'last_frac_pp:'
do j=1,npoints,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(8f5.2)') (tca(j,0))
enddo
endif
! ---------------------------------------------------!
! ALLOCATE CLOUD INTO BOXES, FOR NCOLUMNS, NLEVELS
! frac_out is the array that contains the information
! where 0 is no cloud, 1 is a stratiform cloud and 2 is a
! convective cloud
!loop over vertical levels
DO 200 ilev = 1,nlev
! Initialise threshold
IF (ilev.eq.1) then
! If max overlap
IF (overlap.eq.1) then
! select pixels spread evenly
! across the gridbox
DO ibox=1,ncol
do j=1,npoints
threshold(j,ibox)=boxpos(j,ibox)
enddo
enddo
ELSE
DO ibox=1,ncol
call kissvec
(seed1,seed2,seed3,seed4,ran)
! select random pixels from the non-convective
! part the gridbox ( some will be converted into
! convective pixels below )
do j=1,npoints
threshold(j,ibox)= &
cca(j,ilev)+(1-cca(j,ilev))*ran(j)
enddo
enddo
ENDIF
IF (ncolprint.ne.0) then
write(iulog,'(a)') 'threshold_nsf2:'
do j=1,npoints,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(8f5.2)') (threshold(j,ibox),ibox=1,ncolprint)
enddo
ENDIF
ENDIF
IF (ncolprint.ne.0) then
write(iulog,'(a)') 'ilev:'
write(iulog,'(I2)') ilev
ENDIF
DO ibox=1,ncol
! All versions
do j=1,npoints
if (boxpos(j,ibox).le.cca(j,ilev)) then
maxocc(j,ibox) = 1
else
maxocc(j,ibox) = 0
end if
enddo
! Max overlap
if (overlap.eq.1) then
do j=1,npoints
threshold_min(j,ibox)=cca(j,ilev)
maxosc(j,ibox)=1
enddo
endif
! Random overlap
if (overlap.eq.2) then
do j=1,npoints
threshold_min(j,ibox)=cca(j,ilev)
maxosc(j,ibox)=0
enddo
endif
! Max/Random overlap
if (overlap.eq.3) then
do j=1,npoints
threshold_min(j,ibox)=max(cca(j,ilev), &
min(tca(j,ilev-1),tca(j,ilev)))
if (threshold(j,ibox) &
.lt.min(tca(j,ilev-1),tca(j,ilev)) &
.and.(threshold(j,ibox).gt.cca(j,ilev))) then
maxosc(j,ibox)= 1
else
maxosc(j,ibox)= 0
end if
enddo
endif
! Reset threshold
call kissvec
(seed1,seed2,seed3,seed4,ran)
do j=1,npoints
threshold(j,ibox)= &
!if max overlapped conv cloud
maxocc(j,ibox) * ( &
boxpos(j,ibox) &
) + &
!else
(1-maxocc(j,ibox)) * ( &
!if max overlapped strat cloud
(maxosc(j,ibox)) * ( &
!threshold=boxpos
threshold(j,ibox) &
) + &
!else
(1-maxosc(j,ibox)) * ( &
!threshold_min=random[thrmin,1]
threshold_min(j,ibox)+ &
(1-threshold_min(j,ibox))*ran(j) &
) &
)
enddo
ENDDO ! ibox
! Fill frac_out with 1's where tca is greater than the threshold
DO ibox=1,ncol
do j=1,npoints
if (tca(j,ilev).gt.threshold(j,ibox)) then
frac_out(j,ibox,ilev)=1
else
frac_out(j,ibox,ilev)=0
end if
enddo
ENDDO
! Code to partition boxes into startiform and convective parts
! goes here
DO ibox=1,ncol
do j=1,npoints
if (threshold(j,ibox).le.cca(j,ilev)) then
! = 2 IF threshold le cca(j)
frac_out(j,ibox,ilev) = 2
else
! = the same IF NOT threshold le cca(j)
frac_out(j,ibox,ilev) = frac_out(j,ibox,ilev)
end if
enddo
ENDDO
! Set last_frac to tca at this level, so as to be tca
! from last level next time round
if (ncolprint.ne.0) then
do j=1,npoints ,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(a)') 'last_frac:'
write(iulog,'(8f5.2)') (tca(j,ilev-1))
write(iulog,'(a)') 'cca:'
write(iulog,'(8f5.2)') (cca(j,ilev),ibox=1,ncolprint)
write(iulog,'(a)') 'max_overlap_cc:'
write(iulog,'(8f5.2)') (maxocc(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'max_overlap_sc:'
write(iulog,'(8f5.2)') (maxosc(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'threshold_min_nsf2:'
write(iulog,'(8f5.2)') (threshold_min(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'threshold_nsf2:'
write(iulog,'(8f5.2)') (threshold(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'frac_out_pp_rev:'
write(iulog,'(8f5.2)') &
((frac_out(j,ibox,ilev2),ibox=1,ncolprint),ilev2=1,nlev)
enddo
endif
200 CONTINUE !loop over nlev
!
! ---------------------------------------------------!
!
! ---------------------------------------------------!
! COMPUTE CLOUD OPTICAL DEPTH FOR EACH COLUMN and
! put into vector tau
!initialize tau and albedocld to zero
do 15 ibox=1,ncol
do j=1,npoints
tau(j,ibox)=0._r8
albedocld(j,ibox)=0._r8
boxtau(j,ibox)=output_missing_value
boxptop(j,ibox)=output_missing_value
box_cloudy(j,ibox)=.false.
enddo
15 continue
!compute total cloud optical depth for each column
do ilev=1,nlev
!increment tau for each of the boxes
do ibox=1,ncol
do j=1,npoints
if (frac_out(j,ibox,ilev).eq.1) then
tau(j,ibox)=tau(j,ibox) &
+ dtau_s(j,ilev)
endif
if (frac_out(j,ibox,ilev).eq.2) then
tau(j,ibox)=tau(j,ibox) &
+ dtau_c(j,ilev)
end if
enddo
enddo ! ibox
enddo ! ilev
if (ncolprint.ne.0) then
do j=1,npoints ,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(i2,1X,8(f7.2,1X))') &
ilev, &
(tau(j,ibox),ibox=1,ncolprint)
enddo
endif
!
! ---------------------------------------------------!
!
! ---------------------------------------------------!
! COMPUTE INFRARED BRIGHTNESS TEMPERUATRES
! AND CLOUD TOP TEMPERATURE SATELLITE SHOULD SEE
!
! again this is only done if top_height = 1 or 3
!
! fluxtop is the 10.5 micron radiance at the top of the
! atmosphere
! trans_layers_above is the total transmissivity in the layers
! above the current layer
! fluxtop_clrsky(j) and trans_layers_above_clrsky(j) are the clear
! sky versions of these quantities.
if (top_height .eq. 1 .or. top_height .eq. 3) then
!----------------------------------------------------------------------
!
! DO CLEAR SKY RADIANCE CALCULATION FIRST
!
!compute water vapor continuum emissivity
!this treatment follows Schwarkzopf and Ramasamy
!JGR 1999,vol 104, pages 9467-9499.
!the emissivity is calculated at a wavenumber of 955 cm-1,
!or 10.47 microns
wtmair = 28.9644_r8
wtmh20 = 18.01534_r8
Navo = 6.023E+23_r8
grav = 9.806650E+02_r8
pstd = 1.013250E+06_r8
t0 = 296._r8
if (ncolprint .ne. 0) &
write(iulog,*) 'ilev pw (kg/m2) tauwv(j) dem_wv'
do 125 ilev=1,nlev
do j=1,npoints
!press and dpress are dyne/cm2 = Pascals *10
press(j) = pfull(j,ilev)*10._r8
dpress(j) = (phalf(j,ilev+1)-phalf(j,ilev))*10
!atmden = g/cm2 = kg/m2 / 10
atmden(j) = dpress(j)/grav
rvh20(j) = qv(j,ilev)*wtmair/wtmh20
wk(j) = rvh20(j)*Navo*atmden(j)/wtmair
rhoave(j) = (press(j)/pstd)*(t0/at(j,ilev))
rh20s(j) = rvh20(j)*rhoave(j)
rfrgn(j) = rhoave(j)-rh20s(j)
tmpexp(j) = exp(-0.02_r8*(at(j,ilev)-t0))
tauwv(j) = wk(j)*1.e-20_r8*( &
(0.0224697_r8*rh20s(j)*tmpexp(j)) + &
(3.41817e-7_r8*rfrgn(j)) )*0.98_r8
dem_wv(j,ilev) = 1._r8 - exp( -1._r8 * tauwv(j))
enddo
if (ncolprint .ne. 0) then
do j=1,npoints ,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(i2,1X,3(f8.3,3X))') ilev, &
qv(j,ilev)*(phalf(j,ilev+1)-phalf(j,ilev))/(grav/100._r8), &
tauwv(j),dem_wv(j,ilev)
enddo
endif
125 continue
!initialize variables
do j=1,npoints
fluxtop_clrsky(j) = 0._r8
trans_layers_above_clrsky(j)=1._r8
enddo
do ilev=1,nlev
do j=1,npoints
! Black body emission at temperature of the layer
bb(j)=1 / ( exp(1307.27_r8/at(j,ilev)) - 1._r8 )
!bb(j)= 5.67e-8*at(j,ilev)**4
! increase TOA flux by flux emitted from layer
! times total transmittance in layers above
fluxtop_clrsky(j) = fluxtop_clrsky(j) &
+ dem_wv(j,ilev)*bb(j)*trans_layers_above_clrsky(j)
! update trans_layers_above with transmissivity
! from this layer for next time around loop
trans_layers_above_clrsky(j)= &
trans_layers_above_clrsky(j)*(1._r8-dem_wv(j,ilev))
enddo
if (ncolprint.ne.0) then
do j=1,npoints ,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(a)') 'ilev:'
write(iulog,'(I2)') ilev
write(iulog,'(a)') &
'emiss_layer,100.*bb(j),100.*f,total_trans:'
write(iulog,'(4(f7.2,1X))') dem_wv(j,ilev),100._r8*bb(j), &
100._r8*fluxtop_clrsky(j),trans_layers_above_clrsky(j)
enddo
endif
enddo !loop over level
do j=1,npoints
!add in surface emission
bb(j)=1/( exp(1307.27_r8/skt(j)) - 1._r8 )
!bb(j)=5.67e-8*skt(j)**4
fluxtop_clrsky(j) = fluxtop_clrsky(j) + emsfc_lw * bb(j) &
* trans_layers_above_clrsky(j)
!clear sky brightness temperature
meantbclr(j) = 1307.27_r8/(log(1._r8+(1._r8/fluxtop_clrsky(j))))
enddo
if (ncolprint.ne.0) then
do j=1,npoints ,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(a)') 'id:'
write(iulog,'(a)') 'surface'
write(iulog,'(a)') 'emsfc,100.*bb(j),100.*f,total_trans:'
write(iulog,'(5(f7.2,1X))') emsfc_lw,100._r8*bb(j), &
100._r8*fluxtop_clrsky(j), &
trans_layers_above_clrsky(j), meantbclr(j)
enddo
endif
!
! END OF CLEAR SKY CALCULATION
!
!----------------------------------------------------------------
if (ncolprint.ne.0) then
do j=1,npoints ,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(a)') 'ts:'
write(iulog,'(8f7.2)') (skt(j),ibox=1,ncolprint)
write(iulog,'(a)') 'ta_rev:'
write(iulog,'(8f7.2)') &
((at(j,ilev2),ibox=1,ncolprint),ilev2=1,nlev)
enddo
endif
!loop over columns
do ibox=1,ncol
do j=1,npoints
fluxtop(j,ibox)=0._r8
trans_layers_above(j,ibox)=1._r8
enddo
enddo
do ilev=1,nlev
do j=1,npoints
! Black body emission at temperature of the layer
bb(j)=1 / ( exp(1307.27_r8/at(j,ilev)) - 1._r8 )
!bb(j)= 5.67e-8*at(j,ilev)**4
enddo
do ibox=1,ncol
do j=1,npoints
! emissivity for point in this layer
if (frac_out(j,ibox,ilev).eq.1) then
dem(j,ibox)= 1._r8 - &
( (1._r8 - dem_wv(j,ilev)) * (1._r8 - dem_s(j,ilev)) )
else if (frac_out(j,ibox,ilev).eq.2) then
dem(j,ibox)= 1._r8 - &
( (1._r8 - dem_wv(j,ilev)) * (1._r8 - dem_c(j,ilev)) )
else
dem(j,ibox)= dem_wv(j,ilev)
end if
! increase TOA flux by flux emitted from layer
! times total transmittance in layers above
fluxtop(j,ibox) = fluxtop(j,ibox) &
+ dem(j,ibox) * bb(j) &
* trans_layers_above(j,ibox)
! update trans_layers_above with transmissivity
! from this layer for next time around loop
trans_layers_above(j,ibox)= &
trans_layers_above(j,ibox)*(1._r8-dem(j,ibox))
enddo ! j
enddo ! ibox
if (ncolprint.ne.0) then
do j=1,npoints,1000
write(iulog,'(a)') 'ilev:'
write(iulog,'(I2)') ilev
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(a)') 'emiss_layer:'
write(iulog,'(8f7.2)') (dem(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') '100.*bb(j):'
write(iulog,'(8f7.2)') (100._r8*bb(j),ibox=1,ncolprint)
write(iulog,'(a)') '100.*f:'
write(iulog,'(8f7.2)') &
(100._r8*fluxtop(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'total_trans:'
write(iulog,'(8f7.2)') &
(trans_layers_above(j,ibox),ibox=1,ncolprint)
enddo
endif
enddo ! ilev
do j=1,npoints
!add in surface emission
bb(j)=1/( exp(1307.27_r8/skt(j)) - 1._r8 )
!bb(j)=5.67e-8*skt(j)**4
end do
do ibox=1,ncol
do j=1,npoints
!add in surface emission
fluxtop(j,ibox) = fluxtop(j,ibox) &
+ emsfc_lw * bb(j) &
* trans_layers_above(j,ibox)
end do
end do
!calculate mean infrared brightness temperature
do ibox=1,ncol
do j=1,npoints
meantb(j) = meantb(j)+1307.27_r8/(log(1._r8+(1._r8/fluxtop(j,ibox))))
end do
end do
do j=1, npoints
meantb(j) = meantb(j) / real(ncol)
end do
if (ncolprint.ne.0) then
do j=1,npoints ,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(a)') 'id:'
write(iulog,'(a)') 'surface'
write(iulog,'(a)') 'emiss_layer:'
write(iulog,'(8f7.2)') (dem(1,ibox),ibox=1,ncolprint)
write(iulog,'(a)') '100.*bb(j):'
write(iulog,'(8f7.2)') (100._r8*bb(j),ibox=1,ncolprint)
write(iulog,'(a)') '100.*f:'
write(iulog,'(8f7.2)') (100._r8*fluxtop(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'meantb(j):'
write(iulog,'(8f7.2)') (meantb(j),ibox=1,ncolprint)
end do
endif
!now that you have the top of atmosphere radiance account
!for ISCCP procedures to determine cloud top temperature
!account for partially transmitting cloud recompute flux
!ISCCP would see assuming a single layer cloud
!note choice here of 2.13, as it is primarily ice
!clouds which have partial emissivity and need the
!adjustment performed in this section
!
!If it turns out that the cloud brightness temperature
!is greater than 260K, then the liquid cloud conversion
!factor of 2.56 is used.
!
!Note that this is discussed on pages 85-87 of
!the ISCCP D level documentation (Rossow et al. 1996)
do j=1,npoints
!compute minimum brightness temperature and optical depth
btcmin(j) = 1._r8 / ( exp(1307.27_r8/(attrop(j)-5._r8)) - 1._r8 )
enddo
do ibox=1,ncol
do j=1,npoints
transmax(j) = (fluxtop(j,ibox)-btcmin(j)) &
/(fluxtop_clrsky(j)-btcmin(j))
!note that the initial setting of tauir(j) is needed so that
!tauir(j) has a realistic value should the next if block be
!bypassed
tauir(j) = tau(j,ibox) * rec2p13
taumin(j) = -1._r8 * log(max(min(transmax(j),0.9999999_r8),0.001_r8))
enddo
if (top_height .eq. 1) then
do j=1,npoints
if (transmax(j) .gt. 0.001_r8 .and. &
transmax(j) .le. 0.9999999_r8) then
fluxtopinit(j) = fluxtop(j,ibox)
tauir(j) = tau(j,ibox) *rec2p13
endif
enddo
do icycle=1,2
do j=1,npoints
if (tau(j,ibox) .gt. (tauchk )) then
if (transmax(j) .gt. 0.001_r8 .and. &
transmax(j) .le. 0.9999999_r8) then
emcld(j,ibox) = 1._r8 - exp(-1._r8 * tauir(j) )
fluxtop(j,ibox) = fluxtopinit(j) - &
((1._r8-emcld(j,ibox))*fluxtop_clrsky(j))
fluxtop(j,ibox)=max(1.E-06_r8, &
(fluxtop(j,ibox)/emcld(j,ibox)))
tb(j,ibox)= 1307.27_r8 &
/ (log(1._r8 + (1._r8/fluxtop(j,ibox))))
if (tb(j,ibox) .gt. 260._r8) then
tauir(j) = tau(j,ibox) / 2.56_r8
end if
end if
end if
enddo
enddo
endif
do j=1,npoints
if (tau(j,ibox) .gt. (tauchk )) then
!cloudy box
!NOTE: tb is the cloud-top temperature not
!infrared brightness temperature at this point in the code
tb(j,ibox)= 1307.27_r8/ (log(1._r8 + (1._r8/fluxtop(j,ibox))))
if (top_height.eq.1.and.tauir(j).lt.taumin(j)) then
tb(j,ibox) = attrop(j) - 5._r8
tau(j,ibox) = 2.13_r8*taumin(j)
end if
else
!clear sky brightness temperature
tb(j,ibox) = meantbclr(j)
end if
enddo ! j
enddo ! ibox
if (ncolprint.ne.0) then
do j=1,npoints,1000
write(iulog,'(a10)') 'j='
write(iulog,'(8I10)') j
write(iulog,'(a)') 'attrop:'
write(iulog,'(8f7.2)') (attrop(j))
write(iulog,'(a)') 'btcmin:'
write(iulog,'(8f7.2)') (btcmin(j))
write(iulog,'(a)') 'fluxtop_clrsky*100:'
write(iulog,'(8f7.2)') &
(100._r8*fluxtop_clrsky(j))
write(iulog,'(a)') '100.*f_adj:'
write(iulog,'(8f7.2)') (100._r8*fluxtop(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'transmax:'
write(iulog,'(8f7.2)') (transmax(ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'tau:'
write(iulog,'(8f7.2)') (tau(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'emcld:'
write(iulog,'(8f7.2)') (emcld(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'total_trans:'
write(iulog,'(8f7.2)') &
(trans_layers_above(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'total_emiss:'
write(iulog,'(8f7.2)') &
(1.0_r8-trans_layers_above(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'total_trans:'
write(iulog,'(8f7.2)') &
(trans_layers_above(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'ppout:'
write(iulog,'(8f7.2)') (tb(j,ibox),ibox=1,ncolprint)
enddo ! j
endif
end if
! ---------------------------------------------------!
!
! ---------------------------------------------------!
! DETERMINE CLOUD TOP PRESSURE
!
! again the 2 methods differ according to whether
! or not you use the physical cloud top pressure (top_height = 2)
! or the radiatively determined cloud top pressure (top_height = 1 or 3)
!
!compute cloud top pressure
do 30 ibox=1,ncol
!segregate according to optical thickness
if (top_height .eq. 1 .or. top_height .eq. 3) then
!find level whose temperature
!most closely matches brightness temperature
do j=1,npoints
nmatch(j)=0
enddo
do 29 k1=1,nlev-1
if (top_height_direction .eq. 2) then
ilev = nlev - k1
else
ilev = k1
end if
!cdir nodep
do j=1,npoints
if (ilev .ge. itrop(j)) then
if ((at(j,ilev) .ge. tb(j,ibox) .and. &
at(j,ilev+1) .le. tb(j,ibox)) .or. &
(at(j,ilev) .le. tb(j,ibox) .and. &
at(j,ilev+1) .ge. tb(j,ibox))) then
nmatch(j)=nmatch(j)+1
match(j,nmatch(j))=ilev
end if
end if
enddo
29 continue
do j=1,npoints
if (nmatch(j) .ge. 1) then
k1 = match(j,nmatch(j))
k2 = k1 + 1
logp1 = log(pfull(j,k1))
logp2 = log(pfull(j,k2))
atd = max(tauchk,abs(at(j,k2) - at(j,k1)))
logp=logp1+(logp2-logp1)*abs(tb(j,ibox)-at(j,k1))/atd
ptop(j,ibox) = exp(logp)
ttop(j,ibox)=tb(j,ibox)
if(abs(pfull(j,k1)-ptop(j,ibox)) .lt. &
abs(pfull(j,k2)-ptop(j,ibox))) then
levmatch(j,ibox)=k1
else
levmatch(j,ibox)=k2
end if
else
if (tb(j,ibox) .le. attrop(j)) then
ptop(j,ibox)=ptrop(j)
ttop(j,ibox)=attrop(j)
levmatch(j,ibox)=itrop(j)
end if
if (tb(j,ibox) .ge. atmax(j)) then
ptop(j,ibox)=pfull(j,nlev)
ttop(j,ibox)=atmax(j)
levmatch(j,ibox)=nlev
end if
!++ bee dbg
! if ((tb(j,ibox) .gt. attrop(j)) .and. (tb(j,ibox) .lt. atmax(j)) ) then
! write(iulog,*)'isccp_cloud_types: warning: nmatch=0 and attrop<tb<atmax'
! end if
!-- bee
end if
enddo ! j
else ! if (top_height .eq. 1 .or. top_height .eq. 3)
do j=1,npoints
ptop(j,ibox)=0._r8
ttop(j,ibox)=0._r8
enddo
do ilev=1,nlev
do j=1,npoints
if ((ptop(j,ibox) .eq. 0._r8 ) &
.and.(frac_out(j,ibox,ilev) .ne. 0)) then
ptop(j,ibox)=phalf(j,ilev)
levmatch(j,ibox)=ilev
end if
end do
end do
end if
do j=1,npoints
if (tau(j,ibox) .le. (tauchk )) then
ptop(j,ibox)=0._r8
levmatch(j,ibox)=0
endif
enddo
30 continue
!
!
! ---------------------------------------------------!
!
! ---------------------------------------------------!
! DETERMINE ISCCP CLOUD TYPE FREQUENCIES
!
! Now that ptop and tau have been determined,
! determine amount of each of the 49 ISCCP cloud
! types
!
! Also compute grid box mean cloud top pressure and
! optical thickness. The mean cloud top pressure and
! optical thickness are averages over the cloudy
! area only. The mean cloud top pressure is a linear
! average of the cloud top pressures. The mean cloud
! optical thickness is computed by converting optical
! thickness to an albedo, averaging in albedo units,
! then converting the average albedo back to a mean
! optical thickness.
!
!compute isccp frequencies
!reset frequencies
do 38 ilev=1,7
do 38 ilev2=1,7
do j=1,npoints !
if (sunlit(j).eq.1 .or. top_height .eq. 3) then
fq_isccp(j,ilev,ilev2)= 0.
else
fq_isccp(j,ilev,ilev2)= output_missing_value
end if
enddo
38 continue
!reset variables need for averaging cloud properties
do j=1,npoints
totalcldarea(j) = 0._r8
meanalbedocld(j) = 0._r8
meanptop(j) = 0._r8
meanttop(j) = 0._r8
meantaucld(j) = 0._r8
enddo ! j
boxarea = 1._r8/real(ncol,r8)
do 39 ibox=1,ncol
do j=1,npoints
if (tau(j,ibox) .gt. (tauchk ) &
.and. ptop(j,ibox) .gt. 0._r8) then
box_cloudy(j,ibox)=.true.
endif
if (box_cloudy(j,ibox)) then
if (sunlit(j).eq.1 .or. top_height .eq. 3) then
boxtau(j,ibox) = tau(j,ibox)
if (tau(j,ibox) .ge. isccp_taumin) then
totalcldarea(j) = totalcldarea(j) + boxarea
!convert optical thickness to albedo
albedocld(j,ibox) &
=(tau(j,ibox)**0.895_r8)/((tau(j,ibox)**0.895_r8)+6.82_r8)
!contribute to averaging
meanalbedocld(j) = meanalbedocld(j) &
+albedocld(j,ibox)*boxarea
end if
endif
endif
if (sunlit(j).eq.1 .or. top_height .eq. 3) then
!convert ptop to millibars
ptop(j,ibox)=ptop(j,ibox) / 100._r8
!save for output cloud top pressure and optical thickness
boxptop(j,ibox) = ptop(j,ibox)
if (box_cloudy(j,ibox)) then
if (tau(j,ibox) .ge. isccp_taumin) then
meanptop(j) = meanptop(j) + ptop(j,ibox)*boxarea
meanttop(j) = meanttop(j) + ttop(j,ibox)*boxarea
end if
!reset itau(j), ipres(j)
itau(j) = 0
ipres(j) = 0
!determine optical depth category
if (tau(j,ibox) .lt. isccp_taumin) then
itau(j)=1
else if (tau(j,ibox) .ge. isccp_taumin &
.and. tau(j,ibox) .lt. 1.3_r8) then
itau(j)=2
else if (tau(j,ibox) .ge. 1.3_r8 &
.and. tau(j,ibox) .lt. 3.6_r8) then
itau(j)=3
else if (tau(j,ibox) .ge. 3.6_r8 &
.and. tau(j,ibox) .lt. 9.4_r8) then
itau(j)=4
else if (tau(j,ibox) .ge. 9.4_r8 &
.and. tau(j,ibox) .lt. 23._r8) then
itau(j)=5
else if (tau(j,ibox) .ge. 23._r8 &
.and. tau(j,ibox) .lt. 60._r8) then
itau(j)=6
else if (tau(j,ibox) .ge. 60._r8) then
itau(j)=7
end if
!determine cloud top pressure category
if ( ptop(j,ibox) .gt. 0._r8 &
.and.ptop(j,ibox) .lt. 180._r8) then
ipres(j)=1
else if(ptop(j,ibox) .ge. 180._r8 &
.and.ptop(j,ibox) .lt. 310._r8) then
ipres(j)=2
else if(ptop(j,ibox) .ge. 310._r8 &
.and.ptop(j,ibox) .lt. 440._r8) then
ipres(j)=3
else if(ptop(j,ibox) .ge. 440._r8 &
.and.ptop(j,ibox) .lt. 560._r8) then
ipres(j)=4
else if(ptop(j,ibox) .ge. 560._r8 &
.and.ptop(j,ibox) .lt. 680._r8) then
ipres(j)=5
else if(ptop(j,ibox) .ge. 680._r8 &
.and.ptop(j,ibox) .lt. 800._r8) then
ipres(j)=6
else if(ptop(j,ibox) .ge. 800._r8) then
ipres(j)=7
end if
!update frequencies
if(ipres(j) .gt. 0.and.itau(j) .gt. 0) then
fq_isccp(j,itau(j),ipres(j))= &
fq_isccp(j,itau(j),ipres(j))+ boxarea
end if
end if
end if
enddo ! j
39 continue
!compute mean cloud properties
do j=1,npoints
if (totalcldarea(j) .gt. 0._r8) then
! code above guarantees that totalcldarea > 0
! only if sunlit .eq. 1 .or. top_height = 3
! and applies only to clouds with tau > isccp_taumin
meanptop(j) = meanptop(j) / totalcldarea(j)
meanttop(j) = meanttop(j) / totalcldarea(j)
meanalbedocld(j) = meanalbedocld(j) / totalcldarea(j)
meantaucld(j) = &
(6.82_r8/((1./meanalbedocld(j))-1._r8))**(1._r8/0.895_r8)
else
! this code is necessary so that in the case that totalcldarea = 0.,
! that these variables, which are in-cloud averages, are set to missing
! note that totalcldarea will be 0. if all the clouds in the grid box have
! tau < isccp_taumin
meanptop(j) = output_missing_value
meanttop(j) = output_missing_value
meanalbedocld(j) = output_missing_value
meantaucld(j) = output_missing_value
end if
enddo ! j
!
! ---------------------------------------------------!
! ---------------------------------------------------!
! OPTIONAL PRINTOUT OF DATA TO CHECK PROGRAM
!
if (debugcol.ne.0) then
!
do j=1,npoints,debugcol
!produce character output
do ilev=1,nlev
do ibox=1,ncol
acc(ilev,ibox)=0
enddo
enddo
do ilev=1,nlev
do ibox=1,ncol
acc(ilev,ibox)=frac_out(j,ibox,ilev)*2
if (levmatch(j,ibox) .eq. ilev) &
acc(ilev,ibox)=acc(ilev,ibox)+1
enddo
enddo
!print test
write(ftn09,11) j
11 format('ftn09.',i4.4)
unitn = getunit
()
open(unitn, FILE=ftn09, FORM='FORMATTED')
write(unitn,'(a1)') ' '
write(unitn,'(10i5)') (ilev,ilev=5,nlev,5)
write(unitn,'(a1)') ' '
do ibox=1,ncol
write(unitn,'(40(a1),1x,40(a1))') &
(cchar_realtops(acc(ilev,ibox)+1),ilev=1,nlev) &
,(cchar(acc(ilev,ibox)+1),ilev=1,nlev)
end do
close( unitn )
call freeunit
( unitn )
if (ncolprint.ne.0) then
write(iulog,'(a1)') ' '
write(iulog,'(a2,1X,5(a7,1X),a50)') &
'ilev', &
'pfull','at', &
'cc*100','dem_s','dtau_s', &
'cchar'
! do 4012 ilev=1,nlev
! write(iulog,'(60i2)') (box(i,ilev),i=1,ncolprint)
! write(iulog,'(i2,1X,5(f7.2,1X),50(a1))') &
! ilev, &
! pfull(j,ilev)/100.,at(j,ilev), &
! cc(j,ilev)*100.0,dem_s(j,ilev),dtau_s(j,ilev) &
! ,(cchar(acc(ilev,ibox)+1),ibox=1,ncolprint)
!4012 continue
write(iulog,'(a)') 'skt(j):'
write(iulog,'(8f7.2)') skt(j)
write(iulog,'(8I7)') (ibox,ibox=1,ncolprint)
write(iulog,'(a)') 'tau:'
write(iulog,'(8f7.2)') (tau(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'tb:'
write(iulog,'(8f7.2)') (tb(j,ibox),ibox=1,ncolprint)
write(iulog,'(a)') 'ptop:'
write(iulog,'(8f7.2)') (ptop(j,ibox),ibox=1,ncolprint)
endif
enddo
end if
return
end subroutine ISCCP_CLOUD_TYPES
end module icarus_scops_38