From bdc8c96d9fd4f72325d9e788d4a162c27a78205f Mon Sep 17 00:00:00 2001 From: Quarto GHA Workflow Runner Date: Thu, 25 Jan 2024 17:32:50 +0000 Subject: [PATCH] Built site for gh-pages --- .nojekyll | 2 +- about.html | 228 +++++++++-- content/gsi/01-gsi.html | 260 +++++++++++-- content/gsi/02-convencionals.html | 257 +++++++++++-- content/gsi/03-radiances.html | 400 ++++++++++++++++++-- content/gsi/04-diagfiles.html | 226 +++++++++-- content/gsi/05-tutorial.html | 232 ++++++++++-- content/gsi/img/bc_training.png | Bin 0 -> 77544 bytes content/gsi/img/omb_bc.png | Bin 0 -> 56583 bytes content/observations/01-bufr.html | 226 +++++++++-- contribute.html | 228 +++++++++-- contributors.html | 226 +++++++++-- index.html | 227 +++++++++-- license.html | 226 +++++++++-- robots.txt | 2 +- search.json | 161 ++++---- site_libs/bootstrap/bootstrap-icons.css | 148 +++++--- site_libs/bootstrap/bootstrap-icons.woff | Bin 164168 -> 176200 bytes site_libs/bootstrap/bootstrap.min.css | 12 +- site_libs/bootstrap/bootstrap.min.js | 6 +- site_libs/quarto-html/anchor.min.js | 6 +- site_libs/quarto-html/popper.min.js | 4 +- site_libs/quarto-html/quarto.js | 29 +- site_libs/quarto-nav/quarto-nav.js | 21 +- site_libs/quarto-search/autocomplete.umd.js | 4 +- site_libs/quarto-search/quarto-search.js | 161 ++++++-- sitemap.xml | 44 +-- 27 files changed, 2819 insertions(+), 517 deletions(-) create mode 100644 content/gsi/img/bc_training.png create mode 100644 content/gsi/img/omb_bc.png diff --git a/.nojekyll b/.nojekyll index 03e36ed..4095e74 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -07be55b6 \ No newline at end of file +580ea979 \ No newline at end of file diff --git a/about.html b/about.html index 3e34015..ead0081 100644 --- a/about.html +++ b/about.html @@ -2,7 +2,7 @@ - + @@ -45,7 +45,13 @@ "collapse-after": 3, "panel-placement": "end", "type": "overlay", - "limit": 20, + "limit": 50, + "keyboard-shortcut": [ + "f", + "/", + "s" + ], + "show-item-context": false, "language": { "search-no-results-text": "No results", "search-matching-documents-text": "matching documents", @@ -54,6 +60,7 @@ "search-more-match-text": "more match in this document", "search-more-matches-text": "more matches in this document", "search-clear-button-title": "Clear", + "search-text-placeholder": "", "search-detached-cancel-button-title": "Cancel", "search-submit-button-title": "Submit", "search-label": "Search" @@ -68,9 +75,9 @@
-
@@ -146,7 +153,7 @@

On this page

-
+
@@ -166,8 +173,10 @@

About

+ +

This guide is a compilation of many tools scripts, pieces of code and routines that I used during my PhD. As the name says, everything goes around assimilating observations using the GSI system. I spent a lot of time working with the conventional and Radiance observations so you will find a comprehensive tutorial and documentation on how to assimilate these types of observations. This includes the processing of the observations, how to configure the system and all the quality control steps GSI performs during the assimilation process.

Sometimes you will find everything inside the website and sometimes you will need to go to a specific repository to get the code or the data associated with the the specific topic. And while I tried to be mindful during my PhD at commenting and documenting everything along the way I’m sure that there are gaps and missing pieces. If you find anything that can be improved please open an issue in the repository of this website and contribute to making this guide better.

Many of these tools come from different sources. Sometimes someone else wrote the code and I adapted it to my specific needs, sometimes I wrote the code from scratch. So it’s important to read the license note in each section so you know who created that code and in which way you can use it.

@@ -259,10 +268,9 @@

About my PhD

// clear code selection e.clearSelection(); }); - function tippyHover(el, contentFn) { + function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { const config = { allowHTML: true, - content: contentFn, maxWidth: 500, delay: 100, arrow: false, @@ -272,8 +280,17 @@

About my PhD

interactive: true, interactiveBorder: 10, theme: 'quarto', - placement: 'bottom-start' + placement: 'bottom-start', }; + if (contentFn) { + config.content = contentFn; + } + if (onTriggerFn) { + config.onTrigger = onTriggerFn; + } + if (onUntriggerFn) { + config.onUntrigger = onUntriggerFn; + } window.tippy(el, config); } const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); @@ -287,6 +304,125 @@

About my PhD

const note = window.document.getElementById(id); return note.innerHTML; }); + } + const xrefs = window.document.querySelectorAll('a.quarto-xref'); + const processXRef = (id, note) => { + // Strip column container classes + const stripColumnClz = (el) => { + el.classList.remove("page-full", "page-columns"); + if (el.children) { + for (const child of el.children) { + stripColumnClz(child); + } + } + } + stripColumnClz(note) + if (id === null || id.startsWith('sec-')) { + // Special case sections, only their first couple elements + const container = document.createElement("div"); + if (note.children && note.children.length > 2) { + container.appendChild(note.children[0].cloneNode(true)); + for (let i = 1; i < note.children.length; i++) { + const child = note.children[i]; + if (child.tagName === "P" && child.innerText === "") { + continue; + } else { + container.appendChild(child.cloneNode(true)); + break; + } + } + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(container); + } + return container.innerHTML + } else { + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(note); + } + return note.innerHTML; + } + } else { + // Remove any anchor links if they are present + const anchorLink = note.querySelector('a.anchorjs-link'); + if (anchorLink) { + anchorLink.remove(); + } + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(note); + } + // TODO in 1.5, we should make sure this works without a callout special case + if (note.classList.contains("callout")) { + return note.outerHTML; + } else { + return note.innerHTML; + } + } + } + for (var i=0; i res.text()) + .then(html => { + const parser = new DOMParser(); + const htmlDoc = parser.parseFromString(html, "text/html"); + const note = htmlDoc.getElementById(id); + if (note !== null) { + const html = processXRef(id, note); + instance.setContent(html); + } + }).finally(() => { + instance.enable(); + instance.show(); + }); + } + } else { + // See if we can fetch a full url (with no hash to target) + // This is a special case and we should probably do some content thinning / targeting + fetch(url) + .then(res => res.text()) + .then(html => { + const parser = new DOMParser(); + const htmlDoc = parser.parseFromString(html, "text/html"); + const note = htmlDoc.querySelector('main.content'); + if (note !== null) { + // This should only happen for chapter cross references + // (since there is no id in the URL) + // remove the first header + if (note.children.length > 0 && note.children[0].tagName === "HEADER") { + note.children[0].remove(); + } + const html = processXRef(null, note); + instance.setContent(html); + } + }).finally(() => { + instance.enable(); + instance.show(); + }); + } + }, function(instance) { + }); } let selectedAnnoteEl; const selectorForAnnotation = ( cell, annotation) => { @@ -329,6 +465,7 @@

About my PhD

} div.style.top = top - 2 + "px"; div.style.height = height + 4 + "px"; + div.style.left = 0; let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); if (gutterDiv === null) { gutterDiv = window.document.createElement("div"); @@ -354,6 +491,32 @@

About my PhD

}); selectedAnnoteEl = undefined; }; + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + if (selectedAnnoteEl) { + selectCodeLines(selectedAnnoteEl); + } + }, 10) + ); + function throttle(fn, ms) { + let throttle = false; + let timer; + return (...args) => { + if(!throttle) { // first call gets through + fn.apply(this, args); + throttle = true; + } else { // all the others get throttled + if(timer) clearTimeout(timer); // cancel #2 + timer = setTimeout(() => { + fn.apply(this, args); + timer = throttle = false; + }, ms); + } + }; + } // Attach click handler to the DT const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); for (const annoteDlNode of annoteDls) { @@ -422,16 +585,24 @@

About my PhD

+ @@ -449,4 +620,5 @@

About my PhD

+ \ No newline at end of file diff --git a/content/gsi/01-gsi.html b/content/gsi/01-gsi.html index 8446fb7..17e5e35 100644 --- a/content/gsi/01-gsi.html +++ b/content/gsi/01-gsi.html @@ -2,7 +2,7 @@ - + @@ -24,6 +24,7 @@ div.csl-bib-body { } div.csl-entry { clear: both; + margin-bottom: 0em; } .hanging-indent div.csl-entry { margin-left:2em; @@ -64,7 +65,13 @@ "collapse-after": 3, "panel-placement": "end", "type": "overlay", - "limit": 20, + "limit": 50, + "keyboard-shortcut": [ + "f", + "/", + "s" + ], + "show-item-context": false, "language": { "search-no-results-text": "No results", "search-matching-documents-text": "matching documents", @@ -73,6 +80,7 @@ "search-more-match-text": "more match in this document", "search-more-matches-text": "more matches in this document", "search-clear-button-title": "Clear", + "search-text-placeholder": "", "search-detached-cancel-button-title": "Cancel", "search-submit-button-title": "Submit", "search-label": "Search" @@ -82,6 +90,33 @@ + + @@ -89,9 +124,9 @@
-
@@ -173,7 +208,7 @@

On this page

  • Running GSI
  • - +
    @@ -193,8 +228,10 @@

    The GSI assimilation system

    + +

    The GSI (Gridpoint Statistical Interpolation) System, is a state-of-the-art data assimilation system initially developed by the Environmental Modeling Center at NCEP. It was designed as a traditional 3DVAR system applied in the gridpoint space of models to facilitate the implementation of inhomogeneous anisotropic covariances (Wu, Purser, and Parrish 2002; Purser et al. 2003b, 2003a). It is designed to run on various computational platforms, create analyses for different numerical forecast models, and remain flexible enough to handle future scientific developments, such as the use of new observation types, improved data selection, and new state variables (Kleist et al. 2009).

    The- 3DVAR system replaced the NCEP regional grid-point operational analysis system by the North American Mesoscale Prediction System (NAM) in 2006 and the Spectral Statistical Interpolation (SSI) global analysis system used to generate Global Forecast System (GFS) initial conditions in 2007 (Kleist et al. 2009). In recent years, GSI has evolved to include various data assimilation techniques for multiple operational applications, including 2DVAR [e.g., the Real-Time Mesoscale Analysis (RTMA) system; Pondeca et al. (2011)], the hybrid EnVar technique (e.g., data assimilation systems for the GFS, the Rapid Refresh system (RAP), the NAM, the HWRF, etc. ), and 4DVAR [e.g., the data assimilation system for NASA’s Goddard Earth Observing System, version 5 (GEOS-5); Zhu and Gelaro (2008)]. GSI also includes a hybrid 4D-EnVar approach that is currently used for GFS generation.

    In addition to the development of hybrid techniques, GSI allows the use of ensemble assimilation methods. To achieve this, it uses the same observation operator as the variational methods to compare the preliminary field or background with the observations. In this way the exhaustive quality controls developed for variational methods are also applied in ensemble assimilation methods. The EnKF code was developed by the Earth System Research Lab (ESRL) of the National Oceanic and Atmospheric Administration (NOAA) in collaboration with the scientific community. It contains two different algorithms for calculating the analysis increment, the serial Ensemble Square Root Filter (EnSRF, Whitaker and Hamill 2002) and the LETKF (Hunt, Kostelich, and Szunyogh 2007) contributed by Yoichiro Ota of the Japan Meteorological Agency (JMA).

    @@ -279,7 +316,7 @@

    Running GSI

    Diagram that shows a cycle. First the background (forecasts generated using a numerical model, WRF-ARW, initialized from previous analysis) and Observations (from bufr files) enters the GSI system. Inside the system, the Observation Operator takes care of the quality control and bias correction and then calculates the innovation and generates the diag files. Then the ENKF part calculates the update appling the innovation to the background to generate the analysis. The analysis is used to create a new background to star the cycle again

    -
    Diagram of an assimilation cycle
    +
    Diagram of an assimilation cycle

    GSI can also be used with the following background files:

    @@ -369,7 +406,7 @@

    Running GSI

    -

    References

    +

    References

    Hunt, Brian R., Eric J. Kostelich, and Istvan Szunyogh. 2007. “Efficient Data Assimilation for Spatiotemporal Chaos: A Local Ensemble Transform Kalman Filter.” Physica D: Nonlinear Phenomena 230 (1-2): 112–26. https://doi.org/10.1016/j.physd.2006.11.008.
    @@ -482,10 +519,9 @@

    Running GSI

    // clear code selection e.clearSelection(); }); - function tippyHover(el, contentFn) { + function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { const config = { allowHTML: true, - content: contentFn, maxWidth: 500, delay: 100, arrow: false, @@ -495,8 +531,17 @@

    Running GSI

    interactive: true, interactiveBorder: 10, theme: 'quarto', - placement: 'bottom-start' + placement: 'bottom-start', }; + if (contentFn) { + config.content = contentFn; + } + if (onTriggerFn) { + config.onTrigger = onTriggerFn; + } + if (onUntriggerFn) { + config.onUntrigger = onUntriggerFn; + } window.tippy(el, config); } const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); @@ -510,6 +555,125 @@

    Running GSI

    const note = window.document.getElementById(id); return note.innerHTML; }); + } + const xrefs = window.document.querySelectorAll('a.quarto-xref'); + const processXRef = (id, note) => { + // Strip column container classes + const stripColumnClz = (el) => { + el.classList.remove("page-full", "page-columns"); + if (el.children) { + for (const child of el.children) { + stripColumnClz(child); + } + } + } + stripColumnClz(note) + if (id === null || id.startsWith('sec-')) { + // Special case sections, only their first couple elements + const container = document.createElement("div"); + if (note.children && note.children.length > 2) { + container.appendChild(note.children[0].cloneNode(true)); + for (let i = 1; i < note.children.length; i++) { + const child = note.children[i]; + if (child.tagName === "P" && child.innerText === "") { + continue; + } else { + container.appendChild(child.cloneNode(true)); + break; + } + } + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(container); + } + return container.innerHTML + } else { + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(note); + } + return note.innerHTML; + } + } else { + // Remove any anchor links if they are present + const anchorLink = note.querySelector('a.anchorjs-link'); + if (anchorLink) { + anchorLink.remove(); + } + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(note); + } + // TODO in 1.5, we should make sure this works without a callout special case + if (note.classList.contains("callout")) { + return note.outerHTML; + } else { + return note.innerHTML; + } + } + } + for (var i=0; i res.text()) + .then(html => { + const parser = new DOMParser(); + const htmlDoc = parser.parseFromString(html, "text/html"); + const note = htmlDoc.getElementById(id); + if (note !== null) { + const html = processXRef(id, note); + instance.setContent(html); + } + }).finally(() => { + instance.enable(); + instance.show(); + }); + } + } else { + // See if we can fetch a full url (with no hash to target) + // This is a special case and we should probably do some content thinning / targeting + fetch(url) + .then(res => res.text()) + .then(html => { + const parser = new DOMParser(); + const htmlDoc = parser.parseFromString(html, "text/html"); + const note = htmlDoc.querySelector('main.content'); + if (note !== null) { + // This should only happen for chapter cross references + // (since there is no id in the URL) + // remove the first header + if (note.children.length > 0 && note.children[0].tagName === "HEADER") { + note.children[0].remove(); + } + const html = processXRef(null, note); + instance.setContent(html); + } + }).finally(() => { + instance.enable(); + instance.show(); + }); + } + }, function(instance) { + }); } let selectedAnnoteEl; const selectorForAnnotation = ( cell, annotation) => { @@ -552,6 +716,7 @@

    Running GSI

    } div.style.top = top - 2 + "px"; div.style.height = height + 4 + "px"; + div.style.left = 0; let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); if (gutterDiv === null) { gutterDiv = window.document.createElement("div"); @@ -577,6 +742,32 @@

    Running GSI

    }); selectedAnnoteEl = undefined; }; + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + if (selectedAnnoteEl) { + selectCodeLines(selectedAnnoteEl); + } + }, 10) + ); + function throttle(fn, ms) { + let throttle = false; + let timer; + return (...args) => { + if(!throttle) { // first call gets through + fn.apply(this, args); + throttle = true; + } else { // all the others get throttled + if(timer) clearTimeout(timer); // cancel #2 + timer = setTimeout(() => { + fn.apply(this, args); + timer = throttle = false; + }, ms); + } + }; + } // Attach click handler to the DT const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); for (const annoteDlNode of annoteDls) { @@ -645,16 +836,24 @@

    Running GSI

    +
    @@ -672,4 +871,5 @@

    Running GSI

    + \ No newline at end of file diff --git a/content/gsi/02-convencionals.html b/content/gsi/02-convencionals.html index c8d5f56..3a71422 100644 --- a/content/gsi/02-convencionals.html +++ b/content/gsi/02-convencionals.html @@ -2,7 +2,7 @@ - + @@ -22,7 +22,7 @@ } /* CSS for syntax highlighting */ pre > code.sourceCode { white-space: pre; position: relative; } -pre > code.sourceCode > span { display: inline-block; line-height: 1.25; } +pre > code.sourceCode > span { line-height: 1.25; } pre > code.sourceCode > span:empty { height: 1.2em; } .sourceCode { overflow: visible; } code.sourceCode > span { color: inherit; text-decoration: inherit; } @@ -79,7 +79,13 @@ "collapse-after": 3, "panel-placement": "end", "type": "overlay", - "limit": 20, + "limit": 50, + "keyboard-shortcut": [ + "f", + "/", + "s" + ], + "show-item-context": false, "language": { "search-no-results-text": "No results", "search-matching-documents-text": "matching documents", @@ -88,6 +94,7 @@ "search-more-match-text": "more match in this document", "search-more-matches-text": "more matches in this document", "search-clear-button-title": "Clear", + "search-text-placeholder": "", "search-detached-cancel-button-title": "Cancel", "search-submit-button-title": "Submit", "search-label": "Search" @@ -97,6 +104,33 @@ + + @@ -104,9 +138,9 @@
    -
    @@ -183,7 +217,7 @@

    On this page

  • Controlling which observations are assimilated
  • Observation errors and quality control
  • - +
    @@ -203,8 +237,10 @@

    Assimilating Conventional Observations

    + +

    Conventional observations are assimilated from PREPBUFR files. NCEP ADP Global Upper Air and Surface Weather Observations (PREPBUFR format) are composed of a global set of surface and upper air reports operationally collected by the National Centers for Environmental Prediction (NCEP). These include land surface, marine surface, radiosonde, pibal and aircraft reports from the Global Telecommunications System (GTS), profiler and US radar derived winds, SSM/I oceanic winds and TCW retrievals, and satellite wind data from the National Environmental Satellite Data and Information Service (NESDIS). The reports can include pressure, geopotential height, temperature, dew point temperature, wind direction and speed [@cisl_rda_ds337.0].

    While the PREPBUFR includes wind derived from satellite observations, GSI ignores this observations and uses the ones provided by the specific bufr file gdas.t00z.satwnd.tm00.bufr_d.

    PREPBUFR files usually contains observations from a 6 to 12 h window and can be modify using FORTRAN routines provided with the GSI code (see util/bufr_tools in the GSI source code folder). You can also create your own bufr file or add new observation to an existing bufr file (see Working with bufr files).

    @@ -417,10 +453,9 @@

    Obs // clear code selection e.clearSelection(); }); - function tippyHover(el, contentFn) { + function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { const config = { allowHTML: true, - content: contentFn, maxWidth: 500, delay: 100, arrow: false, @@ -430,8 +465,17 @@

    Obs interactive: true, interactiveBorder: 10, theme: 'quarto', - placement: 'bottom-start' + placement: 'bottom-start', }; + if (contentFn) { + config.content = contentFn; + } + if (onTriggerFn) { + config.onTrigger = onTriggerFn; + } + if (onUntriggerFn) { + config.onUntrigger = onUntriggerFn; + } window.tippy(el, config); } const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); @@ -445,6 +489,125 @@

    Obs const note = window.document.getElementById(id); return note.innerHTML; }); + } + const xrefs = window.document.querySelectorAll('a.quarto-xref'); + const processXRef = (id, note) => { + // Strip column container classes + const stripColumnClz = (el) => { + el.classList.remove("page-full", "page-columns"); + if (el.children) { + for (const child of el.children) { + stripColumnClz(child); + } + } + } + stripColumnClz(note) + if (id === null || id.startsWith('sec-')) { + // Special case sections, only their first couple elements + const container = document.createElement("div"); + if (note.children && note.children.length > 2) { + container.appendChild(note.children[0].cloneNode(true)); + for (let i = 1; i < note.children.length; i++) { + const child = note.children[i]; + if (child.tagName === "P" && child.innerText === "") { + continue; + } else { + container.appendChild(child.cloneNode(true)); + break; + } + } + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(container); + } + return container.innerHTML + } else { + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(note); + } + return note.innerHTML; + } + } else { + // Remove any anchor links if they are present + const anchorLink = note.querySelector('a.anchorjs-link'); + if (anchorLink) { + anchorLink.remove(); + } + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(note); + } + // TODO in 1.5, we should make sure this works without a callout special case + if (note.classList.contains("callout")) { + return note.outerHTML; + } else { + return note.innerHTML; + } + } + } + for (var i=0; i res.text()) + .then(html => { + const parser = new DOMParser(); + const htmlDoc = parser.parseFromString(html, "text/html"); + const note = htmlDoc.getElementById(id); + if (note !== null) { + const html = processXRef(id, note); + instance.setContent(html); + } + }).finally(() => { + instance.enable(); + instance.show(); + }); + } + } else { + // See if we can fetch a full url (with no hash to target) + // This is a special case and we should probably do some content thinning / targeting + fetch(url) + .then(res => res.text()) + .then(html => { + const parser = new DOMParser(); + const htmlDoc = parser.parseFromString(html, "text/html"); + const note = htmlDoc.querySelector('main.content'); + if (note !== null) { + // This should only happen for chapter cross references + // (since there is no id in the URL) + // remove the first header + if (note.children.length > 0 && note.children[0].tagName === "HEADER") { + note.children[0].remove(); + } + const html = processXRef(null, note); + instance.setContent(html); + } + }).finally(() => { + instance.enable(); + instance.show(); + }); + } + }, function(instance) { + }); } let selectedAnnoteEl; const selectorForAnnotation = ( cell, annotation) => { @@ -487,6 +650,7 @@

    Obs } div.style.top = top - 2 + "px"; div.style.height = height + 4 + "px"; + div.style.left = 0; let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); if (gutterDiv === null) { gutterDiv = window.document.createElement("div"); @@ -512,6 +676,32 @@

    Obs }); selectedAnnoteEl = undefined; }; + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + if (selectedAnnoteEl) { + selectCodeLines(selectedAnnoteEl); + } + }, 10) + ); + function throttle(fn, ms) { + let throttle = false; + let timer; + return (...args) => { + if(!throttle) { // first call gets through + fn.apply(this, args); + throttle = true; + } else { // all the others get throttled + if(timer) clearTimeout(timer); // cancel #2 + timer = setTimeout(() => { + fn.apply(this, args); + timer = throttle = false; + }, ms); + } + }; + } // Attach click handler to the DT const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); for (const annoteDlNode of annoteDls) { @@ -580,16 +770,24 @@

    Obs +

    @@ -607,4 +805,5 @@

    Obs + \ No newline at end of file diff --git a/content/gsi/03-radiances.html b/content/gsi/03-radiances.html index 6b3c536..7a01ba2 100644 --- a/content/gsi/03-radiances.html +++ b/content/gsi/03-radiances.html @@ -2,12 +2,12 @@ - + -DA-documentation - Intro a GSI +DA-documentation - Assimilating Radiance Observations +/* CSS for citations */ +div.csl-bib-body { } +div.csl-entry { + clear: both; + margin-bottom: 0em; +} +.hanging-indent div.csl-entry { + margin-left:2em; + text-indent:-2em; +} +div.csl-left-margin { + min-width:2em; + float:left; +} +div.csl-right-inline { + margin-left:2em; + padding-left:1em; +} +div.csl-indent { + margin-left: 2em; +} @@ -45,7 +65,13 @@ "collapse-after": 3, "panel-placement": "end", "type": "overlay", - "limit": 20, + "limit": 50, + "keyboard-shortcut": [ + "f", + "/", + "s" + ], + "show-item-context": false, "language": { "search-no-results-text": "No results", "search-matching-documents-text": "matching documents", @@ -54,12 +80,42 @@ "search-more-match-text": "more match in this document", "search-more-matches-text": "more matches in this document", "search-clear-button-title": "Clear", + "search-text-placeholder": "", "search-detached-cancel-button-title": "Cancel", "search-submit-button-title": "Submit", "search-label": "Search" } } + + + + @@ -68,9 +124,9 @@
    -
    @@ -140,14 +196,28 @@
    -

    Intro a GSI

    +

    Assimilating Radiance Observations

    @@ -160,15 +230,112 @@

    Intro a GSI

    +
    -

    crtm

    -

    satinfo

    -

    correccion de bias

    + +

    Assimilating radiance observations is more complicated than assimilating conventional observations as radiances are not state variables. We need a observation operator to transform the model variables to radiances. GSI uses the Community Radiative Transfer Model (CRTM, Liu et al. 2008) as an operator of the radiance observations that calculates the brightness temperature simulated by the model in order to compare it with the observations from satellite sensors.

    +
    +

    The CRTM radiative transfer model

    +

    The CRTM is a fast radiative transfer model that was jointly developed by the NOAA Center for Satellite Applications and Research and the Joint Center for Satellite Data Assimilation (JCSDA). It is a model widely used by the remote sensing community as it is open source and publicly available. In addition, it is used for satellite instrument calibration (Weng et al. 2013; Iacovazzi et al. 2020; Crews et al. 2021), and in turn to generate retrievals from satellite observations (Boukabara et al. 2011; H. Hu et al. 2019; H. Hu and Han 2021). It is also used as an operator of observations as part of the assimilation of satellite radiances (Tong et al. 2020; Barton et al. 2021).

    +

    The CRTM is capable of simulating microwave, infrared and visible radiances, under clear and cloudy sky conditions, using atmospheric profiles of pressure, temperature, humidity and other species such as ozone. Recently Cutraro, Galligani, and Skabar (2021) evaluated their takeoff in the region with good results in simulating GOES-16 observations.

    +

    CRTM is a sensor-oriented radiative transfer model, i.e. it contains pre-calculated parameterizations and coefficient tables specifically for operational sensors. It includes modules that calculate thermal radiation from gaseous absorption, absorption and scattering by aerosols and clouds, and emission and reflection of radiation by the Earth’s surface. The inputs of CRTM include atmospheric state variables, e.g., temperature, water vapor, pressure, and ozone concentration in user-defined layers, and surface state variables and parameters, including emissivity, surface temperature, and wind.

    +

    CRTM is capable to simulate satellite observations from the state of the atmosphere. This is necessary during the assimilation process but is also used to verify the accuracy and errors of radiance observations.

    +

    The necessary calculations to simulate observations has a very high computational cost as it requires transposing a high dimensional matrix and the minimization of a cost function. This \(K^{*}\) matrix is constructed from the partial derivatives of the radiances with respect to geophysical parameters. CRTM performs these calculations very quickly so it can be used in operational contexts.

    +

    To obtain fast results, CRTM applies certain simplifications and approximations when solving the radiative transfer equation. First, it assumes that the Earth’s atmosphere consists of plane-parallel and homogeneous layers in thermodynamic equilibrium and where three-dimensional and polarization effects can be ignored.

    +

    In the context of clear skies, it is also assumed that there is no scattering and only the absorption of gases in the atmosphere is considered. In cloudy skies, the scattering generated by clouds is included. In the latter case, the radiative transfer equation cannot be solved analytically and numerical solutions are used.

    +
    +
    +

    Specific configuration

    +

    The vertical location of each radiance observation was estimated as the model level at which its weight function computed by CRTM was maximized. The weight function of each channel corresponds to the change in transmittance with height and its maximum describes the layer of the atmosphere from which the radiation captured by the channel was emitted. Multispectral sensors have good vertical coverage and are capable of capturing from the lower troposphere to the lower stratosphere. The channels chosen for assimilation and their associated errors were defined taking into account the configuration that GSI uses to generate GFS analyses and forecasts, the model cap chosen in this work (50 hPa) and the possible influence of the surface (Table @ref(tab:table-rad)).

    +
    +
    +

    Observation errors and quality control

    +

    The preprocessing and quality control of the data is an essential step in the assimilation of radiances and depends on each sensor and channel. This process includes spatial thinning, bias correction, and in clear-sky applications, the detection of cloudy sky observations.

    +
    +

    Thinning

    +

    During the thinning process the observations to be assimilated are chosen based on their distance to the model grid points, the quality of the observation (based on available data quality information) and the number of available channels (for the same pixel and sensor). The thinning algorithm determines the quality of each observation based on the available information about the channels and their known errors, the type of surface below each pixel (preferring observations over the sea to those over land or snow) and predictors that give information about the quality of the observations (M. Hu et al. 2018). By applying the thinning we avoid incorporating information from smaller scale processes than the model can not represent and to reduce the error correlation of the observations from the same sensor.

    +
    +
    +

    Bias correction

    +

    After the thinning, a bias correction is applied. The bias correction methodology implemented in GSI depends on thermodynamic characteristics of the air and on the scan angle (Zhu et al. 2014). It is computed as a linear polynomial of N predictors \(p_i(x)\), with associated coefficients \(beta_i\). Therefore, the bias-corrected brightness temperature (\(BT_{cb}\)) can be obtained as:

    +

    \[\mathrm{\mathit{BT_{cb}} =\mathit{ BT} + \sum_{i = 0}^{N} \beta_i p_i (x)}\]

    +

    The polynomial has a constant bias correction term (\(p_0 = 1\)) while the remaining terms and their predictors are the cloud liquid water (CLW) content, the rate of change of temperature with pressure, the square of the rate of change of temperature with pressure, and the sensitivity to the surface emissivity to account for the difference between land and sea. The scan angle-dependent bias is modeled as a polynomial of 4\(^\circ\) order (Zhu et al. 2014).

    +

    In the GSI system, the coefficients \(beta_i\) are trained using a variational estimation method that generates the \(beta_i\) that provides the best fit between the simulation and the observations. The EnKF step also calculate the coefficients for the assimilation.

    +

    It is important to evaluate the training of the coefficients and the performance of the bias correction. One way to train the coefficients according to (zhu2024?) is to run the assimilation cycles for a long period of time, updating the coefficients at each cycle. While is possible to start the training with coefficients equal to zero, using the coefficients the GFS generates can help to speed up the process.

    +

    To check if the coefficients are correctly trained we can analysed the evolution of the different coefficients for each sensor and channel with time. As an example, here we show the coefficients for AMSU-A on board NOAA-15. Following Zhu et al. (2014), we expected the coefficients to reach a stable range of values after a certain period of time, this is evident for channel 4, 5, 6 and 8 but we see a continuous variation in channels 7 and 9.

    +
    +
    +

    Line chart showing the evolution of the coefficients over time for channels 4 to 9 of AMSU-A. For some of the channels the coefficient values are more or lest constant.

    +
    Bias correction coefficients as function of time (days) for the training and experiment period. Channels 4 to 9 of AMSU-A on NOAA-15.
    +
    +
    +

    Using the resulting coefficients from the training period it is also important to check the impact of the bias correction. An easy way to see this is to calculate the mean difference between the observations and the first-guess (OmB) before and after the correction of the bias for each sensor. In the next figure there is an evident improvement as the mean OmB after the BC is now centered around zero and its standard deviation is smaller. This indicate that the BC correction worked as expected.

    +
    +
    +

    +
    Mean difference between observations and first-guess after and before the correction of the bias calculate over a 3 days period for each sensor.
    +
    +
    +

    The training of the coefficients requires a lot of computational resources and can be challenging for observations from polar satellites used in regional applications. The reason for this is that the observations are only available 1 or 2 times a day, making the training a slow process. It is important to check that GSI is not penalizing the coefficients when there are no observations available.

    +
    +
    +

    Cloud detection

    +

    The cloud pixel detection methodology depends on the wavelength of the observations. For microwave radiances, potentially cloud-contaminated observations are detected using scattering and Liquid Water Path (LWP) indices calculated from differences between different channels of each sensor (Weston et al. 2019; Zhu et al. 2016). For infrared channels, cloud contaminated observations are detected using the transmittance profile calculated by the CRTM model. In addition, GSI checks the difference between the observations and the simulated brightness temperature to detect cloudy pixels. A particular case is the ABI observations since the cloud mask (level 2 product) available at the same resolution as the observations is used. This cloud mask is generated by combining information from 8 channels of the ABI sensor from the spatial and temporal point of view.

    +
    +
    +

    Other quality controls

    +

    The GSI quality control filters out those observations from channels close to the visible range over water surfaces with a zenith angle greater than 60\(^{{circ}\) to reject those observations that could be contaminated by reflection. For infrared and microwave observations it also performs an emissivity check to detect observations contaminated by surface effects. Finally, a gross check is applied, i.e. the difference between the observation and the observation simulated by the model is compared with a predefined threshold depending on the observation error to reject erroneous observations.

    + +
    +
    -
    +

    References

    +
    +Barton, Neil, E. Joseph Metzger, Carolyn A. Reynolds, Benjamin Ruston, Clark Rowley, Ole Martin Smedstad, James A. Ridout, et al. 2021. “The Navy’s Earth System Prediction Capability: A New Global Coupled Atmosphere-Ocean-Sea Ice Prediction System Designed for Daily to Subseasonal Forecasting.” Earth and Space Science 8 (4): e2020EA001199. https://doi.org/10.1029/2020EA001199. +
    +
    +Boukabara, Sid-Ahmed, Kevin Garrett, Wanchun Chen, Flavio Iturbide-Sanchez, Christopher Grassotti, Cezar Kongoli, Ruiyue Chen, et al. 2011. MiRS: An All-Weather 1DVAR Satellite Data Assimilation and Retrieval System.” IEEE Transactions on Geoscience and Remote Sensing 49 (9): 3249–72. https://doi.org/10.1109/TGRS.2011.2158438. +
    +
    +Crews, Angela, William J. Blackwell, R. Vincent Leslie, Michael Grant, Idahosa A. Osaretin, Michael DiLiberto, Adam Milstein, Stephen Leroy, Amelia Gagnon, and Kerri Cahoy. 2021. “Initial Radiance Validation of the Microsized Microwave Atmospheric Satellite-2A.” IEEE Transactions on Geoscience and Remote Sensing 59 (4): 2703–14. https://doi.org/10.1109/TGRS.2020.3011200. +
    +
    +Cutraro, Federico, Victoria Sol Galligani, and Yanina García Skabar. 2021. “Evaluation of Synthetic Satellite Images Computed from Radiative Transfer Models over a Region of South America Using WRF and GOES-13/16 Observations.” Quarterly Journal of the Royal Meteorological Society 147 (738): 2988–3003. https://doi.org/10.1002/qj.4111. +
    +
    +Hu, Hao, and Yang Han. 2021. “Comparing the Thermal Structures of Tropical Cyclones Derived From Suomi NPP ATMS and FY-3D Microwave Sounders.” IEEE Transactions on Geoscience and Remote Sensing 59 (10): 8073–83. https://doi.org/10.1109/TGRS.2020.3034262. +
    +
    +Hu, Hao, Fuzhong Weng, Yang Han, and Yihong Duan. 2019. “Remote Sensing of Tropical Cyclone Thermal Structure from Satellite Microwave Sounding Instruments: Impacts of Background Profiles on Retrievals.” Journal of Meteorological Research 33 (1): 89–103. https://doi.org/10.1007/s13351-019-8094-1. +
    +
    +Hu, Ming, Guoqing Ge, Chunhua Zhou, Don Stark, Hui Shao, Kathryn Newman, Jeff Beck, and Xin Zhang. 2018. “Grid-Point Statistical Interpolation (GSI) User’s Guide Version 3.7.” Developmental Testbed Center. https://dtcenter.org/community-code/gridpoint-statistical-interpolation-gsi/documentation. +
    +
    +Iacovazzi, Robbie, Lin Lin, Ninghai Sun, and Quanhua Liu. 2020. NOAA Operational Microwave Sounding Radiometer Data Quality Monitoring and Anomaly Assessment Using COSMIC GNSS Radio-Occultation Soundings.” Remote Sensing 12 (5, 5): 828. https://doi.org/10.3390/rs12050828. +
    +
    +Liu, Quanhua, Fuzhong Weng, Yong Han, and Paul van Delst. 2008. “Community Radiative Transfer Model for Scattering Transfer and Applications.” In IGARSS 2008 - 2008 IEEE International Geoscience and Remote Sensing Symposium, 4:IV - 1193-IV - 1196. https://doi.org/10.1109/IGARSS.2008.4779942. +
    +
    +Tong, Mingjing, Yanqiu Zhu, Linjiong Zhou, Emily Liu, Ming Chen, Quanhua Liu, and Shian-Jiann Lin. 2020. “Multiple Hydrometeors All-Sky Microwave Radiance Assimilation in FV3GFS.” Monthly Weather Review 148 (7): 2971–95. https://doi.org/10.1175/MWR-D-19-0231.1. +
    +
    +Weng, Fuzhong, Xiaolei Zou, Ninghai Sun, Hu Yang, Miao Tian, William J. Blackwell, Xiang Wang, Lin Lin, and Kent Anderson. 2013. “Calibration of Suomi National Polar-Orbiting Partnership Advanced Technology Microwave Sounder.” Journal of Geophysical Research: Atmospheres 118 (19): 11, 187–11, 200. https://doi.org/10.1002/jgrd.50840. +
    +
    +Weston, Peter, Alan Geer, Niels Bormann, and Niels Bormann. 2019. “Investigations into the Assimilation of AMSU-A in the Presence of Cloud and Precipitation.” EUMETSAT/ECMWF Fellowship Programme Research Report. ECMWF. 2019. https://doi.org/10.21957/ewahn9ce. +
    +
    +Zhu, Yanqiu, John Derber, Andrew Collard, Dick Dee, Russ Treadon, George Gayno, and James A. Jung. 2014. “Enhanced Radiance Bias Correction in the National Centers for Environmental Prediction’s Gridpoint Statistical Interpolation Data Assimilation System.” Quarterly Journal of the Royal Meteorological Society 140 (682): 1479–92. https://doi.org/10.1002/qj.2233. +
    +
    +Zhu, Yanqiu, Emily Liu, Rahul Mahajan, Catherine Thomas, David Groff, Paul Van Delst, Andrew Collard, Daryl Kleist, Russ Treadon, and John C. Derber. 2016. “All-Sky Microwave Radiance Assimilation in NCEP’s GSI Analysis System.” Monthly Weather Review 144 (12): 4709–35. https://doi.org/10.1175/MWR-D-15-0445.1. +
    +