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(:) 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(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) END SUBROUTINE CLEANUP_ATOM !============================================================================ SUBROUTINE INIT_ATOM !! Initialize ATOM arrays !ATOM from 2016-08-01 to 2016-08-12 is ATOM1-1 N_ATOM = 9623 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(OH_ATOM(N_ATOM)) ALLOCATE(OH_GC(N_ATOM)) ALLOCATE(O3_GC(N_ATOM)) ALLOCATE(CO_GC(N_ATOM)) ALLOCATE(CH2O_GC(N_ATOM)) ! Initialize GC-O3 values to missing value O3_GC = FILLER OH_GC = FILLER CO_GC = FILLER CH2O_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) 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) 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 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) !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