! $Id: fast_j.f,v 1.7 2007/11/05 16:16:18 bmy Exp $
SUBROUTINE FAST_J( SUNCOS, OD, ALBD ) 2,18
!
!******************************************************************************
! Subroutine FAST_J loops over longitude and latitude, and calls PHOTOJ
! to compute J-Values for each column at every chemistry time-step.
! (ppm, 4/98; bmy, rvm, 9/99, 2/6/04; hyl, 4/25/04; phs, bmy, 6/8/07 )
!
! Arguments as Input:
! ============================================================================
! (1 ) SUNCOS (REAL*8) : Cosine of solar zenith angle [unitless]
! (2 ) OD (REAL*8) : Cloud optical depth [unitless]
! (3 ) ALBD (REAL*8) : UV albedo [unitless]
!
! Parameter to choose cloud overlap algorithm:
! ============================================================================
! (1 ) OVERLAP (INTEGER) : 1 - Linear Approximation (used up to v7-04-12)
! 2 - Approximate Random Overlap (default)
! 3 - Maximum Random Overlap (computation intensive)
! References:
! ============================================================================
! (1) H. Liu, J.H. Crawford, R.B. Pierce, P. Norris, S.E. Platnick, G. Chen,
! J.A. Logan, R.M. Yantosca, M.J. Evans, C. Kittaka, Y. Feng, and
! X. Tie, "Radiative effect of clouds on tropospheric chemistry in a
! global three-dimensional chemical transport model", J. Geophys. Res.,
! vol.111, D20303, doi:10.1029/2005JD006403, 2006.
! http://research.nianet.org/~hyl/publications/liu2006_cloud1.abs.html
!
! NOTES:
! ======
! (1 ) Call this routine EACH chemistry time-step, before solver.
! (2 ) This routine must know IMAX, JMAX, LMAX.
! (3 ) Now use new !$OMP compiler directives for parallelization (bmy, 5/2/00)
! (4 ) Now reference "cmn_fj.h" and "jv_cmn.h" for the aerosol
! optical depths (bmy, 10/2/00)
! (5 ) Add OPTDUST as a local variable -- make OPTDUST private for
! the parallel DO-loop, since it stores 1 column of aerosol optical
! depth for each dust type (bmy, rvm, 10/2/00)
! (6 ) For now, LPAR in "cmn_fj.h" = LGLOB in "CMN_SIZE". Therefore we
! assume that we are always doing global runs. (bmy, 10/2/00)
! (7 ) Removed obsolete code from 10/2/00 (bmy, 12/21/00)
! (8 ) Replace {IJL}GLOB w/ IIPAR,JJPAR,LLPAR everywhere. Also YLMID(NLAT)
! needs to be referenced by YLMID(NLAT+J0). (bmy, 9/26/01)
! (9 ) Remove obsolete code from 9/01. Updated comments. (bmy, 10/24/01)
! (10) Add OPTAER as a local variable, make it private for the parallel
! DO loop, since it stores 1 column of aerosol optical depths for each
! aerosol type. Pass OPTAER to PHOTOJ via the argument list. Declare
! OPTAER as PRIVATE for the parallel DO-loop. (rvm, bmy, 2/27/02)
! (11) Now reference GET_PEDGE from "pressure_mod.f", which returns the
! correct "floating" pressure. (dsa, bdf, bmy, 8/20/02)
! (12) Now reference T from "dao_mod.f" (bmy, 9/23/02)
! (13) Now uses routine GET_YMID from "grid_mod.f" to compute grid box
! latitude. Now make IDAY, MONTH local variables. Now use function
! GET_DAY_OF_YEAR from "time_mod.f". Bug fix: now IDAY (as passed to
! photoj.f) is day of year rather than cumulative days since Jan 1,
! 1985. (bmy, 2/11/03)
! (14) Now reference routine GET_YEAR from "time_mod.f". Added LASTMONTH
! as a SAVEd variable. Now call READ_TOMSO3 from "toms_mod.f" at the
! beginning of a new month (or the first timestep) to read TOMS O3
! columns which will be used by "set_prof.f". Now also reference
! routine GET_DAY from "time_mod.f". Rename IDAY to DAY_OF_YR. Pass
! day of month to PHOTOJ. Updated comments, cosmetic changes.
! (bmy, 7/17/03)
! (15) Bug fix: PRES needs to be the true surface pressure for GEOS-4, but
! PS-PTOP for all prior GEOS models. (bmy, 2/6/04)
! (16) Now account for cloud overlap (Maximum-Random Overlap and Random
! Overlap) in each column (hyl, phs, bmy, 9/18/07)
!******************************************************************************
!
! References to F90 modules
USE DAO_MOD
, ONLY : T, CLDF
USE ERROR_MOD
, ONLY : ERROR_STOP
USE GRID_MOD
, ONLY : GET_YMID
USE PRESSURE_MOD
, ONLY : GET_PEDGE
USE TIME_MOD
, ONLY : GET_MONTH, GET_DAY, GET_DAY_OF_YEAR,
& GET_TAU, GET_YEAR
USE TOMS_MOD
, ONLY : READ_TOMS
IMPLICIT NONE
# include "cmn_fj.h" ! IPAR, JPAR, LPAR, CMN_SIZE
# include "CMN" ! P, T, YLMID
# include "jv_cmn.h" ! ODMDUST
! Arguments
REAL*8, INTENT(IN) :: SUNCOS(MAXIJ)
REAL*8, INTENT(IN) :: OD(LLPAR,IIPAR,JJPAR)
REAL*8, INTENT(IN) :: ALBD(IIPAR,JJPAR)
! Local variables
INTEGER, SAVE :: LASTMONTH = -1
INTEGER :: NLON, NLAT, DAY, MONTH, DAY_OF_YR
REAL*8 :: CSZA, PRES, SFCA, YLAT
REAL*8 :: TEMP(LLPAR), OPTD(LLPAR)
REAL*8 :: OPTDUST(LLPAR,NDUST)
REAL*8 :: OPTAER(LLPAR,NAER*NRH)
! Local variables for cloud overlap (hyl, phs)
INTEGER :: NUMB, KK, I
INTEGER :: INDIC(LLPAR+1)
INTEGER :: INDGEN(LLPAR+1) = (/ (i,i=1,LLPAR+1) /)
INTEGER :: KBOT(LLPAR)
INTEGER :: KTOP(LLPAR)
INTEGER :: INDICATOR(LLPAR+2)
REAL*8 :: FMAX(LLPAR) ! maximum cloud fraction
! in a block, size can be to
! FIX(LLPAR)+1
REAL*8 :: CLDF1D(LLPAR)
REAL*8 :: ODNEW(LLPAR)
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
!%%% NOTE: We will eventually want to use OVERLAP=2 (approx ran overlap)
!%%% as the default for GEOS-Chem simulations. However, before we can
!%%% commit to this change, we will have to perform a 1yr benchmark
!%%% simulation with this option turned on. Until this happens, select
!%%% the linear approximation (OVERLAP=1) for compatibility with prior
!%%% GEOS-Chem versions. (bmy, 9/18/07)
!INTEGER, PARAMETER :: OVERLAP = 2
INTEGER, PARAMETER :: OVERLAP = 1
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
LOGICAL, SAVE :: FIRST = .true.
!=================================================================
! FAST_J begins here!
!=================================================================
! Get day of year (0-365 or 0-366)
DAY_OF_YR = GET_DAY_OF_YEAR
()
! Get current month
MONTH = GET_MONTH
()
! Get day of month
DAY = GET_DAY
()
! Read TOMS O3 columns if it's a new month
IF ( MONTH /= LASTMONTH ) THEN
CALL READ_TOMS
( MONTH, GET_YEAR
() )
LASTMONTH = MONTH
ENDIF
!=================================================================
! For each (NLON,NLAT) location, call subroutine PHOTOJ (in a
! parallel loop to compute J-values for the entire column.
! J-values will be stored in the common-block variable ZPJ, and
! will be later accessed via function FJFUNC.
!=================================================================
!$OMP PARALLEL DO
!$OMP+DEFAULT( SHARED )
!$OMP+PRIVATE( NLON, NLAT, YLAT, CSZA, OPTAER )
!$OMP+PRIVATE( PRES, TEMP, OPTD, SFCA, OPTDUST )
!$OMP+PRIVATE( FMAX, CLDF1D, KK, NUMB )
!$OMP+PRIVATE( KBOT, KTOP, ODNEW, INDICATOR, INDIC )
!$OMP+SCHEDULE( DYNAMIC )
DO NLAT = 1, JJPAR
! Grid box latitude [degrees]
YLAT = GET_YMID
( NLAT )
DO NLON = 1, IIPAR
! Cosine of solar zenith angle [unitless] at (NLON,NLAT)
CSZA = SUNCOS( (NLAT-1)*IIPAR + NLON )
#if defined( GEOS_4 )
! GEOS-4 needs true sfc pressure [hPa] at (NLON,NLAT)
PRES = GET_PEDGE
(NLON,NLAT,1)
#else
! Sigma grids need ( sfc Pressure - PTOP ) [hPa] at (NLON,NLAT)
PRES = GET_PEDGE
(NLON,NLAT,1) - PTOP
#endif
! Temperature profile [K] at (NLON,NLAT)
TEMP = T(NLON,NLAT,1:LLPAR)
! Surface albedo [unitless] at (NLON,NLAT)
SFCA = ALBD(NLON,NLAT)
! Aerosol OD profile [unitless] at (NLON,NLAT)
OPTAER(:,:) = ODAER(NLON,NLAT,:,:)
! Mineral dust OD profile [unitless] at (NLON,NLAT)
OPTDUST(:,:) = ODMDUST(NLON,NLAT,:,:)
! Cloud OD profile [unitless] at (NLON,NLAT)
OPTD = OD(1:LLPAR,NLON,NLAT)
!-----------------------------------------------------------
!### If you want to exclude aerosol OD, mineral dust OD,
!### or cloud OD, then uncomment the following lines:
!OPTAER = 0d0
!OPTDUST = 0d0
!OPTD = 0d0
!-----------------------------------------------------------
!===========================================================
! CLOUD OVERLAP : LINEAR ASSUMPTION
! Directly use OPTDEPTH = TAUCLD * CLDTOT
!
! NOTE: Use this option if you want to compare to results
! from GEOS-Chem v7-04-12 and prior versions.
!===========================================================
IF ( OVERLAP == 1 ) then
! Call FAST-J routines to compute J-values
CALL PHOTOJ
( NLON, NLAT, YLAT, DAY_OF_YR,
& MONTH, DAY, CSZA, PRES,
& TEMP, SFCA, OPTD, OPTDUST, OPTAER )
!===========================================================
! CLOUD OVERLAP : APPROXIMATE RANDOM OVERLAP
! Use OPTDEPTH = TAUCLD * CLDTOT**1.5
!===========================================================
ELSE IF ( OVERLAP == 2 ) THEN
! Column cloud fraction (not less than zero)
CLDF1D = CLDF(1:LLPAR,NLON,NLAT)
WHERE ( CLDF1D < 0d0 ) CLDF1D = 0d0
! Adjust optical depth
OPTD = OPTD * SQRT( CLDF1D )
! Call FAST-J routines to compute J-values
CALL PHOTOJ
( NLON, NLAT, YLAT, DAY_OF_YR,
& MONTH, DAY, CSZA, PRES,
& TEMP, SFCA, OPTD, OPTDUST, OPTAER )
!===========================================================
! CLOUD OVERLAP : MAXIMUM RANDOM OVERLAP
!
! The Maximum-Random Overlap (MRAN) scheme assumes that
! clouds in adjacent layers are maximally overlapped to
! form a cloud block and that blocks of clouds separated by
! clear layers are randomly overlapped. A vertical profile
! of fractional cloudiness is converted into a series of
! column configurations with corresponding fractions
! (see Liu et al., JGR 2006; hyl,3/3/04).
!
! For more details about cloud overlap assumptions and
! their effect on photolysis frequencies and key oxidants
! in the troposphere, refer to the following articles:
!
! (1) Liu, H., et al., Radiative effect of clouds on
! tropospheric chemistry in a global three-dimensional
! chemical transport model, J. Geophys. Res., vol.111,
! D20303, doi:10.1029/2005JD006403, 2006.
! (2) Tie, X., et al., Effect of clouds on photolysis and
! oxidants in the troposphere, J. Geophys. Res.,
! 108(D20), 4642, doi:10.1029/2003JD003659, 2003.
! (3) Feng, Y., et al., Effects of cloud overlap in
! photochemical models, J. Geophys. Res., 109,
! D04310, doi:10.1029/2003JD004040, 2004.
! (4) Stubenrauch, C.J., et al., Implementation of subgrid
! cloud vertical structure inside a GCM and its effect
! on the radiation budget, J. Clim., 10, 273-287, 1997.
!-----------------------------------------------------------
! MMRAN needs IN-CLOUD optical depth (ODNEW) as input
! Use cloud fraction, instead of OPTD, to form cloud blocks
! (hyl,06/19/04)
!===========================================================
ELSE IF ( OVERLAP == 3 ) THEN
! Initialize
FMAX(:) = 0d0 ! max cloud fraction in each cloud block
ODNEW(:) = 0d0 ! in-cloud optical depth
CLDF1D = CLDF(1:LLPAR,NLON,NLAT)
INDICATOR = 0
! set small negative CLDF or OPTD to zero.
! Set indicator vector.
WHERE ( CLDF1D <= 0d0 )
CLDF1D = 0d0
OPTD = 0D0
ELSEWHERE
INDICATOR(2:LLPAR+1) = 1
ENDWHERE
! Prevent negative opt depth
WHERE ( OPTD < 0D0 ) OPTD = 0D0
!--------------------------------------------------------
! Generate cloud blocks & get their Bottom and Top levels
!--------------------------------------------------------
INDICATOR = CSHIFT(INDICATOR, 1) - INDICATOR
INDIC = INDICATOR(1:LLPAR+1)
! Number of cloud block
NUMB = COUNT( INDIC == 1 )
! Bottom layer of each block
KBOT(1:NUMB) = PACK(INDGEN, (INDIC == 1 ) )
! Top layer of each block
KTOP(1:NUMB) = PACK(INDGEN, (INDIC == -1) ) - 1
!--------------------------------------------------------
! For each cloud block, get Max Cloud Fractions, and
! in-cloud optical depth vertical distribution.
!--------------------------------------------------------
DO KK = 1, NUMB
! Max cloud fraction
FMAX(KK) = MAXVAL( CLDF1D(KBOT(KK):KTOP(KK)) )
! ODNEW is adjusted in-cloud OD vertical distrib.
ODNEW(KBOT(KK):KTOP(KK)) = OPTD(KBOT(KK):KTOP(KK)) /
& FMAX(KK)
ENDDO
!--------------------------------------------------------
! Apply Max RANdom if 1-6 clouds blocks, else use linear
!--------------------------------------------------------
SELECT CASE( NUMB )
CASE( 0,7: )
CALL PHOTOJ
( NLON, NLAT, YLAT, DAY_OF_YR,
& MONTH, DAY, CSZA, PRES,
& TEMP, SFCA, OPTD, OPTDUST, OPTAER )
CASE( 1:6 )
CALL MMRAN_16
( NUMB, NLON, NLAT, YLAT,
& DAY, MONTH, DAY_OF_YR, CSZA,
& PRES, TEMP, SFCA, OPTDUST,
& OPTAER, LLPAR, FMAX, ODNEW,
& KBOT, KTOP )
END SELECT
ENDIF
ENDDO
ENDDO
!$OMP END PARALLEL DO
!-----------------------------------------------------------
! END OF SUBROUTINE FAST-J
!-----------------------------------------------------------
END SUBROUTINE FAST_J