Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
f99754d
refactoring ldas_setup
weiyuan-jiang Jun 8, 2025
4b8d1e6
Merge branch 'develop' into feature/wjiang/cleanup_ldas_setup
weiyuan-jiang Jun 24, 2025
0734663
Merge main into BRIDGE in prep of future release (#129)
gmao-rreichle Jun 26, 2025
bd1b9fe
more cleanup
weiyuan-jiang Jun 26, 2025
0419627
move printInput
weiyuan-jiang Jun 26, 2025
0ec7f50
move functions to setup_utils
weiyuan-jiang Jun 26, 2025
607ec45
Merge branch 'develop' into feature/wjiang/cleanup_ldas_setup
weiyuan-jiang Jun 26, 2025
975a344
change log
weiyuan-jiang Jun 26, 2025
55528a5
Merge BRIDGE into develop in prep of future release (#130)
gmao-rreichle Jun 27, 2025
bf6a4da
clean merge
weiyuan-jiang Jul 7, 2025
333ee11
more clenup
weiyuan-jiang Jul 8, 2025
f09b2aa
fix typo
weiyuan-jiang Jul 8, 2025
7f39167
use domain to check global
weiyuan-jiang Jul 9, 2025
cd55588
fix typo and RESTART=2
weiyuan-jiang Jul 9, 2025
1160ed1
fixed bcs
weiyuan-jiang Jul 9, 2025
3e69492
more fixes
weiyuan-jiang Jul 9, 2025
06eb31f
further split ldas_setup
weiyuan-jiang Jul 9, 2025
0a4545b
change mode
weiyuan-jiang Jul 10, 2025
4a690b8
change log
weiyuan-jiang Jul 10, 2025
dc5d877
Merge branch 'develop' into feature/wjiang/cleanup_ldas_setup
weiyuan-jiang Jul 10, 2025
1f95b28
minor edits of comments/help text (GEOSldas_LDAS.rc, ldas.py, setup_u…
gmao-rreichle Jul 10, 2025
d23fca9
added "from" statement for "timedelta" (setup_utils.py)
gmao-rreichle Jul 10, 2025
eef2ab8
echo all lines
weiyuan-jiang Jul 10, 2025
5fe4072
revised identification of agcm and ldas defaults from Surface GC rc f…
gmao-rreichle Jul 11, 2025
f1e382c
refactored ldas_setup (#107)
gmao-rreichle Jul 11, 2025
af16f2b
add get_GEOSs2s_v3() met forcing
gmao-qliu Aug 8, 2025
3d7d160
update get_GEOSs2s_v3
gmao-qliu Aug 8, 2025
59f0317
update get_s2s_v3()
gmao-qliu Aug 10, 2025
ff95e4e
use get_GEOS() for S2Sv3
gmao-qliu Aug 13, 2025
c7d65d3
Update CHANGELOG.md
gmao-rreichle Aug 15, 2025
811a21d
Try using file access properties
mathomp4 Aug 18, 2025
6e28d99
revised implementation of S2S3 forcing reader; added documentation (L…
gmao-rreichle Aug 20, 2025
a254227
fixed syntax error in previous commit, added documentation (LDAS_Forc…
gmao-rreichle Aug 20, 2025
fe7b771
another attempt at fixing syntax error from previous commit (LDAS_For…
gmao-rreichle Aug 20, 2025
3e7481d
add trim() for string comparison (LDAS_Forcing.F90)
gmao-rreichle Aug 20, 2025
98c2ea1
fix for special case of S2S3 FCST forcing at initialization time (LDA…
gmao-rreichle Aug 20, 2025
0396169
fixed syntax error in previous commit (LDAS_Forcing.F90)
gmao-rreichle Aug 20, 2025
a4538ce
add missing use statement (LDAS_Forcing.F90)
gmao-rreichle Aug 21, 2025
30d175f
fix syntax error
gmao-qliu Aug 21, 2025
2872363
fixing error that resets single_time_in_file
gmao-qliu Aug 21, 2025
50c426d
Update changelog
mathomp4 Aug 25, 2025
094e489
Update io_hdf5.F90 for HDF5 1.14 (#139)
gmao-rreichle Aug 25, 2025
f4a4bea
accommodate "ens10", "ens11", ... for met forcing from S2S3 FCST (LDA…
gmao-rreichle Aug 25, 2025
06a0a75
Merge branch 'develop' into feature/qliu/metforce_S2Sv3
gmao-rreichle Aug 25, 2025
2894843
fixed syntax errors in previous commit (LDAS_Forcing.F90)
gmao-rreichle Aug 25, 2025
3222d8c
Add reader for surface meteorological forcing from S2S-3 (#138)
gmao-rreichle Aug 26, 2025
6a3b8db
added matlab reader for mwRTM vegopacity file (read_vegopacity.m)
gmao-rreichle Sep 29, 2025
73de1b2
updated CHANGELOG.md
gmao-rreichle Sep 29, 2025
754e2eb
added matlab reader for mwRTM vegetation opacity binary file #142
gmao-rreichle Sep 30, 2025
26dda41
test history
weiyuan-jiang Oct 3, 2025
a968af0
relax restart=2 for landice
weiyuan-jiang Nov 6, 2025
46517bf
fix landice restart
weiyuan-jiang Nov 7, 2025
2554b85
fix bug in ASCAT_EUMET soil moisture obs reader
gmao-rreichle Nov 14, 2025
4f0396a
updated CHANGELOG.md
gmao-rreichle Nov 14, 2025
4bce232
fix bug in ASCAT_EUMET soil moisture obs reader #148
gmao-rreichle Nov 16, 2025
d5e454e
Merge branch 'develop' into feature/wjiang/restart_landice
biljanaorescanin Nov 17, 2025
65b926b
support restart only for landice
weiyuan-jiang Nov 18, 2025
6932cf1
Merge branch 'develop' into feature/wjiang/Tile_nc4
gmao-rreichle Nov 20, 2025
d21eab1
in HISTORY templates, change binary diagnostic output to nc4 (except …
gmao-rreichle Nov 21, 2025
b227940
in HISTORY templates, change binary diagnostic output to nc4 for incr…
gmao-rreichle Nov 21, 2025
bcfba7e
edited CHANGELOG.md
gmao-rreichle Nov 21, 2025
1cc676d
remove tile_bin2nc4.F90
gmao-rreichle Nov 21, 2025
b29481e
Change default format of tile-space HISTORY output to nc4 (#144)
gmao-rreichle Nov 25, 2025
2c8ee62
Merge branch 'develop' into feature/wjiang/restart_landice
gmao-rreichle Nov 25, 2025
b42bb3e
Enable remapping of landice restarts from ldas_setup (#146)
gmao-rreichle Nov 25, 2025
422d39b
Handle CYGNSS mask allocations when disabled
amfox37 Nov 25, 2025
ecc2398
Increase ASCAT max_obs limit
amfox37 Nov 25, 2025
7c5e7cc
updated CHANGELOG.md in prep for release v3.2.0
gmao-rreichle Nov 25, 2025
2663052
Document CYGNSS mask change
amfox37 Nov 25, 2025
547c512
Comment out static QC mask in CYGNSS reader; bump ASCAT max obs limit…
gmao-rreichle Nov 25, 2025
367d5e0
Merge branch 'develop' into feature/rreichle/update_CHANGELOG_for_v3.2.0
gmao-rreichle Nov 25, 2025
0f68bed
additional updates of CHANGELOG.md
gmao-rreichle Nov 25, 2025
01e9b49
updated CHANGELOG.md in prep for release v3.2.0 (#152)
gmao-rreichle Nov 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 27 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

-----------------------------

## [v3.2.0] - 2025-11-26

- 0-diff vs. v3.1.0 (except for lat/lon fields in "1d" nc4 output, which have roundoff differences between files directly generated with MAPL [new default] and files generated with tile_bin2nc4 [discontinued]).

### Added

- Added reader for surface meteorological forcing from S2S-3 ([PR #138](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/138)).
- Added matlab reader for binary mwRTM vegopacity file ([PR #142](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/142)).

### Changed

- Changed default format of tile-space HISTORY output to nc4 ([PR #144](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/144)).
- Enable remapping of landice restarts from ldas_setup ([PR #146](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/146)).
- Commented out static QC mask in CYGNSS obs reader ([PR #151](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/151)).
- Cleaned up ldas_setup; split out ldas.py and setup_utils.py; restored ntasks-per-node option ([PR #107](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/107)).
- Update `GEOSlandassim_GridComp/io_hdf5.F90` to allow for use with HDF5 1.14 ([PR #139](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/139)).

### Fixed

- Fixed bug in ASCAT EUMET soil moisture obs reader; bumped max_obs limit ([PR #148](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/148), [PR #151](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/151)).
- Provide default "zoom" value for remap_restarts yaml file ([PR #137](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/137)).
- Fixed Restart=1 when the domain is not global ([PR #107](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/107)).

-----------------------------

## [v3.1.0] - 2025-06-26

- 0-diff vs. v3.0.0.

### Added

- Added python package for post-processing ObsFcstAna output into data assimilation diagnostics ([PR #87](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/87), [PR #111](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/111)).
- Support for 2d output from EASE tile space and 2d output on EASE grid:
- Added python package for post-processing ObsFcstAna output into data assimilation diagnostics ([PR #87](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/87), [PR #111](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/111)).
- Support for 2d output from EASE tile space and 2d output on EASE grid:
- Switched EASE grid handling to new MAPL EASE Grid Factory ([PR #115](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/115)).
- Revised pre-processing of HISTORY template ([PR #118](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/118)).
- Support for tile space of stretched cube-sphere grids ([PR #109](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/109)).
Expand Down Expand Up @@ -140,4 +165,3 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

-----------------------------


172 changes: 90 additions & 82 deletions GEOSlandassim_GridComp/clsm_ensupd_read_obs.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1643,7 +1643,7 @@ subroutine read_obs_sm_ASCAT_EUMET( &

integer, parameter :: lnbufr = 50 ! BUFR file unit number
integer, parameter :: max_rec = 50000 ! max number of obs after QC (expecting < 6 hr assim window)
integer, parameter :: max_obs = 250000 ! max number of obs read by subroutine (expecting < 6 hr assim window)
integer, parameter :: max_obs = 280000 ! max number of obs read by subroutine (expecting < 6 hr assim window)

integer :: idate, iret, ireadmg, ireadsb

Expand Down Expand Up @@ -1951,8 +1951,8 @@ subroutine read_obs_sm_ASCAT_EUMET( &
date_time_tmp%sec = int(tmp_data(kk, 6))

! skip if record outside of current assim window
if ( datetime_lt_refdatetime( date_time_tmp, date_time_low ) .and. &
datetime_le_refdatetime( date_time_up, date_time_tmp ) ) cycle
if ( datetime_lt_refdatetime( date_time_tmp, date_time_low ) .or. & ! obs is before start of assim window *or*
datetime_le_refdatetime( date_time_up, date_time_tmp ) ) cycle ! obs is after end of assim window

! skip if record contains invalid soil moisture value
if ( tmp_data(kk, 7) > 100. .or. tmp_data(kk, 7) < 0. ) cycle
Expand Down Expand Up @@ -2427,78 +2427,87 @@ subroutine read_obs_sm_CYGNSS( &
! close the obs file
ierr = nf90_close(ncid)

! get name for CYGNSS mask file

tmpmaskname = trim(this_obs_param%maskpath) // '/' // trim(this_obs_param%maskname) // '.nc'

inquire(file=tmpfname, exist=file_exists)

if (.not. file_exists) then
err_msg = 'CYGNSS mask file not found!'
call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg)
end if

! open the CYGNSS mask file

ierr = nf90_open(trim(tmpmaskname), nf90_nowrite, ncid)

! get variable dimension IDs
ierr = nf90_inq_dimid(ncid, 'lon', lon_dimid)
ierr = nf90_inq_dimid(ncid, 'lat', lat_dimid)

! dimensions sizes
ierr = nf90_inquire_dimension(ncid, lon_dimid, len=N_lon_m)
ierr = nf90_inquire_dimension(ncid, lat_dimid, len=N_lat_m)

! get variable IDs
ierr = nf90_inq_varid(ncid, 'longitude', longitudes_m_varid)
ierr = nf90_inq_varid(ncid, 'latitude', latitudes_m_varid)
ierr = nf90_inq_varid(ncid, 'flag_small_SM_range', small_SM_range_varid)
ierr = nf90_inq_varid(ncid, 'flag_poor_SMAP', poor_SMAP_varid)
ierr = nf90_inq_varid(ncid, 'flag_high_ubrmsd', high_ubrmsd_varid)
ierr = nf90_inq_varid(ncid, 'flag_few_obs', few_obs_varid)
ierr = nf90_inq_varid(ncid, 'flag_low_signal', low_signal_varid)

! allocate memory for the variables
allocate(latitudes_m( N_lon_m, N_lat_m))
allocate(longitudes_m( N_lon_m, N_lat_m))
allocate(small_SM_range_flag(N_lon_m, N_lat_m))
allocate(poor_SMAP_flag( N_lon_m, N_lat_m))
allocate(high_ubrmsd_flag( N_lon_m, N_lat_m))
allocate(few_obs_flag( N_lon_m, N_lat_m))
allocate(low_signal_flag( N_lon_m, N_lat_m))

! read the variables
ierr = nf90_get_var(ncid, latitudes_m_varid, latitudes_m)
ierr = nf90_get_var(ncid, longitudes_m_varid, longitudes_m)
ierr = nf90_get_var(ncid, small_SM_range_varid, small_SM_range_flag)
ierr = nf90_get_var(ncid, poor_SMAP_varid, poor_SMAP_flag)
ierr = nf90_get_var(ncid, high_ubrmsd_varid, high_ubrmsd_flag)
ierr = nf90_get_var(ncid, few_obs_varid, few_obs_flag)
ierr = nf90_get_var(ncid, low_signal_varid, low_signal_flag)

! close the mask file
ierr = nf90_close(ncid)

! check the obs data and mask data are the same resolution
if (N_lon /= N_lon_m .or. N_lat /= N_lat_m) then
err_msg = 'The mask file ' // trim(this_obs_param%maskname) // ' does not match the obs resolution'
call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg)
end if

good_flag_value = 255 ! should really be 0 but is 255 because of unsigned v. signed byte issues
! ----------------------------------------------------------------
! AMF, November 2025
! Original CYGNSS mask reading section commented out - masks not currently used
! Mask originally developed for version 1.0 of CYGNSS soil moisture product and
! not believed to be appropriate for version 3.2 product being used here.
! ----------------------------------------------------------------

! ! get name for CYGNSS mask file

! tmpmaskname = trim(this_obs_param%maskpath) // '/' // trim(this_obs_param%maskname) // '.nc'

! inquire(file=tmpfname, exist=file_exists)

! if (.not. file_exists) then
! err_msg = 'CYGNSS mask file not found!'
! call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg)
! end if

! ! open the CYGNSS mask file

! ierr = nf90_open(trim(tmpmaskname), nf90_nowrite, ncid)

! ! get variable dimension IDs
! ierr = nf90_inq_dimid(ncid, 'lon', lon_dimid)
! ierr = nf90_inq_dimid(ncid, 'lat', lat_dimid)

! ! dimensions sizes
! ierr = nf90_inquire_dimension(ncid, lon_dimid, len=N_lon_m)
! ierr = nf90_inquire_dimension(ncid, lat_dimid, len=N_lat_m)

! ! get variable IDs
! ierr = nf90_inq_varid(ncid, 'longitude', longitudes_m_varid)
! ierr = nf90_inq_varid(ncid, 'latitude', latitudes_m_varid)
! ierr = nf90_inq_varid(ncid, 'flag_small_SM_range', small_SM_range_varid)
! ierr = nf90_inq_varid(ncid, 'flag_poor_SMAP', poor_SMAP_varid)
! ierr = nf90_inq_varid(ncid, 'flag_high_ubrmsd', high_ubrmsd_varid)
! ierr = nf90_inq_varid(ncid, 'flag_few_obs', few_obs_varid)
! ierr = nf90_inq_varid(ncid, 'flag_low_signal', low_signal_varid)

! ! allocate memory for the variables
! allocate(latitudes_m( N_lon_m, N_lat_m))
! allocate(longitudes_m( N_lon_m, N_lat_m))
! allocate(small_SM_range_flag(N_lon_m, N_lat_m))
! allocate(poor_SMAP_flag( N_lon_m, N_lat_m))
! allocate(high_ubrmsd_flag( N_lon_m, N_lat_m))
! allocate(few_obs_flag( N_lon_m, N_lat_m))
! allocate(low_signal_flag( N_lon_m, N_lat_m))

! ! read the variables
! ierr = nf90_get_var(ncid, latitudes_m_varid, latitudes_m)
! ierr = nf90_get_var(ncid, longitudes_m_varid, longitudes_m)
! ierr = nf90_get_var(ncid, small_SM_range_varid, small_SM_range_flag)
! ierr = nf90_get_var(ncid, poor_SMAP_varid, poor_SMAP_flag)
! ierr = nf90_get_var(ncid, high_ubrmsd_varid, high_ubrmsd_flag)
! ierr = nf90_get_var(ncid, few_obs_varid, few_obs_flag)
! ierr = nf90_get_var(ncid, low_signal_varid, low_signal_flag)

! ! close the mask file
! ierr = nf90_close(ncid)

! ! check the obs data and mask data are the same resolution
! if (N_lon /= N_lon_m .or. N_lat /= N_lat_m) then
! err_msg = 'The mask file ' // trim(this_obs_param%maskname) // ' does not match the obs resolution'
! call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg)
! end if

! good_flag_value = 255 ! should really be 0 but is 255 because of unsigned v. signed byte issues

! fill tmp arrays
N_obs = 0

do i = 1, N_lon
do j = 1, N_lat
if (tmp_sm(i,j) .ne. this_obs_param%nodata .and. &
small_SM_range_flag(i,j) == good_flag_value .and. &
poor_SMAP_flag(i,j) == good_flag_value .and. &
high_ubrmsd_flag(i,j) == good_flag_value .and. &
few_obs_flag(i,j) == good_flag_value .and. &
low_signal_flag(i,j) == good_flag_value ) then
! if (tmp_sm(i,j) .ne. this_obs_param%nodata .and. &
! small_SM_range_flag(i,j) == good_flag_value .and. &
! poor_SMAP_flag(i,j) == good_flag_value .and. &
! high_ubrmsd_flag(i,j) == good_flag_value .and. &
! few_obs_flag(i,j) == good_flag_value .and. &
! low_signal_flag(i,j) == good_flag_value ) then

if (tmp_sm(i,j) .ne. this_obs_param%nodata) then

! valid observation
N_obs = N_obs + 1
Expand Down Expand Up @@ -2631,18 +2640,18 @@ subroutine read_obs_sm_CYGNSS( &

! clean up

deallocate(timeintervals)
deallocate(latitudes)
deallocate(longitudes)
deallocate(tmp_sm)
deallocate(tmp_sigma)
deallocate(latitudes_m)
deallocate(longitudes_m)
deallocate(small_SM_range_flag)
deallocate(poor_SMAP_flag)
deallocate(high_ubrmsd_flag)
deallocate(few_obs_flag)
deallocate(low_signal_flag)
if (allocated(timeintervals)) deallocate(timeintervals)
if (allocated(latitudes)) deallocate(latitudes)
if (allocated(longitudes)) deallocate(longitudes)
if (allocated(tmp_sm)) deallocate(tmp_sm)
if (allocated(tmp_sigma)) deallocate(tmp_sigma)
if (allocated(latitudes_m)) deallocate(latitudes_m)
if (allocated(longitudes_m)) deallocate(longitudes_m)
if (allocated(small_SM_range_flag)) deallocate(small_SM_range_flag)
if (allocated(poor_SMAP_flag)) deallocate(poor_SMAP_flag)
if (allocated(high_ubrmsd_flag)) deallocate(high_ubrmsd_flag)
if (allocated(few_obs_flag)) deallocate(few_obs_flag)
if (allocated(low_signal_flag)) deallocate(low_signal_flag)

if (associated(tmp_obs)) deallocate(tmp_obs)
if (associated(tmp_lon)) deallocate(tmp_lon)
Expand Down Expand Up @@ -11069,4 +11078,3 @@ end program test
#endif

! ******* EOF *************************************************************

Loading