Files
GEOS-Chem-adjoint-v35-note/code/modified/atom_obs_mod.f90
2018-08-28 00:37:54 -04:00

236 lines
8.3 KiB
Fortran

MODULE ATOM_OBS_MOD
IMPLICIT NONE
INTEGER :: N_ATOM
INTEGER :: FILLER
REAL*8, ALLOCATABLE :: YEAR_ATOM(:), DAY_ATOM(:), TIME_ATOM(:)
REAL*8, ALLOCATABLE :: LON_ATOM(:), LAT_ATOM(:), ALT_ATOM(:)
REAL*8, ALLOCATABLE :: O3_UCATS(:), O3_NOy(:), OH_ATOM(:)
REAL*8, ALLOCATABLE :: MONTH_ATOM(:), CO_GEOS(:), CO_UCATS(:)
REAL*8, ALLOCATABLE :: CH2O_ATOM(:), OH_GC(:), O3_GC(:)
REAL*8, ALLOCATABLE :: CO_GC(:), CH2O_GC(:)
REAL*8, ALLOCATABLE :: NO2_ATOM(:), NO2_GC(:)
CONTAINS
!============================================================================
SUBROUTINE CLEANUP_ATOM
!! Clean up ATOM arrays
IF (ALLOCATED(YEAR_ATOM)) DEALLOCATE(YEAR_ATOM)
IF (ALLOCATED(MONTH_ATOM)) DEALLOCATE(MONTH_ATOM)
IF (ALLOCATED(DAY_ATOM)) DEALLOCATE(DAY_ATOM)
IF (ALLOCATED(TIME_ATOM)) DEALLOCATE(TIME_ATOM)
IF (ALLOCATED(LON_ATOM)) DEALLOCATE(LON_ATOM)
IF (ALLOCATED(LAT_ATOM)) DEALLOCATE(LAT_ATOM)
IF (ALLOCATED(ALT_ATOM)) DEALLOCATE(ALT_ATOM)
IF (ALLOCATED(OH_ATOM)) DEALLOCATE(OH_ATOM)
IF (ALLOCATED(O3_UCATS)) DEALLOCATE(O3_UCATS)
IF (ALLOCATED(O3_NOy)) DEALLOCATE(O3_NOy)
IF (ALLOCATED(CO_GEOS)) DEALLOCATE(CO_GEOS)
IF (ALLOCATED(CO_UCATS)) DEALLOCATE(CO_UCATS)
IF (ALLOCATED(CH2O_ATOM)) DEALLOCATE(CH2O_ATOM)
IF (ALLOCATED(NO2_ATOM)) DEALLOCATE(NO2_ATOM)
IF (ALLOCATED(OH_GC)) DEALLOCATE(OH_GC)
IF (ALLOCATED(O3_GC)) DEALLOCATE(O3_GC)
IF (ALLOCATED(CO_GC)) DEALLOCATE(CO_GC)
IF (ALLOCATED(CH2O_GC)) DEALLOCATE(CH2O_GC)
IF (ALLOCATED(NO2_GC)) DEALLOCATE(NO2_GC)
END SUBROUTINE CLEANUP_ATOM
!============================================================================
SUBROUTINE INIT_ATOM
!! Initialize ATOM arrays
!ATOM from 2016-08-01 to 2016-08-12 is ATOM1-1
N_ATOM = 7794
!ATOM from 2016-08-15 to 2016-08-31 is ATOM1-2
!N_ATOM = 6957
FILLER = -999
ALLOCATE(YEAR_ATOM(N_ATOM))
ALLOCATE(MONTH_ATOM(N_ATOM))
ALLOCATE(DAY_ATOM(N_ATOM))
ALLOCATE(TIME_ATOM(N_ATOM))
ALLOCATE(LON_ATOM(N_ATOM))
ALLOCATE(LAT_ATOM(N_ATOM))
ALLOCATE(ALT_ATOM(N_ATOM))
ALLOCATE(O3_NOy(N_ATOM))
ALLOCATE(O3_UCATS(N_ATOM))
ALLOCATE(CO_GEOS(N_ATOM))
ALLOCATE(CO_UCATS(N_ATOM))
ALLOCATE(CH2O_ATOM(N_ATOM))
ALLOCATE(NO2_ATOM(N_ATOM))
ALLOCATE(OH_ATOM(N_ATOM))
ALLOCATE(OH_GC(N_ATOM))
ALLOCATE(O3_GC(N_ATOM))
ALLOCATE(CO_GC(N_ATOM))
ALLOCATE(CH2O_GC(N_ATOM))
ALLOCATE(NO2_GC(N_ATOM))
! Initialize GC-O3 values to missing value
O3_GC = FILLER
OH_GC = FILLER
CO_GC = FILLER
CH2O_GC = FILLER
NO2_GC = FILLER
END SUBROUTINE INIT_ATOM
!=============================================================================
SUBROUTINE READ_ATOM_DATA
!! Read ATOM data from disk
INTEGER :: I
OPEN(UNIT=26,FILE="/users/jk/15/xzhang/ATom/atom1_1.csv")
DO I=1,N_ATOM
READ(26, *) YEAR_ATOM(I), MONTH_ATOM(I), DAY_ATOM(I), &
TIME_ATOM(I), LON_ATOM(I), LAT_ATOM(I), ALT_ATOM(I), OH_ATOM(I), &
O3_NOy(I), O3_UCATS(I), CO_GEOS(I), CO_UCATS(I), CH2O_ATOM(I),&
NO2_ATOM(I)
ENDDO
CLOSE(UNIT=26)
END SUBROUTINE READ_ATOM_DATA
!==============================================================================
SUBROUTINE WRITE_ATOM_DATA
!! Write ATOM data to disk
INTEGER :: I
OPEN(UNIT=27,FILE="atom_gc.csv")
DO I=1,N_ATOM
WRITE(27, *) YEAR_ATOM(I), MONTH_ATOM(I), DAY_ATOM(I), &
TIME_ATOM(I), LON_ATOM(I), LAT_ATOM(I), ALT_ATOM(I), OH_GC(I), &
O3_GC(I), CO_GC(I), CH2O_GC(I), NO2_GC(I)
ENDDO
CLOSE(UNIT=27)
END SUBROUTINE WRITE_ATOM_DATA
!===============================================================================
SUBROUTINE COMPARE_ATOM_DATA
USE GRID_MOD, ONLY : GET_IJ
USE GRID_MOD, ONLY : GET_XMID, GET_YMID
USE TIME_MOD, ONLY : GET_MINUTE, GET_HOUR, GET_DAY
USE TIME_MOD, ONLY : GET_YEAR, GET_MONTH
USE DAO_MOD, ONLY : BXHEIGHT
USE TROPOPAUSE_MOD, ONLY : ITS_IN_THE_TROP
USE COMODE_MOD, ONLY : JLOP
USE COMODE_MOD, ONLY : CSPEC
USE ADJ_ARRAYS_MOD, ONLY : ID2C
USE TRACERID_MOD, ONLY : IDNO2, IDOH, IDCH2O
USE TRACERID_MOD, ONLY : IDTOX, IDTCO
USE TRACER_MOD, ONLY : XNUMOLAIR, STT
USE CHECKPT_MOD, ONLY : CHK_STT
USE DAO_MOD, ONLY : AIRDEN
USE DAO_MOD, ONLY : AD
USE TRACER_MOD, ONLY : TCVV
USE COMODE_MOD, ONLY : CSPEC_AFTER_CHEM, CSPEC
USE ADJ_ARRAYS_MOD, ONLY : ID2C
USE DIAG_MOD, ONLY : AD43, LTNO2, CTNO2
#include "CMN_SIZE" ! size parameters
# include "CMN" ! IFLX, LPAUSE
!# include "CMN_DIAG" ! Diagnostic switches & arrays
!# include "CMN_O3" ! FMOL, XNUMOL
!# include "comode.h" ! IDEMS
INTEGER :: I,J,L,K,M,N,NN
INTEGER :: IIJJ(2), L_ATOM, JLOOP
REAL*8 :: YEAR, MONTH, DAY, HOUR, MINUTE, TIME
REAL*8 :: HEIGHT
REAL*8, PARAMETER :: ADJ_TCVVOX = 28.97d0/48.d0
MINUTE = REAL(GET_MINUTE(),8)
HOUR = REAL(GET_HOUR(),8)
DAY = REAL(GET_DAY(),8)
YEAR = REAL(GET_YEAR(),8)
MONTH = REAL(GET_MONTH(),8)
TIME = MINUTE + 100*HOUR
DO K=1,N_ATOM
!PRINT *, "MONTH_ATOM(K)", MONTH_ATOM(K)
IF( (DAY == DAY_ATOM(K)) .AND. &
(YEAR == YEAR_ATOM(K)) .AND. &
(MONTH == MONTH_ATOM(K)) .AND. &
((TIME_ATOM(K)-TIME) >= 0 ) .AND. &
(LON_ATOM(K) >= -180 ) .AND. &
(LAT_ATOM(K) >= -90 ) .AND. &
((TIME_ATOM(K)-TIME) < 30 ) ) THEN
!PRINT *, "LON", LON_ATOM(K)
!PRINT *, "LAT", LAT_ATOM(K)
IIJJ = GET_IJ(REAL(LON_ATOM(K),4),REAL(LAT_ATOM(K),4))
!PRINT *,"K_ATOM",K
!PRINT *,"TIME_ATOM(K) - TIME", TIME_ATOM(K) - TIME
!PRINT *,"ALT_ATOM(K)", ALT_ATOM(K)
I = IIJJ(1)
J = IIJJ(2)
HEIGHT = 0d0
!PRINT *, " SHAPE OF STT", SHAPE(CHK_STT(:,:,:,:))
!PRINT *, " SHAPE OF CSPEC", SHAPE(CSPEC_AFTER_CHEM(:,:))
!PRINT *, "IDTCO INDEX", IDTCO
!PRINT *, "IDTOX INDEX", IDTOX
!PRINT *, "IDCH2O INDEX", ID2C(IDCH2O)
!PRINT *, "IDOH INDEX", ID2C(IDOH)
DO L=1,LLPAR
!PRINT *,"ITS_IN_THE_TROP",ITS_IN_THE_TROP(I,J,L)
HEIGHT = HEIGHT + BXHEIGHT(I,J,L)
!PRINT *,"HEIGHT-ALT_ATOM(K)", HEIGHT - ALT_ATOM(K)
IF ( (HEIGHT .GE. ALT_ATOM(K)) ) THEN
IF ( ITS_IN_THE_TROP(I,J,L) ) THEN
JLOOP = JLOP(I,J,L)
!PRINT *, "JLOOP", JLOOP
!O3_ATOM_GC(K) = CSPEC(JLOOP,IDNO2)
! CO and O3 are in PPB, OH and CH2O are in PPT
!CO_GC(K) = STT(I,J,L,IDTCO)* TCVV(IDTCO)/ AD(I,J,L) * 1d9
!O3_GC(K) = STT(I,J,L,IDTOX)* TCVV(IDTOX)/ AD(I,J,L) * 1d9
!CH2O_GC(K) = CSPEC(JLOOP,IDCH2O) * 1d18 / (AIRDEN(L,I,J) * XNUMOLAIR)
!PRINT *, "CH2O_CSPEC", CH2O_GC(K)
!OH_GC(K) = CSPEC(JLOOP,IDOH) * 1d18 / (AIRDEN(L,I,J) * XNUMOLAIR)
!PRINT *, "OH_CSPEC", OH_GC(K)
CO_GC(K) = CHK_STT(I,J,L,IDTCO)* TCVV(IDTCO)/ AD(I,J,L) * 1d9
O3_GC(K) = CHK_STT(I,J,L,IDTOX)* TCVV(IDTOX)/ AD(I,J,L) * 1d9
CH2O_GC(K) = CSPEC_AFTER_CHEM(JLOOP,ID2C(IDCH2O)) * 1d9 / (AIRDEN(L,I,J) * XNUMOLAIR)
!PRINT *, "CH2O_CAFTER", CH2O_GC(K)
OH_GC(K) = CSPEC_AFTER_CHEM(JLOOP,ID2C(IDOH)) * 1d9 / (AIRDEN(L,I,J) * XNUMOLAIR)
NO2_GC(K) = CSPEC_AFTER_CHEM(JLOOP,ID2C(IDNO2)) * 1d9 / (AIRDEN(L,I,J) *XNUMOLAIR)
!PRINT *, "OH_CAFTER", OH_GC(K)
!PRINT *,"O3_ATOM_GC(K):",O3_ATOM_GC(K)
ENDIF
EXIT
ENDIF
ENDDO
ENDIF
ENDDO
END SUBROUTINE COMPARE_ATOM_DATA
END MODULE ATOM_OBS_MOD