Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add the capability to read the GEOSIT forcing #688

Merged
merged 9 commits into from
Dec 7, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -3090,6 +3090,7 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, &
! (for MERRA-2, always point to publicly available files)
! - updated comments
!
! qliu+reichle, 5 Dec 2023 - added GEOS-IT
!
! -----------------------------------
!
Expand Down Expand Up @@ -3170,6 +3171,7 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, &
real, parameter :: nodata_GEOSgcm = 1.e15

character(40), dimension(N_G5DAS_vars, N_defs_cols) :: G5DAS_defs
character(40), dimension(N_G5DAS_vars, N_defs_cols) :: GEOSIT_defs
character(40), dimension(N_MERRA_vars, N_defs_cols) :: MERRA_defs
character(40), dimension(N_MERRA2plusAerosol_vars, N_defs_cols) :: M2INT_defs
character(40), dimension(N_MERRA2plusAerosol_vars, N_defs_cols) :: M2COR_defs
Expand Down Expand Up @@ -3243,6 +3245,27 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, &
G5DAS_defs(11,:)=[character(len=40):: 'QLML ','inst','inst1_2d_lfo_Nx','diag','S']
G5DAS_defs(12,:)=[character(len=40):: 'SPEEDLML','inst','inst1_2d_lfo_Nx','diag','S']

! -----------------------------------------------------------------------
!
! define GEOS-IT file specs
!
! same as G5DAS except for file tag (column 3)

GEOSIT_defs = G5DAS_defs

GEOSIT_defs( 1,3)=[character(len=40):: 'lfo_tavg_1hr_glo_L576x361_slv']
GEOSIT_defs( 2,3)=[character(len=40):: 'lfo_tavg_1hr_glo_L576x361_slv']
GEOSIT_defs( 3,3)=[character(len=40):: 'lfo_tavg_1hr_glo_L576x361_slv']
GEOSIT_defs( 4,3)=[character(len=40):: 'lfo_tavg_1hr_glo_L576x361_slv']
GEOSIT_defs( 5,3)=[character(len=40):: 'lfo_tavg_1hr_glo_L576x361_slv']
GEOSIT_defs( 6,3)=[character(len=40):: 'lfo_tavg_1hr_glo_L576x361_slv']
GEOSIT_defs( 7,3)=[character(len=40):: 'lfo_tavg_1hr_glo_L576x361_slv']
GEOSIT_defs( 8,3)=[character(len=40):: 'lfo_inst_1hr_glo_L576x361_slv']
GEOSIT_defs( 9,3)=[character(len=40):: 'lfo_inst_1hr_glo_L576x361_slv']
GEOSIT_defs(10,3)=[character(len=40):: 'lfo_inst_1hr_glo_L576x361_slv']
GEOSIT_defs(11,3)=[character(len=40):: 'lfo_inst_1hr_glo_L576x361_slv']
GEOSIT_defs(12,3)=[character(len=40):: 'lfo_inst_1hr_glo_L576x361_slv']


! MERRA-2 file specs with uncorrected (AGCM) precip from the "int" Collection
! (ie, the precip generated by the AGCM within the MERRA-2 system)
Expand Down Expand Up @@ -3576,8 +3599,12 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, &

allocate(GEOSgcm_defs(N_GEOSgcm_vars,N_defs_cols))

GEOSgcm_defs(1:N_G5DAS_vars, :) = G5DAS_defs

if ( (index(met_tag, 'GEOSIT') > 0) .or. (index(met_tag, 'geosit') > 0) ) then
GEOSgcm_defs(1:N_G5DAS_vars,:) = GEOSIT_defs
else
GEOSgcm_defs(1:N_G5DAS_vars,:) = G5DAS_defs
end if

call parse_G5DAS_met_tag( met_path, met_tag, date_time_inst, &
met_path_inst, prec_path_inst, met_tag_inst, use_prec_corr, &
use_Predictor )
Expand Down Expand Up @@ -4607,8 +4634,8 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, &
! where {__prec[PREC]} and {__Nx+-} are optional and where
!
! G5DAS-NAME : name of standard G5DAS forcing (must not contain "__"!)
! e.g., "e5110_fp", "d591_rpit1", "d591_fpit", ...
! for cross-stream forcing, use "cross_d5124_RPFPIT" or "cross_FP"
! e.g., "e5110_fp", "d591_rpit1", "d591_fpit", "d5294_geosit", ...
! for cross-stream forcing, use "cross_d5294_GEOSIT", "cross_d5124_RPFPIT", "cross_FP"
! PREC : identifier for precip corrections to G5DAS forcing (eg., 'GPCPv1.1')
!
! If {__Nx+-} is present, set flag for use forcing files from the DAS/GCM Predictor
Expand All @@ -4626,6 +4653,7 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, &
! reichle, 10 Oct 2019: added FP transition from f521 to f522
! reichle, 17 Jan 2020: added FP transition from f522 to f525
! reichle, 3 Apr 2020: added FP transition from f525 to f525_p5
! qliu+reichle, 5 Dec 2023: added GEOS-IT
!
! ---------------------------------------------------------------------------

Expand Down Expand Up @@ -4658,6 +4686,10 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, &
type(date_time_type) :: dt_end_d5124_rpit2
type(date_time_type) :: dt_end_d5124_rpit3

type(date_time_type) :: dt_end_d5294_geosit1
type(date_time_type) :: dt_end_d5294_geosit2
type(date_time_type) :: dt_end_d5294_geosit3

type(date_time_type) :: dt_end_e5110_fp
type(date_time_type) :: dt_end_e5130_fp
type(date_time_type) :: dt_end_e5131_fp
Expand All @@ -4673,7 +4705,7 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, &

! ----------------------------------------------------------
!
! define transition times between RP-IT, FP-IT or FP streams
! define transition times between RP-IT, FP-IT, GEOS-IT, or FP streams
! if "cross-stream" forcing is requested
!
! | stream start | stream end (as of 5 Dec 2014)
Expand Down Expand Up @@ -4738,6 +4770,35 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, &
dt_end_d5124_rpit3%min = 0
dt_end_d5124_rpit3%sec = 0

! | stream start | stream end
! | (excl 1-yr |
! | spinup) |
! ----------------------------------------
! d5294_geosit1 | 1 Jan 1998 | 1 Jan 2008
! d5294_geosit2 | 1 Jan 2008 | 1 Jan 2018
! d5294_geosit3 | 1 Jan 2018 | (present)

dt_end_d5294_geosit1%year = 2008
dt_end_d5294_geosit1%month = 1
dt_end_d5294_geosit1%day = 1
dt_end_d5294_geosit1%hour = 0
dt_end_d5294_geosit1%min = 0
dt_end_d5294_geosit1%sec = 0

dt_end_d5294_geosit2%year = 2018
dt_end_d5294_geosit2%month = 1
dt_end_d5294_geosit2%day = 1
dt_end_d5294_geosit2%hour = 0
dt_end_d5294_geosit2%min = 0
dt_end_d5294_geosit2%sec = 0

dt_end_d5294_geosit3%year = 9999
dt_end_d5294_geosit3%month = 1
dt_end_d5294_geosit3%day = 1
dt_end_d5294_geosit3%hour = 0
dt_end_d5294_geosit3%min = 0
dt_end_d5294_geosit3%sec = 0

! ---------------------------------
!
! FP streams
Expand Down Expand Up @@ -4957,6 +5018,23 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, &

end if

elseif (met_tag_out(1:18)=='cross_d5924_GEOSIT') then
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gmao-qliu : for consistency with RPIT/FPIT, I think we need to keep the GEOS version in the "cross" stream definition. As was the case with RPIT/FPIT, a future version of GEOS-IT might be produced with a newer GEOS system but still under the "GEOS-IT" name. This change requires you do edit the MET_TAG in your LDAS.rc file.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just fixed the typo in line 5021, should be "d5294". All works after the fix. @gmao-rreichle


if (datetime_lt_refdatetime( date_time, dt_end_d5294_geosit1 )) then

stream = 'd5294_geosit_jan98' ! use d5294 GEOS-IT stream 1

elseif (datetime_lt_refdatetime( date_time, dt_end_d5294_geosit2 )) then

stream = 'd5294_geosit_jan08' ! use d5294 GEOS-IT stream 2

else

stream = 'd5294_geosit_jan18' ! use d5294 GEOS-IT stream 3

end if


elseif (met_tag_out(1:8)=='cross_FP') then

if (datetime_lt_refdatetime( date_time, dt_end_e5110_fp )) then
Expand Down Expand Up @@ -5103,7 +5181,7 @@ subroutine get_GEOS_forcing_filename(fname_full,file_exists, date_time, daily_fi
! local variables

character(300) :: fname, fname_full_tmp1, fname_full_tmp2
character( 14) :: time_stamp
character( 16) :: time_stamp
character( 4) :: YYYY, HHMM, day_dir
character( 2) :: MM, DD

Expand All @@ -5129,11 +5207,15 @@ subroutine get_GEOS_forcing_filename(fname_full,file_exists, date_time, daily_fi

if (daily_file) then

time_stamp(1:8) = YYYY // MM // DD
time_stamp(1:8) = YYYY // MM // DD

else
elseif (index(met_tag,'GEOSIT') > 0 .or. index(met_tag,'geosit') > 0) then

time_stamp = YYYY // MM // DD // '_' // trim(HHMM) // 'z'
time_stamp(1:16) = YYYY //'-'// MM //'-'// DD // 'T' // trim(HHMM) // 'Z'

else

time_stamp(1:14) = YYYY // MM // DD // '_' // trim(HHMM) // 'z'

end if

Expand Down