-
Notifications
You must be signed in to change notification settings - Fork 4
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
AMV/Satwind Obs Validation #40
Comments
Running Cory's GDASApp (importing GSI grid into JEDI to remove interpolative differences in hofx) and EVA scripts on a yaml file designed for satwind QC, including all criteria in the ewok/jedi-gdas satwind yaml file located here. The test completes with some level of disagreement between JEDI and GSI on which observations are accepted and which are rejected. You can see these disagreements in the assignment of errors when GSI rejects an observation (assigns impossibly large errors) and JEDI doesn't:
Looking more closely at the u-component (eastward_wind), I found that when GSI passes (GSIeffectiveQC=0) and JEDI does not, JEDI's rejection flag is either 12 or 17. These correspond to either a Bounds Check (12) or a diffref (17) check, where MetaData is too far from reference. In my test data, I have the following breakdown of agreement or disagreement between JEDI and GSI's rejection criteria on satwinds: |
Focusing on the JEDI reject / GSI accept observations, nearly all of them (95%) are from a flag=12 (Bounds Check) failure in JEDI. I decided to try and crawl through these criteria to find the observations where disagreements are happening. There are numerous Bounds Check filters in the yaml file, some of which are very difficult to simulate from the diag file. Of the ones I could easily simulate, I found that the most common disagreements that are being captured with my tests are coming from one particular filter: This is a check on GOES IR (245), EUMET IR (253), and JMA IR (252) satwinds to reject when pressure is outside of a 400 to 800 hPa range, based on the wording in the yaml filter:
However, the wording of the note on this filter points in the opposite direction, implying that the obs should be rejected if they are within the 400–800 hPa range. Checking this filter's settings against GSI code, I see no references to a 400 hPa cutoff but I do see references to an 800 hPa cutoff for Type 245 winds on Lines 1403-1404 of read_satwnd.f90, but the cutoff goes in the opposite direction, rejecting observations at pressures above 800 hPa rather than below it:
I'm wondering if this filter is set up incorrectly, or is the comment attached to it implying something it shouldn't? It seems like the maxvalue=80000 should correctly exclude Type=245 observations with pressures greater than 800 hPa, which matches what I see in the GSI. But the fact that so many of the rejection disagreements are showing up in this filter makes me think that something is possibly reversed here. |
@BrettHoover-NOAA I think I agree with you (and it's worth at least trying), that YAML suggests that if it is between 400-800 hPa and is 245,252,253, to reject the obs. I think there are other 'actions' to try, but I don't know them off the top of my head. Perhaps 'accept' instead of 'reject'? |
I found the range operation in GSI, in setupw.f90 Lines 963–967:
So it looks like this filter is definitely operating in reverse, excluding what should be retained and retaining what should be excluded. Also, it looks like the filter operates a little differently for Type 252 winds, excluding between 500-800 hPa, while 400–800 is used again for Type 253 winds, setupw.f90 Lines 968–975:
|
I split this 400–800 pressure filter into 3 filters, applying the exact threshold values to each of the three observation types (245, 252, 253). At @CoryMartin-NOAA's suggestion I replaced the Bounds Check filter with the Perform Action filter, which will execute the reject action on any observation within the bounds, rather than those outside of it: old filter:
new filters:
It looks like this works, bringing GSI and JEDI into much greater agreement for these satwind types. |
I am working on code to drill down into the different rejection criteria to find the source of the remaining disagreements. I have some python code that will draw in variables from the diag files and some very limited geovals data that I interpolate to the observations with Obs that pass both GSI and JEDI QC A successful test should put all of the obs into only the top-most or bottom-most contingency field, and any observations that fall into the middle two categories are suspicious disagreements between GSI and JEDI. Results are very nearly (but not entirely) equal for both u-component and v-component winds, so I will focus on the u-component for now. If we perform a contingency table check on all satwinds regardless of whether they fit into a rejection criteria or not, there is broad disagreement between GSI and JEDI, with only about 56% of satwinds in agreement and the remainder in disagreement:
If I focus on only those winds that should be caught by a JEDI filter, there is very broad agreement between GSI and JEDI QC. For example, all of the pressure-level filters are in perfect agreement, e.g.:
The log-normal vector departure (LNVD) check on a subset of satwind types is also clean:
Some filters catch no observations at all and are effectively not applied, these include the gross checks of 130 m/s maximums for both components of the wind as well as the wind speed, and a check on a subset of satwind types constraining them to pressures less than 600 hPa. There are two filters that show disagreements. First, the filter that rejects satwinds with more than a 50 degree difference with the model background, excluding observations with a u-component of less than 3.5 m/s:
Second, the filter that rejects any satwind whose pressure level is within 100 hPa of the surface, based on interpolation of the
I am performing my own interpolation of the |
Update from weekly check-in: we need to reconfigure a few things to make sure that the geovals file contains the tropopause pressure and make sure that both geovals and diag files contain the same obs (minor differences in inclusivity vs exclusivity of the time-window boundaries). NO interpolation should be necessary to go from geoval vars to diag vars, they are BOTH in obs-space. Will update. |
I am digging deeper into GSI QC criteria and I'm running into something I can't readily explain with the GSI 'final' assigned errors. These are the errors assigned in setupw.f90 to satwinds after all QC, and according to setupw.f90 L 1375-1385, should either be some reasonable error value for assimilated obs or set to the value of But when I look at my diag file, I can find numerous observations with a I plotted two subsets of Final ob error of accepted u-winds ( Final ob error of rejected u-winds ( These reasonable error + rejected observations constitute about 28% of my rejected observations in the diag file, or about 350,000 winds. I'm concerned that I am either interpreting @CoryMartin-NOAA, do you know of an explanation for what I'm seeing here? I don't want to try to drill down any further into these acceptance criteria until I'm sure I'm interpreting the GSI QC flag correctly. |
@BrettHoover-NOAA this
Perhaps GSI ignores the error if the use flag is -1? I'm not sure about that. |
@BrettHoover-NOAA for your tropopause related QC, can you try for the 2021080100 cycle but change the shell script to point to: |
I appreciate the info and the updated tropopause pressure data, @CoryMartin-NOAA! I'll see if I can generate data for the test cycle. Based on the code snippet you posted, do you know what the distinction between an ob with |
I think the difference is |
I was able to get the new tropopause pressure data in geovals, replacing both the |
Thanks @BrettHoover-NOAA once the full week is done, I'll populate new files in 20220906 for each cycle |
I have not included the updated I have a GSI QC 'simulator' written in python that attempts to re-create the GSI's QC rejections using only the data available in the diag and geovals files. I've tested it out on our 2020080100 test data, and all 1376189 satwinds have the same accept/reject between the GSI and the simulator. From here, I can attach individual flag numbers to each rejection criteria in the simulator and further break down the GSI's rejections into its component parts. The simulator is saved in a github repo here. The first thing that jumps out when decomposing the GSI simulator's rejections is that the rejections attributed to the Current implementation of the
For perfect GSI/UFO parity, this would have to be changed with different I can address this by using the GSI simulator to find the observations rejected by |
@CoryMartin-NOAA: I am working backward from There are numerous criteria for setting these |
I believe my answer, @BrettHoover-NOAA, is it depends on timeline. Short term: you can assume you will have these flags set, but long term, we will want to construct the filters. To be honest, I lean on the side of not duplicating effort. So I say might as well recreate these in YAML as soon as possible. Otherwise the PreQC checks will be largely trivial to implement I think. |
The satwinds acceptance differences between GSI and UFO are fully accounted for in the 2022080100 test data. This means that all winds are either in agreement between GSI and UFO acceptance criteria, or the differences are traceable to a known cause. The breakdown of acceptance (disagreement) on the test data is that ~75% of observations are in agreement (both GSI and UFO pass, or both GSI and UFO fail), while the disagreements break into 4.72% of observations fail GSI and pass UFO, and 20.12% pass GSI and fail UFO: Focusing first on the observations that fail GSI and pass UFO (GSI-no, JEDI-yes, or
Focusing on the observations that pass GSI and fail UFO (GSI-yes, JEDI-no, or
Remaining work on satwind UFO acceptance:
|
Satwind UFO acceptance work has been able to generate most of the YAML filters need to be staged into pre (assign errors), prior (ob and geoval based filters), and post (hofx based filters) to successfully run, but the obs errors all show up as missing in the diag file. They are NOT missing when running GDASApp, because if they are missing they are rejected with flag=10, which we have none. |
I've created a GDASApp fork in my own repository to add The filters for QC are all currently commented out for a few reasons:
I need to add a filter for Another note: I have the initial errors set in the YAML file, but I intentionally cut the value of the profile settings in half for the GOES AMVS (Type 245,246,247), because in read_setupw.f90 L1014–1016 this appears to be done for these winds. However, this could be only one of two subsets (based on format), so this ties back to the unanswered question about subsets for the same AMV type/subtypes based on BUFR subset/tank-name. |
I believe that I have closed the GSI/UFO Acceptance of satwinds following an audit of YAML filters. The A contingency table comparing UFO and GSI acceptance shows that there are 68,776 winds in disagreement, all of them rejected by GSI and accepted by JEDI: Examining these disagreements, 11096 winds come from the The remaining 1119 winds in disagreement are all rejections subject to the GSI's experr_norm test, which compares the ratio of a norm defined by expected error to the wind speed, and rejects any observation with a ratio
This test accounts for all remaining disagreements, being applied to all NESDIS winds. In single-precision testing in python this test also incorrectly assigns 5 winds as rejections when they otherwise pass QC, but all of these cases have an This test cannot be included in the YAML file because it requires reference to two variables, the expected error and the wind speed, and we do not have a way to perform the math in the YAML to carry this test out. I believe that an |
We are at a point where I believe we can confidently say that satwinds have been validated in UFO. Four critical obsfunctions have been introduced since last October:
The inclusion or refactoring of these obsfunctions completes the tools necessary to generate acceptance and final ob-errors in UFO that matches GSI, but there are two caveats that result in minor differences:
In the test data, Assigned observation errors are identical within With these caveats in mind:
Satwinds can be considered to be in acceptance and ob-error agreement with GSI for the |
Need to validate satellite based winds/AMV observations from all platforms
This issue will track progress on validation of AMVs in UFO for GDAS in four stages:
Note this will need to include any near-surface correction applied to the observation/hofx value.
The text was updated successfully, but these errors were encountered: