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

Adding I/O for Analysis of Significant Wave Height for 3DRTMA #601

Closed
GangZhao-NOAA opened this issue Jul 27, 2023 · 4 comments · Fixed by #614
Closed

Adding I/O for Analysis of Significant Wave Height for 3DRTMA #601

GangZhao-NOAA opened this issue Jul 27, 2023 · 4 comments · Fixed by #614
Assignees

Comments

@GangZhao-NOAA
Copy link
Contributor

Significant Wave Height (hereafter as SWH) is one of the standard products provided by the operational (2D)RTMA. To continuously provide the same products in 3DRTMA, the next-generation RTMA, some efforts in GSI code need to be made in order to analyze the SWH in 3DVar of GSI.

The kernel subroutines to assimilate SWH in GSI (such as stphowv.f90, setuphowv.f90, inthowv.f90, gsi_howvOper.f90 and m_howvNode.f90) already had been added for (2D)RTMA years ago by Manuel Pondeca, so for this issue, the code work mainly focus on adding the I/O of SWH in background and analysis fields for 3DRTMA (esp. RRFS-based 3DRTMA), and some necessary modifications in background error, options, variables related to analysis of SWH, etc.

Note:
For RRFS-based 3DRTMA, the SWH data are interpolated to Extended Schmidt Gnomonic (ESG) grid for GSI analysis as same as other FV3-LAM model variables; for HRRR-based 3DRTMA, the SWH data are defined on Lambert Conformal grid as same as other HRRR model variables.

@GangZhao-NOAA
Copy link
Contributor Author

This issue #601 is linked to working branch "feature/3drtma_howv" in my personal fork of NOAA-EMC/GSI repo.

@GangZhao-NOAA
Copy link
Contributor Author

GangZhao-NOAA commented Aug 24, 2023

  • Finished the code work (in my personal fork of EMC/GSI repository). The modified GSI code is in the branch "feature/3drtma_howv".

  • The modified GSI code passed the regression tests (all 9 tasks) on Hera and WCOSS2 (Cactus).

    • Brief results from ctest (regression test) with the modified code (on WCOSS2 - Cactus):

[gang.zhao@clogin07:build] (feature/3drtma_howv)$ ctest -N
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
Test #1: global_3dvar
Test #2: global_4dvar
Test #3: global_4denvar
Test #4: hwrf_nmm_d2
Test #5: hwrf_nmm_d3
Test #6: rtma
Test #7: rrfs_3denvar_glbens
Test #8: netcdf_fv3_regional
Test #9: global_enkf

Total Tests: 9
Test #1: global_3dvar
[gang.zhao@clogin04:build] (feature/3drtma_howv)$ ctest -R global_3dvar
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
Start 1: global_3dvar
1/1 Test #1: global_3dvar ..................... Passed 1631.12 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 1631.14 sec

Test #2: global_4dvar
[gang.zhao@clogin09:build] (feature/3drtma_howv)$ ctest -R global_4dvar
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
Start 2: global_4dvar
1/1 Test #2: global_4dvar ..................... Passed 2462.19 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 2462.23 sec

Test #3: global_4denvar
[gang.zhao@clogin04:build] (feature/3drtma_howv)$ ctest -R global_4denvar
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
Start 3: global_4denvar
1/1 Test #3: global_4denvar ................... Passed 1922.43 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 1922.46 sec

Test #4: hwrf_nmm_d2
[gang.zhao@clogin09:build] (feature/3drtma_howv)$ ctest -R hwrf_nmm_d2
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
Start 4: hwrf_nmm_d2
1/1 Test #4: hwrf_nmm_d2 ...................... Passed 1214.10 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 1214.20 sec

Test #5: hwrf_nmm_d3
[gang.zhao@clogin09:build] (feature/3drtma_howv)$ ctest -R hwrf_nmm_d3
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
Start 5: hwrf_nmm_d3
1/1 Test #5: hwrf_nmm_d3 ...................... Passed 736.38 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 736.50 sec

Test #6: rtma
[gang.zhao@clogin05:build] (feature/3drtma_howv)$ ctest -R rtma
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
Start 6: rtma
1/1 Test #6: rtma ............................. Passed 1027.01 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 1027.01 sec

Test #7: rrfs_3denvar_glbens
[gang.zhao@clogin06:build] (feature/3drtma_howv)$ ctest -R rrfs_3denvar_glbens
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
Start 7: rrfs_3denvar_glbens
1/1 Test #7: rrfs_3denvar_glbens .............. Passed 484.69 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 484.70 sec

Test #8: netcdf_fv3_regional
[gang.zhao@clogin03:build] (feature/3drtma_howv)$ ctest -R netcdf_fv3_regional
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
Start 8: netcdf_fv3_regional
1/1 Test #8: netcdf_fv3_regional .............. Passed 483.08 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 483.11 sec

Test #9: global_enkf
[gang.zhao@clogin03:build] (feature/3drtma_howv)$ ctest -R global_enkf
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
Start 9: global_enkf
1/1 Test #9: global_enkf ...................... Passed 488.50 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 488.57 sec

  • Modified code in GSI:

    1. rapidrefresh_cldsurf_mod.f90: adding a few variables related to the analysis of howv in 3D analysis
    2. gsimod.F90: adding namelist options used for analysis of howv in 3D analysis
    3. m_berror_stats_reg.f90: added some code for the special treatment to the static background error (BE) of howv
    4. read_prepbufr.f90: adding code to decode the observation of howv in prepbufr file when howv is available in firstguess
    5. setuphowv.f90: adding code to use obs of howv when howv is available in firstguess
    6. gsi_rfv3io_mod.f90: adding I/O code to read in howv from firstguess and write out howv into analysis.
  • adding the analysis of howv only has very trial influences on the analyses of other variables. Here is the statistics of the differences of other variables (u/v/t/ps/q/t2m/q2m) from the runs of GSI without howv vs. with howv:
    comparing two netcdf files: fcst_fv3lam_hyb_betas/INPUT/fv_core.res.tile1.nc fcst_fv3lam_nodata_noinfo/INPUT/fv_core.res.tile1.nc ...
    Variable Group Count Sum AbsSum Min Max Range Mean StdDev
    u / 602135550 3926.84 25760.8 -0.1026 0.485788 0.588388 6.52152e-06 0.00115817
    v / 620166777 -4891.34 32582.5 -0.835774 0.268402 1.10418 -7.88714e-06 0.00197793
    T / 155987083 178.048 6497.51 -0.0246582 0.0384064 0.0630646 1.14143e-06 0.000218737
    delp / 19559676 -281.532 3008.29 -0.00292969 0.00219727 0.00512695 -1.43935e-05 0.000183727

comparing two netcdf files: fcst_fv3lam_hyb_betas/INPUT/fv_tracer.res.tile1.nc fcst_fv3lam_nodata_noinfo/INPUT/fv_tracer.res.tile1.nc ...
Variable Group Count Sum AbsSum Min Max Range Mean StdDev
sphum / 430707614 0.594287 2.77816 -2.6139e-05 3.1759e-05 5.7898e-05 1.37979e-09 8.03072e-08

comparing two netcdf files: fcst_fv3lam_hyb_betas/INPUT/sfc_data.nc fcst_fv3lam_nodata_noinfo/INPUT/sfc_data.nc ...
Variable Group Count Sum AbsSum Min Max Range Mean StdDev
t2m / 10665000 43.3899 135.095 -0.00152825 0.00686629 0.00839454 4.06844e-06 5.02866e-05
q2m / 10665000 0.0192553 0.124707 -3.1476e-06 1.77554e-05 2.0903e-05 1.80547e-09 5.89657e-08

It could be seen that the differences are trivial and ignorable.

  • Brief summary on the results from a testing case: 2023-07-12_14:00:00 UTC for North-American domain
    1. Here is the analysis increment of Significant Wave Height (aka howv hereafter): pure 3dvar, static background error of howv is 0.42 meters, and the de-correlation length scale is 170km.
      HOWV_var_inc_maprll_datll_reg_ncf
    2. The following figure shows the distribution of howv in the analysis (used obs is in green, rejected in red). Obviously the location of used obs of howv match the area of non-zero analysis increments of howv.
      var_obs_2023071214_howv_maprll_datll_reg_ncf
    3. The following figure is the analysis increment of howv with hybrid envar analysis (using gdas ensemble 80 members and the ensemble weight is 84%), and the static BE of howv is tuned/inflated. The analysis increments are very similar to the results from pure 3dvar run (see the first figure)
      HOWV_hyb_betas016_inc_maprll_datll_reg_ncf
    4. The last figure shows the analysis increments of howv with hybrid envar analysis (using gdas ensemble 80 members and the ensemble weight is 84%), but the static BE of howv is NOT tuned. It can be observed that the analysis increments is less than the results from the hybrid run with tuning the static BE of howv. That is because the weight of static BE (16%) reduced the background error of howv (ensemble of howv is not available yet), so the impact of obs is decreased.
      HOWV_hyb_betas016_noTune_inc_maprll_datll_reg_ncf

The code is ready for merging to develop branch of EMC/GSI repository. A pull-request (PR #614) was just created.

@TingLei-NOAA
Copy link
Contributor

@GangZhao-NOAA An important issue approached under this issue title is how the hybrid analysis (including pure ens3dvar )is done for howv when howv ensembles are not available. Could you describe the method and considerations here?

@GangZhao-NOAA
Copy link
Contributor Author

@TingLei-NOAA
As I replied to your another comment (see #614 (comment)),
even no ensemble of howv, GSI still can run the hybrid analysis. For the B of howv, since there is no contribution from ensemble of howv, so the B of howv is the static B of howv multiplied by the weight of static BE. So in hybrid analysis, the analysis of HOWV is actually the pure variational analysis, with a reduced BE of howv (reduced by the weight).
If to make the analysis of HOWV in hybrid is similar to the analysis of howv in pure 3dvar, we could tune (actually increase) the static BE of howv according the weight of static BE used in hybrid analysis.
Thanks,

ShunLiu-NOAA pushed a commit that referenced this issue Sep 29, 2023
… (see issue #601) (#614)

Adding code to analyze the siginificant wave heigh in GSI 3D Analysis,
esp. for FV3-LAM model based DA, eg. RRFS-DA, RRFS-3DRTMA. (Also see the
issue in EMC GSI github repository: #601
 Adding I/O for Analysis of Significant Wave Height for 3DRTMA)

<!-- PLEASE READ -->
<!--
Before opening a PR, please note these guidelines:

- Each PR should only address ONE topic and have an associated issue
- No hardcoded or paths to personal directories should be present
- No temporary or backup files should be committed
- Any code that was disabled by being commented out should be removed
-->

**Description**

<!-- Please include relevant motivation and context. -->
Significant Wave Height (hereafter as SWH) is one of the standard
products provided by the operational (2D)RTMA. To continuously provide
the same products in 3DRTMA, the next-generation RTMA, some efforts in
GSI code need to be made in order to analyze the SWH in 3D analysis of
GSI.
<!-- Please include a summary of the change and which issue is fixed.
-->
The kernel subroutines to assimilate SWH in GSI (such as stphowv.f90,
setuphowv.f90, inthowv.f90, gsi_howvOper.f90 and m_howvNode.f90) already
had been added for (2D)RTMA years ago by Manuel Pondeca, so for this
issue, the code work mainly focus on adding the I/O of SWH in background
and analysis fields for 3DRTMA (esp. RRFS-based 3DRTMA), and some
necessary modifications in background error, options, variables related
to analysis of SWH, etc.
Modified code in GSI:
1. rapidrefresh_cldsurf_mod.f90: adding a few variables related to the
analysis of howv in 3D analysis
2. gsimod.F90: adding namelist options used for analysis of howv in 3D
analysis
3. m_berror_stats_reg.f90: added some code for the special treatment to
the static background error (BE) of howv
4. read_prepbufr.f90: adding code to decode the observation of howv in
prepbufr file when howv is available in firstguess
5. setuphowv.f90: adding code to use obs of howv when howv is available
in firstguess
6. gsi_rfv3io_mod.f90: adding I/O code to read in howv from firstguess
and write out howv into analysis.


<!-- List any dependencies that are required for this change. -->
No dependencies are required for this change.
<!-- Please provide reference to the issue this pull request is
addressing. -->
This PR is addressing the issue
[#601](#601): Adding code to
analyze the siginificant wave heigh in GSI 3D Analysis".
<!-- For e.g. Fixes #IssueNumber -->
Fixes #601

**Type of change**

Please delete options that are not relevant.


- [*] New feature (non-breaking change which adds functionality)



**How Has This Been Tested?**

<!-- Please describe the tests that you ran to verify your changes and
on the platforms these tests were conducted. -->
- Brief results from ctest (regression test) with the modified code (on
WCOSS2 - Cactus):

 [gang.zhao@clogin07:build] (feature/3drtma_howv)$ ctest -N
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
  Test #1: global_3dvar
  Test #2: global_4dvar
  Test #3: global_4denvar
  Test #4: hwrf_nmm_d2
  Test #5: hwrf_nmm_d3
  Test #6: rtma
  Test #7: rrfs_3denvar_glbens
  Test #8: netcdf_fv3_regional
  Test #9: global_enkf

Total Tests: 9
  Test #1: global_3dvar
[gang.zhao@clogin04:build] (feature/3drtma_howv)$ ctest -R global_3dvar
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
    Start 1: global_3dvar
1/1 Test #1: global_3dvar .....................   Passed  1631.12 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 1631.14 sec

  Test #2: global_4dvar
[gang.zhao@clogin09:build] (feature/3drtma_howv)$ ctest -R global_4dvar
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
    Start 2: global_4dvar
1/1 Test #2: global_4dvar .....................   Passed  2462.19 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 2462.23 sec

  Test #3: global_4denvar
[gang.zhao@clogin04:build] (feature/3drtma_howv)$ ctest -R
global_4denvar
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
    Start 3: global_4denvar
1/1 Test #3: global_4denvar ...................   Passed  1922.43 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 1922.46 sec

  Test #4: hwrf_nmm_d2
[gang.zhao@clogin09:build] (feature/3drtma_howv)$ ctest -R hwrf_nmm_d2
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
    Start 4: hwrf_nmm_d2
1/1 Test #4: hwrf_nmm_d2 ......................   Passed  1214.10 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 1214.20 sec

  Test #5: hwrf_nmm_d3
[gang.zhao@clogin09:build] (feature/3drtma_howv)$ ctest -R hwrf_nmm_d3
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
    Start 5: hwrf_nmm_d3
1/1 Test #5: hwrf_nmm_d3 ......................   Passed  736.38 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 736.50 sec

  Test #6: rtma
[gang.zhao@clogin05:build] (feature/3drtma_howv)$ ctest -R rtma
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
    Start 6: rtma
1/1 Test #6: rtma .............................   Passed  1027.01 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 1027.01 sec

  Test #7: rrfs_3denvar_glbens
[gang.zhao@clogin06:build] (feature/3drtma_howv)$ ctest -R
rrfs_3denvar_glbens
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
    Start 7: rrfs_3denvar_glbens
1/1 Test #7: rrfs_3denvar_glbens ..............   Passed  484.69 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 484.70 sec

  Test #8: netcdf_fv3_regional
[gang.zhao@clogin03:build] (feature/3drtma_howv)$ ctest -R
netcdf_fv3_regional
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
    Start 8: netcdf_fv3_regional
1/1 Test #8: netcdf_fv3_regional ..............   Passed  483.08 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 483.11 sec

  Test #9: global_enkf
[gang.zhao@clogin03:build] (feature/3drtma_howv)$ ctest -R global_enkf
Test project /lfs/h2/emc/da/save/gang.zhao/WorkDir/WaveHgt/develop/build
    Start 9: global_enkf
1/1 Test #9: global_enkf ......................   Passed  488.50 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 488.57 sec

- The modified GSI code passed the regression tests (all 9 tasks) on
Hera and WCOSS2 (Cactus).

- adding the analysis of howv only has very trial influences on the
analyses of other variables. Here is the statistics of the differences
of other variables (u/v/t/ps/q/t2m/q2m) from the runs of GSI without
howv vs. with howv (from a testing case 2023-07-12_14:00:00 UTC in 3km
North-American domain):

comparing two netcdf files:
fcst_fv3lam_hyb_betas/INPUT/fv_core.res.tile1.nc
fcst_fv3lam_nodata_noinfo/INPUT/fv_core.res.tile1.nc ...
Variable Group Count Sum AbsSum Min Max Range Mean StdDev
u / 602135550 3926.84 25760.8 -0.1026 0.485788 0.588388 6.52152e-06
0.00115817
v / 620166777 -4891.34 32582.5 -0.835774 0.268402 1.10418 -7.88714e-06
0.00197793
T / 155987083 178.048 6497.51 -0.0246582 0.0384064 0.0630646 1.14143e-06
0.000218737
delp / 19559676 -281.532 3008.29 -0.00292969 0.00219727 0.00512695
-1.43935e-05 0.000183727

comparing two netcdf files:
fcst_fv3lam_hyb_betas/INPUT/fv_tracer.res.tile1.nc
fcst_fv3lam_nodata_noinfo/INPUT/fv_tracer.res.tile1.nc ...
Variable Group Count Sum AbsSum Min Max Range Mean StdDev
sphum / 430707614 0.594287 2.77816 -2.6139e-05 3.1759e-05 5.7898e-05
1.37979e-09 8.03072e-08

comparing two netcdf files: fcst_fv3lam_hyb_betas/INPUT/sfc_data.nc
fcst_fv3lam_nodata_noinfo/INPUT/sfc_data.nc ...
Variable Group Count Sum AbsSum Min Max Range Mean StdDev
t2m / 10665000 43.3899 135.095 -0.00152825 0.00686629 0.00839454
4.06844e-06 5.02866e-05
q2m / 10665000 0.0192553 0.124707 -3.1476e-06 1.77554e-05 2.0903e-05
1.80547e-09 5.89657e-08

It could be seen that the differences are trivial and ignorable.

<!-- Provide instructions so we can reproduce. -->
The regression tests were done by following the instructions of "[GSI
Ctests (regression
tests)](https://github.com/NOAA-EMC/GSI/wiki/GSI-Ctests-(regression-tests))"
in [GSI Wiki](https://github.com/NOAA-EMC/GSI/wiki)
<!-- Please also list any relevant details for your test configuration
-->
The modified code had also been tested with a testing case
2023-07-12_14:00:00 UTC for 3km North-American domain
Here is a brief summary of the test results:
1. Here is the analysis increment of Significant Wave Height (aka howv
hereafter): pure 3dvar, static background error of howv is 0.42 meters,
and the de-correlation length scale is 170km.

![HOWV_var_inc_maprll_datll_reg_ncf](https://github.com/NOAA-EMC/GSI/assets/53267411/4fdeeb82-7258-4344-be69-cce747474312)
2. The following figure shows the distribution of howv in the analysis
(used obs is in green, rejected in red). Obviously the location of used
obs of howv match the area of non-zero analysis increments of howv.

![var_obs_2023071214_howv_maprll_datll_reg_ncf](https://github.com/NOAA-EMC/GSI/assets/53267411/d4ed6013-cfc8-486e-8f47-db07ec0e4e53)
3. The following figure is the analysis increment of howv with hybrid
envar analysis (using gdas ensemble 80 members and the ensemble weight
is 84%), and the static BE of howv is tuned/inflated. The analysis
increments are very similar to the results from pure 3dvar run (see the
first figure)

![HOWV_hyb_betas016_inc_maprll_datll_reg_ncf](https://github.com/NOAA-EMC/GSI/assets/53267411/e6e696e8-932b-42ab-9001-3472e970b21c)
4. The last figure shows the analysis increments of howv with hybrid
envar analysis (using gdas ensemble 80 members and the ensemble weight
is 84%), but the static BE of howv is NOT tuned. It can be observed that
the analysis increments is less than the results from the hybrid run
with tuning the static BE of howv. That is because the weight of static
BE (16%) reduced the background error of howv (ensemble of howv is not
available yet), so the impact of obs is decreased.

![HOWV_hyb_betas016_noTune_inc_maprll_datll_reg_ncf](https://github.com/NOAA-EMC/GSI/assets/53267411/ca25d068-fc86-4d47-a9d2-46e02ac22dac)

  
**Checklist**

- [*] My code follows the style guidelines of this project
- [*] I have performed a self-review of my own code
- [*] I have commented my code, particularly in hard-to-understand areas
- [*] New and existing tests pass with my changes
- [*] Any dependent changes have been merged and published

**DUE DATE for this PR is 10/5/2023.** If this PR is not merged into
`develop` by this date, the PR will be closed and returned to the
developer.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants