Add files via upload

This commit is contained in:
Xuesong (Steve)
2018-08-28 00:43:47 -04:00
committed by GitHub
parent b9acb75507
commit e17feeaad3
96 changed files with 68216 additions and 0 deletions

338
code/critical_load_mod.f Normal file
View File

@ -0,0 +1,338 @@
!
MODULE CRITICAL_LOAD_MOD
!module critical_load contains variable and routines to read acidity/N deposition critical loads over the US (SD) and generate map of exceedence
IMPLICIT NONE
! Make everything private
PRIVATE
!except
PUBLIC :: GET_CL_EXCEEDENCE
PUBLIC :: CL_FILENAME
PUBLIC :: GC_FILENAME
CHARACTER*255 :: CL_FILENAME
CHARACTER*255 :: GC_FILENAME
!very large value used to generate critical load files
!to make sure no exceedence is found in regions where CL is not defined
INTEGER, PARAMETER :: MISSING_VALUE = 9D6
CONTAINS
!------------------------------------------------------------------------------
SUBROUTINE READ_CRITICAL_LOAD(CRIT_L)
! Subroutine read_critical_load is used to read annual critical/load acidification files.
! Files are in netcdf format (spatial resolution is reduced nested domain over the US)
USE TRANSFER_MOD, ONLY : TRANSFER_2D
USE NETCDF_UTIL_MOD
# include "CMN_SIZE"
REAL*8, INTENT(OUT) :: CRIT_L(IIPAR,JJPAR)
REAL*4 :: ARRAY(IIPAR,JJPAR)
INTEGER :: I,J
INTEGER :: fileID, varID
CHARACTER*255 :: FILENAME
WRITE(6,*) '=========================='
WRITE(6,*) '=== Read Critical load ==='
WRITE(6,*) '=========================='
call ncdf_open_for_read( fileID, TRIM(CL_FILENAME) )
varID = ncdf_get_varid( fileID, 'ecoreg' )
call ncdf_get_var( fileID, varID, array,
& start=(/ 1, 1 /),
& count=(/ iipar, jjpar /) )
! real*4->real*8
CALL TRANSFER_2D( ARRAY, CRIT_L )
WRITE(*,*) 'Min Critical Load: ',MINVAL( CRIT_L )
WRITE(*,*) 'Max Critical Load: ',MAXVAL( CRIT_L,
& MASK = CRIT_L < MISSING_VALUE )
END SUBROUTINE READ_CRITICAL_LOAD
!------------------------------------------------------------------------------
SUBROUTINE READ_GC_LOAD(GC_L)
! Subroutine read_annual deposition. Read GC calculated deposition from 3yr nested simulation (lzh)
USE TRANSFER_MOD, ONLY : TRANSFER_2D
USE NETCDF_UTIL_MOD
USE TRACERID_MOD, ONLY : IDTNH3, IDTNH4, IDTNIT, IDTNITs
USE TRACERID_MOD, ONLY : IDTHNO3, IDTR4N2, IDTPMN, IDTPPN
USE TRACERID_MOD, ONLY : IDTPAN, IDTNOX, IDTN2O5
USE TRACERID_MOD, ONLY : IDTSO2, IDTSO4, IDTSO4s
USE TRACER_MOD, ONLY : TRACER_MW_KG, TRACER_NAME
USE LOGICAL_ADJ_MOD, ONLY : LADJ_CL_ACID, LADJ_CL_NDEP
USE GRID_MOD, ONLY : GET_AREA_M2
USE LOGICAL_MOD, ONLY : LPRT
# include "CMN_SIZE"
REAL*8, INTENT(OUT) :: GC_L(IIPAR,JJPAR)
REAL*4 :: ARRAY(IIPAR,JJPAR)
REAL*8 :: ARRAY8(IIPAR,JJPAR)
REAL*8 :: SWET(IIPAR,JJPAR)
INTEGER :: N, NMAX
INTEGER :: fileID, varID
INTEGER :: I,J
REAL*8 :: TRACER(18)
REAL*8 :: DRY(IIPAR,JJPAR)
REAL*8 :: TEMP(IIPAR,JJPAR)
WRITE(6,*) '===================='
WRITE(6,*) '=== Read GC load ==='
WRITE(6,*) '===================='
TRACER( 1 ) = IDTHNO3
TRACER( 2 ) = IDTR4N2
TRACER( 3 ) = IDTPMN
TRACER( 4 ) = IDTPPN
TRACER( 5 ) = IDTPAN
TRACER( 6 ) = IDTNOX
TRACER( 7 ) = IDTN2O5
TRACER( 8 ) = IDTN2O5 !repeat N2O5 as it contains two N
TRACER( 9 ) = IDTNH3
TRACER(10 ) = IDTNH4
TRACER(11 ) = IDTNIT
TRACER(12 ) = IDTNITs
!repeat S tracers since they contain two equivalents
TRACER(13) = IDTSO2
TRACER(14) = IDTSO4
TRACER(15) = IDTSO4s
TRACER(16) = IDTSO2
TRACER(17) = IDTSO4
TRACER(18) = IDTSO4s
GC_L(:,:) = 0d0
SWET(:,:) = 0d0
DRY(:,:) = 0d0
IF ( LADJ_CL_ACID ) THEN
NMAX = 18
ELSEIF (LADJ_CL_NDEP) THEN
NMAX = 12
ENDIF
! open netcdf file
call ncdf_open_for_read( fileID, TRIM(GC_FILENAME) )
DO N = 1,NMAX
! read dry deposition
IF (LPRT) THEN
WRITE(6,100) TRIM(TRACER_NAME(TRACER(N)))
ENDIF
IF ( TRACER(N) .EQ. IDTNOx) THEN
varID = ncdf_get_varid( fileID,
& 'DRY_NO2' )
ELSE
varID = ncdf_get_varid( fileID,
& 'DRY_' // TRIM(TRACER_NAME(TRACER(N))) )
ENDIF
call ncdf_get_var( fileID, varID, array,
& start=(/ 1, 1 /),
& count=(/ iipar, jjpar /) )
! real*4->real*8
CALL TRANSFER_2D( ARRAY, ARRAY8 )
IF ( LADJ_CL_NDEP ) THEN
! convert from molec/cm2/s to kgN/ha/yr
GC_L(:,:) = GC_L(:,:) +
& 14D-3 / 6.022D23 *
& 1D8 *
& 86400D0 * 365D0 *
& ARRAY8(:,:)
!for diagnostics (kgN/cm2/yr)
DRY(:,:) = DRY(:,:) +
& 14D-3 / 6.022D23 *
& 86400D0 * 365D0 *
& ARRAY8(:,:)
DO J = 1, JJPAR
TEMP(:,J) = 14D-3 / 6.022D23 *
& 86400D0 * 365D0 *
& ARRAY8(:,J) * GET_AREA_M2(J) *
& 1D4
ENDDO
ELSEIF ( LADJ_CL_ACID ) THEN
! convert from molec/cm2/s to equiv/ha/yr
GC_L(:,:) = GC_L(:,:) +
& 1D0 / 6.022D23 *
& 1D8 *
& 86400D0 * 365D0 *
& ARRAY8(:,:)
! for diagnostics equiv/cm2/yr
DRY(:,:) = DRY(:,:) +
& 1D0 / 6.022D23 *
& 86400D0 * 365D0 *
& ARRAY8(:,:)
ENDIF
! read wet deposition
IF ( LPRT ) THEN
WRITE(6,101) TRIM( TRACER_NAME(TRACER(N)) )
ENDIF
! no wet deposition for NOx so no need to read NOx
IF ( IDTNOx .NE. TRACER(N) ) THEN
varID = ncdf_get_varid( fileID,
& 'WET_' // TRIM( TRACER_NAME( TRACER(N))) )
call ncdf_get_var( fileID, varID, array,
& start=(/ 1, 1 /),
& count=(/ iipar, jjpar /) )
! real*4->real*8
CALL TRANSFER_2D( ARRAY, ARRAY8 )
IF ( LADJ_CL_NDEP ) THEN
! convert from kg/s to kgN/yr
SWET(:,:) = SWET(:,:) +
& 14D-3 / TRACER_MW_KG( TRACER(N) ) *
& 86400D0 * 365D0 *
& ARRAY8(:,:)
ELSEIF ( LADJ_CL_ACID ) THEN
! convert from kg/s to equiv/yr
SWET(:,:) = SWET(:,:) +
& 1D0 / TRACER_MW_KG( TRACER(N) ) *
& 86400D0 * 365D0 *
& ARRAY8(:,:)
ENDIF
ENDIF
ENDDO
!for diagnostics
DO J = 1,JJPAR
DRY(:,J) = DRY(:,J) *
& GET_AREA_M2(J) * 1D4
ENDDO
WRITE(*,*) 'GC deposition (wet): ',SUM( SWET )
WRITE(*,*) 'GC deposition (dry): ',SUM( DRY )
!convert SWET from equiv/yr to equiv/yr/ha
!add to critical load
DO J = 1, JJPAR
GC_L(:,J) = GC_L(:,J) +
& SWET(:,J) / GET_AREA_M2(J) * 1D4
ENDDO
WRITE(*,*) 'Min GC Load: ', MINVAL( GC_L(:,:) )
WRITE(*,*) 'Max GC Load: ', MAXVAL( GC_L(:,:) )
100 FORMAT('Dry deposition :',a)
101 FORMAT('Wet deposition :',a)
END SUBROUTINE READ_GC_LOAD
!------------------------------------------------------------------------------
!
SUBROUTINE GET_CL_EXCEEDENCE( EXCEEDENCE )
! generate maks for criticial load exceedence
!
USE BPCH2_MOD
USE LOGICAL_MOD, ONLY : LPRT
USE FILE_MOD, ONLY : IU_DEBUG
# include "CMN_SIZE"
REAL*8, INTENT(OUT) :: EXCEEDENCE(IIPAR,JJPAR)
REAL*8 :: CRIT_L(IIPAR,JJPAR)
REAL*8 :: GC_L(IIPAR,JJPAR)
INTEGER :: I,J,NE,DEFINED
EXCEEDENCE(:,:) = 0d0
NE = 0
DEFINED = 0
! read GC load from deposition
CALL READ_GC_LOAD(GC_L)
! read critical load (deposition)
CALL READ_CRITICAL_LOAD(CRIT_L)
DO I = 1, IIPAR
DO J = 1, JJPAR
IF ( GC_L(I,J) .GT. CRIT_L(I,J) ) THEN
EXCEEDENCE(I,J) = 1D0
NE = NE + 1
ENDIF
! count the number of grid cells where a critical load is defined
IF ( CRIT_L(I,J) .LT. MISSING_VALUE ) THEN
DEFINED = DEFINED + 1
ENDIF
ENDDO
ENDDO
WRITE(6,*) 'Number of exceedences: ', NE
WRITE(6,*) 'Fraction of grid cells with exceedence',
& REAL(NE)/REAL(DEFINED)
! write out exceedence to bpch file
OPEN( IU_DEBUG, FILE='critical_load.log', STATUS='UNKNOWN' )
DO I = 1, IIPAR
DO J = 1, JJPAR
WRITE( IU_DEBUG, '(F10.3,X)', advance='no' ) EXCEEDENCE(I,J)
ENDDO
WRITE( IU_DEBUG,* )
END DO
CLOSE( IU_DEBUG )
END SUBROUTINE GET_CL_EXCEEDENCE
!------------------------------------------------------------------------------
END MODULE CRITICAL_LOAD_MOD