From 1c7ad448e962dbe7e0255ccad8232d4358f6db61 Mon Sep 17 00:00:00 2001
From: jonasjucker SUMMARY
- February 11, 2025
+ February 12, 2025
@@ -792,7 +792,7 @@ SUMMARY
- February 11, 2025
+ February 12, 2025
diff --git a/assets/stylesheets/main.8608ea7d.min.css b/assets/stylesheets/main.8608ea7d.min.css
new file mode 100644
index 00000000..407e7f0b
--- /dev/null
+++ b/assets/stylesheets/main.8608ea7d.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6;overflow-wrap:break-word}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset h5 code{text-transform:none}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}.md-typeset ul[type]{list-style-type:revert-layer}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol ol ol ol,.md-typeset ul ol ol ol{list-style-type:upper-alpha}.md-typeset ol ol ol ol ol,.md-typeset ul ol ol ol ol{list-style-type:upper-roman}.md-typeset ol[type],.md-typeset ul[type]{list-style-type:revert-layer}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block;margin:0 auto}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{border-radius:100%;filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .md-code__content{display:grid}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}@media print{.md-feedback{display:none}}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"ยท";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em;position:relative}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:minmax(.4rem,0fr);opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle.md-toggle--indeterminate~.md-nav,.md-nav__toggle:checked~.md-nav{grid-template-rows:minmax(.4rem,1fr);opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__toggle.md-toggle--indeterminate~.md-nav{transition:none}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-toggle--indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:minmax(.4rem,1fr);opacity:1;visibility:visible}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{flex-grow:1;min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-source-file{margin:1em 0}[dir=ltr] .md-source-file__fact{margin-right:.6rem}[dir=rtl] .md-source-file__fact{margin-left:.6rem}.md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}[dir=ltr] .md-source-file__fact .md-author{float:left}[dir=rtl] .md-source-file__fact .md-author{float:right}.md-source-file__fact .md-author{margin-right:.2rem}.md-source-file__fact svg{width:.9rem}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,')}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}[hidden]+.md-tooltip--inline{display:none}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-style:normal;font-weight:400;outline:none;text-align:initial;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:xxx;list-style:none}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(xxx);counter-increment:xxx;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}:root{--md-tooltip-width:20rem;--md-tooltip-tail:0.3rem}.md-tooltip2{-webkit-backface-visibility:hidden;backface-visibility:hidden;color:var(--md-default-fg-color);font-family:var(--md-text-font-family);opacity:0;pointer-events:none;position:absolute;top:calc(var(--md-tooltip-host-y) + var(--md-tooltip-y));transform:translateY(-.4rem);transform-origin:calc(var(--md-tooltip-host-x) + var(--md-tooltip-x)) 0;transition:transform 0ms .25s,opacity .25s,z-index .25s;width:100%;z-index:0}.md-tooltip2:before{border-left:var(--md-tooltip-tail) solid #0000;border-right:var(--md-tooltip-tail) solid #0000;content:"";display:block;left:clamp(1.5 * .8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-tail),100vw - 2 * var(--md-tooltip-tail) - 1.5 * .8rem);position:absolute;z-index:1}.md-tooltip2--top:before{border-top:var(--md-tooltip-tail) solid var(--md-default-bg-color);bottom:calc(var(--md-tooltip-tail)*-1 + .025rem);filter:drop-shadow(0 1px 0 hsla(0,0%,0%,.05))}.md-tooltip2--bottom:before{border-bottom:var(--md-tooltip-tail) solid var(--md-default-bg-color);filter:drop-shadow(0 -1px 0 hsla(0,0%,0%,.05));top:calc(var(--md-tooltip-tail)*-1 + .025rem)}.md-tooltip2--active{opacity:1;transform:translateY(0);transition:transform .4s cubic-bezier(0,1,.5,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip2__inner{scrollbar-gutter:stable;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);left:clamp(.8rem,var(--md-tooltip-host-x) - .8rem,100vw - var(--md-tooltip-width) - .8rem);max-height:40vh;max-width:calc(100vw - 1.6rem);position:relative;scrollbar-width:thin}.md-tooltip2__inner::-webkit-scrollbar{height:.2rem;width:.2rem}.md-tooltip2__inner::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-tooltip2__inner::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}[role=tooltip]>.md-tooltip2__inner{font-size:.5rem;font-weight:700;left:clamp(.8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-width)/2,100vw - var(--md-tooltip-width) - .8rem);max-width:min(100vw - 2 * .8rem,400px);padding:.2rem .4rem;-webkit-user-select:none;user-select:none;width:-moz-fit-content;width:fit-content}.md-tooltip2__inner.md-typeset>:first-child{margin-top:0}.md-tooltip2__inner.md-typeset>:last-child{margin-bottom:0}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__alias{margin-left:.3rem;opacity:.7}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}.md-typeset div.arithmatex>*{width:min-content}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset div.arithmatex mjx-assistive-mml{height:0}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem;overflow:hidden}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.md-typeset .lg,.md-typeset .xl,.md-typeset .xxl,.md-typeset .xxxl{vertical-align:text-bottom}.md-typeset .middle{vertical-align:middle}.md-typeset .lg{--md-icon-size:1.5em}.md-typeset .xl{--md-icon-size:2.25em}.md-typeset .xxl{--md-icon-size:3em}.md-typeset .xxxl{--md-icon-size:4em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying]{display:initial}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"โฅ";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"โง";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"โซ";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"โค";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"โช";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"โง";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"โฐ";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"โฆ";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-end:before{content:"โค";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-home:before{content:"โค";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"โฅ";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"โค";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"โ";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.md-typeset .tabbed-labels--linked>label{padding:0}.md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}@media print{.giscus,[id=__comments]{display:none}}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}.md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.md-typeset .grid.cards>ol,.md-typeset .grid.cards>ul{display:contents}.md-typeset .grid.cards>ol>li,.md-typeset .grid.cards>ul>li,.md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.md-typeset .grid.cards>ol>li:focus-within,.md-typeset .grid.cards>ol>li:hover,.md-typeset .grid.cards>ul>li:focus-within,.md-typeset .grid.cards>ul>li:hover,.md-typeset .grid>.card:focus-within,.md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.md-typeset .grid.cards>ol>li>hr,.md-typeset .grid.cards>ul>li>hr,.md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.md-typeset .grid.cards>ol>li>:first-child,.md-typeset .grid.cards>ul>li>:first-child,.md-typeset .grid>.card>:first-child{margin-top:0}.md-typeset .grid.cards>ol>li>:last-child,.md-typeset .grid.cards>ul>li>:last-child,.md-typeset .grid>.card>:last-child{margin-bottom:0}.md-typeset .grid>*,.md-typeset .grid>.admonition,.md-typeset .grid>.highlight>*,.md-typeset .grid>.highlighttable,.md-typeset .grid>.md-typeset details,.md-typeset .grid>details,.md-typeset .grid>pre{margin-bottom:0;margin-top:0}.md-typeset .grid>.highlight>pre:only-child,.md-typeset .grid>.highlight>pre>code,.md-typeset .grid>.highlighttable,.md-typeset .grid>.highlighttable>tbody,.md-typeset .grid>.highlighttable>tbody>tr,.md-typeset .grid>.highlighttable>tbody>tr>.code,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}}
\ No newline at end of file
diff --git a/assets/stylesheets/main.8608ea7d.min.css.map b/assets/stylesheets/main.8608ea7d.min.css.map
new file mode 100644
index 00000000..d21cbb23
--- /dev/null
+++ b/assets/stylesheets/main.8608ea7d.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["src/templates/assets/stylesheets/main/components/_meta.scss","../../../../src/templates/assets/stylesheets/main.scss","src/templates/assets/stylesheets/main/_resets.scss","src/templates/assets/stylesheets/main/_colors.scss","src/templates/assets/stylesheets/main/_icons.scss","src/templates/assets/stylesheets/main/_typeset.scss","src/templates/assets/stylesheets/utilities/_break.scss","src/templates/assets/stylesheets/main/components/_author.scss","src/templates/assets/stylesheets/main/components/_banner.scss","src/templates/assets/stylesheets/main/components/_base.scss","src/templates/assets/stylesheets/main/components/_clipboard.scss","src/templates/assets/stylesheets/main/components/_code.scss","src/templates/assets/stylesheets/main/components/_consent.scss","src/templates/assets/stylesheets/main/components/_content.scss","src/templates/assets/stylesheets/main/components/_dialog.scss","src/templates/assets/stylesheets/main/components/_feedback.scss","src/templates/assets/stylesheets/main/components/_footer.scss","src/templates/assets/stylesheets/main/components/_form.scss","src/templates/assets/stylesheets/main/components/_header.scss","node_modules/material-design-color/material-color.scss","src/templates/assets/stylesheets/main/components/_nav.scss","src/templates/assets/stylesheets/main/components/_pagination.scss","src/templates/assets/stylesheets/main/components/_post.scss","src/templates/assets/stylesheets/main/components/_progress.scss","src/templates/assets/stylesheets/main/components/_search.scss","src/templates/assets/stylesheets/main/components/_select.scss","src/templates/assets/stylesheets/main/components/_sidebar.scss","src/templates/assets/stylesheets/main/components/_source.scss","src/templates/assets/stylesheets/main/components/_status.scss","src/templates/assets/stylesheets/main/components/_tabs.scss","src/templates/assets/stylesheets/main/components/_tag.scss","src/templates/assets/stylesheets/main/components/_tooltip.scss","src/templates/assets/stylesheets/main/components/_tooltip2.scss","src/templates/assets/stylesheets/main/components/_top.scss","src/templates/assets/stylesheets/main/components/_version.scss","src/templates/assets/stylesheets/main/extensions/markdown/_admonition.scss","src/templates/assets/stylesheets/main/extensions/markdown/_footnotes.scss","src/templates/assets/stylesheets/main/extensions/markdown/_toc.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_arithmatex.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_critic.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_details.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_emoji.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_highlight.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_keys.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_tabbed.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_tasklist.scss","src/templates/assets/stylesheets/main/integrations/_giscus.scss","src/templates/assets/stylesheets/main/integrations/_mermaid.scss","src/templates/assets/stylesheets/main/modifiers/_grid.scss","src/templates/assets/stylesheets/main/modifiers/_inline.scss"],"names":[],"mappings":"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AA,8ClCy4GN,CkCr4GI,kFACE,alCu4GN,CkC55GE,4DACE,oBlC+5GJ,CkC55GI,sFACE,gClC85GN,CkCz5GE,oEACE,0BlC45GJ,CkCz5GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ClC25GN,CkCv5GI,gFACE,alCy5GN,CkC96GE,4DACE,oBlCi7GJ,CkC96GI,sFACE,gClCg7GN,CkC36GE,oEACE,0BlC86GJ,CkC36GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ClC66GN,CkCz6GI,gFACE,alC26GN,CkCh8GE,0DACE,oBlCm8GJ,CkCh8GI,oFACE,gClCk8GN,CkC77GE,kEACE,0BlCg8GJ,CkC77GI,gFACE,wBAlBG,CAmBH,oDAAA,CAAA,4ClC+7GN,CkC37GI,8EACE,alC67GN,CkCl9GE,oDACE,oBlCq9GJ,CkCl9GI,8EACE,gClCo9GN,CkC/8GE,4DACE,0BlCk9GJ,CkC/8GI,0EACE,wBAlBG,CAmBH,iDAAA,CAAA,yClCi9GN,CkC78GI,wEACE,alC+8GN,CkCp+GE,4DACE,oBlCu+GJ,CkCp+GI,sFACE,gClCs+GN,CkCj+GE,oEACE,0BlCo+GJ,CkCj+GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ClCm+GN,CkC/9GI,gFACE,alCi+GN,CkCt/GE,wDACE,oBlCy/GJ,CkCt/GI,kFACE,gClCw/GN,CkCn/GE,gEACE,0BlCs/GJ,CkCn/GI,8EACE,wBAlBG,CAmBH,mDAAA,CAAA,2ClCq/GN,CkCj/GI,4EACE,alCm/GN,CmCvpHA,MACE,qMnC0pHF,CmCjpHE,sBAEE,uCAAA,CADA,gBnCqpHJ,CmCjpHI,mCACE,anCmpHN,CmCppHI,mCACE,cnCmpHN,CmC/oHM,4BACE,sBnCipHR,CmC9oHQ,mCACE,gCnCgpHV,CmC5oHQ,2DACE,SAAA,CAEA,uBAAA,CADA,enC+oHV,CmC1oHQ,yGACE,SAAA,CACA,uBnC4oHV,CmCxoHQ,yCACE,YnC0oHV,CmCnoHE,0BACE,eAAA,CACA,enCqoHJ,CmCloHI,+BACE,oBnCooHN,CmC/nHE,gDACE,YnCioHJ,CmC7nHE,8BAIE,+BA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","file":"main.css"}
\ No newline at end of file
diff --git a/compile_run/index.html b/compile_run/index.html
index de2b0cfb..6a6f14a7 100644
--- a/compile_run/index.html
+++ b/compile_run/index.html
@@ -18,7 +18,7 @@
-
+
@@ -26,7 +26,7 @@
-
+
@@ -896,6 +896,8 @@ Running
python/lib
@@ -904,12 +906,6 @@ Running
run_scripts
.
Just adapt them to your needs!
All the required libraries are already installed on the CSCS machines.
All the required libraries are already installed on the DKRZ machine.
@@ -879,7 +877,7 @@The master branch only contains code which are released versions.
-All commits on the master branch are tagged (git tag -a vX.Y.Z
).
-Only the core development team is allowed to modify the master branch.
The master branch is protected and only the core development team is allowed to modify the master branch. +All tags and releases are based on this branch.
Any new code development should be done in a topic branch. Topic branches are merged back into master by opening a pull request. Code must be peer reviewed by the source code administrator.
-Supporting branches are removed once successfully merged in one of the master branch.
+Supporting branches are removed once successfully merged in the master branch.
Any new EXTPAR code that is accompanied by a new input data file or files should be added with a simultaneous pull request in both this code repository (for the code changes) and in the extpar-input-data repository @@ -885,14 +884,14 @@
Once a developer has finished developing a new feature or bug fix, they should make a
-pull request on the Github repository from their topic branch into the rc-branch.
+pull request on the Github repository from their topic branch into the master-branch.
Then, they should write the following comment into the pull request conversation:
launch jenkins
This will start the automated testing, and the code will be compiled and tested on co2 (ETH) and Levante (DKRZ).
If the tests fail, then the developer should fix the issues and resubmit the testing on Jenkins.
Once all of the tests are passing, then they should notify the source code administrator that the pull
-request is ready for review and merging into the rc-branch.
In case you want to add some additional prints in EXTPAR, please use the logger described below.
@@ -1029,7 +1028,7 @@EXTPAR (External Parameters for Numerical Weather Prediction and Climate Application) is an official software of the COSMO Consortium . It is used to prepare the external parameter data files that are used as input for the COSMO and the ICON model.
The code is written in Fortran 90 and in Python. The Python scripts use CDO (Climate Data Operators) for the most compute-intensive parts. The code is also accelerated in some places with OpenMP parallelization.
Once compiled, the code generates 6 Fortran executables and 9 Python scripts, which can be run simultaneously except for the final extpar_consistency_check.exe, which is used to tie together all the external parameter results into one output file.
Information about the latest changes can be found in the Release Notes on GitHub .
The technical and scientific documentation can be found in the User and Implementation Guide.
"},{"location":"#quick-start","title":"Quick Start","text":""},{"location":"#container","title":"Container","text":"The easiest way to use EXTPAR is through the container provided with Dockerfile . A ready-to-use image can be downloaded from C2SM docker hub or even simpler via CLI:
docker pull c2sm/extpar:tagname\n
Alternatively, an image is provided as an asset of each release
"},{"location":"#wrapextpar","title":"WrapExtpar","text":"The image provides a wrapper that only requires to set basic options, all other details are handled by the wrapper.
The wrapper needs two different kinds of input:
1. EXTPAR settings as JSON, see official docs
{\n \"extpar\": {\n \"igrid_type\": 1,\n \"iaot_type\": 1,\n \"ilu_type\": 1,\n \"ialb_type\": 1,\n \"isoil_type\": 1,\n \"itopo_type\": 1,\n \"lsgls\": false,\n \"lfilter_oro\": false,\n \"lurban\": false\n }\n}\n
2. Execution options
--input-grid INPUT_GRID\n COSMO: Fortran Namelist \"INPUT_COSMO_GRID\", ICON: Icon\n grid file\n --raw-data-path RAW_DATA_PATH\n Path to folder \"linked_data\" of exptar-input-data\n repository\n --run-dir RUN_DIR Folder for running EXTPAR\n --account ACCOUNT Account for slurm job\n --host HOST Host\n --no-batch-job Run jobscript not as batch job\n
An example call could look like
docker run -v /c2sm-data/extpar-input-data:/data \\\n -v /icon-grids:/grid \\\n -v /my_local_dir:/work \\\n extpar \\ \n python3 -m extpar.WrapExtpar \\\n --run-dir /work \\\n --raw-data-path /data/linked_data \\\n --account none \\\n --no-batch-job \\\n --host docker \\\n --input-grid /grid/icon_grid.nc \\\n --extpar-config /work/config.json\n
Below is a more detailed explanation about the mounted volumes:
-v /c2sm-data/extpar-input-data:/data
: Mounts the input data at /data
inside the container. This should be aligned with the --raw-data-path
argument.-v /icon-grids:/grid
: Mounts a local folder with icon grids under /grid
inside the container. This should be aligned with the --input-grid
argument.-v /my_local_dir:/work
: Mounts a local folder for EXTPAR output at /work
inside the container. This should be aligned with the --run-dir
argument.For those who require a more custom setup of EXTPAR or need settings that are not possible to specify through the wrapper, you can run each executable within the image too. For example:
docker run extpar bash -c \"extpar_topo_to_buffer\"\n
"},{"location":"#bare-metal-build-on-levante","title":"Bare Metal Build on Levante","text":"The installation steps are
git clone --recursive git@github.com:C2SM/extpar.git\ncd extpar\ngit submodule update\n./configure.levante.gcc\nsource modules.env\nmake -j 4\n
Furthermore copy all the .exe
and .py
files from bin
to the directory in which the namelist and all required input-data is present.
You do then have two choices to run EXTPAR:
PYTHONPATH
variable such that it includes to the python/lib
folder of the source repositoryAfter you prepared EXTPAR (see above), you have two options to install and run the software.
"},{"location":"#option-1-pythonpath","title":"Option 1: PYTHONPATH","text":"If you like to run the EXTPAR scripts without installing a package, make sure to have the python/lib
folder in your PYTHONPATH
variable. You can do this via
export PYTHONPATH=$PYTHONPATH:$(pwd)/python/lib\n
Afterwards you can cd
into the bin/
directory and run the corresponding executables, e.g.
cd bin\n./extpar_aot_to_buffer.exe\n
For more detailed compilation instructions see: compile_run
"},{"location":"#option-2-build-and-install-a-python-package","title":"Option 2: Build and install a python package","text":"Alternatively you can build a python package and install it to your libraries. This has the advantages that the executables can be ran from anywhere in the system without the need to copy the executables themselves.
To build the package, now run
python setup.py sdist\n
You can then install it via
pip install dist/extpar-*.tar.gz\n
Note
If you do not have the permissions to install it into the system-wide python library, it will be installed for your user account only (you can also add the --user
flag to pip
to force this behaviour).
If you did not install extpar
into the system libraries, make sure that the bin
folder of your local user is on your PATH
variable to be able to run the EXTPAR scripts. This is usually done via
export PATH=\"$HOME/.local/bin:$PATH\"\n
You can then call the functionalities of WrapExtpar.py
via
python -m extpar.WrapExtpar\n
or import the script in Python via
from extpar.WrapExtpar import generate_external_parameters\n
Or you call the executable scripts in your run directory, e.g.
extpar_aot_to_buffer.exe\n
"},{"location":"#input-data","title":"Input Data","text":""},{"location":"#data-location","title":"Data Location","text":"In order to run EXTPAR, input data files for the external parameter variables are needed. The data is provided on all supported machines:
Levante (DKRZ)co2 (ETHZ)/work/pd1167/extpar-input-data/linked_data\n
/c2sm-data/extpar-input-data\n
The input data files are also stored in a git-LFS data repository found at: https://gitlab.dkrz.de/extpar-data/extpar-input-data . Instructions to download or update the input data files can be found in this repository. To gain access to the git-LFS input data repository, contact the EXTPAR source code administrator.
"},{"location":"#testing","title":"Testing","text":"The EXTPAR code comes with a technical testsuite to ensure the accuracy of the results. Weekly tests run for compilers:
For more information about how the testsuite can be run or new test added see testsuite-documentation
"},{"location":"#information-for-developers","title":"Information for Developers","text":"In case you want to contribute to EXTPAR please have a look at our coding rules and development workflow.
"},{"location":"#support","title":"Support","text":"In the case of issues or questions, please create an issue on GitHub .
"},{"location":"SUMMARY/","title":"SUMMARY","text":"Since Version 5.4, EXTPAR is built with an autotools based build-system. This has been necessary to accomodate for the additional C source code files and newly required libraries.
There are three options to compile Extpar:
"},{"location":"compile_run/#in-source-build","title":"In-source build","text":"./configure.<hostname>.<compiler>\nsource modules.env \nmake \n
"},{"location":"compile_run/#out-of-source-build","title":"Out-of-source build","text":"mkdir build-<my_self_defined_note>\ncd build-<my_self_defined_note>\npath/to/extpar/installation/configure.<hostname>.<compiler>\nsource modules.env \nmake \n
"},{"location":"compile_run/#install-binaries-only-in-external-directory","title":"Install binaries only in external directory","text":"./configure.<hostname>.<compiler> --prefix=<my_external_directory>\nsource modules.env \nmake install \n
The binaries will be installed in my_external_directory/bin
.
make distclean \n
"},{"location":"compile_run/#configure-for-new-machines","title":"Configure for new machines","text":"The first step in creating a new machine setup is to take one of the existing configure wrapper scripts and adapt it to your local environment. The scripts are called configure.<hostname>.<compiler>
.
The Fortran executables
can simply be copied to the run/
directory.
The main python scripts
can be treated like the Fortran binaries and copied to the run/
directory. Make sure the namelist.py is also present in the run/
directory.
All self-written Python modules are stored in python/lib
and do not need to be copied to the respective run directory, but the environment variable PYTHONPATH
needs to be set to the following:
export PYTHONPATH=$PYTHONPATH:<absolute_path_to_python>/lib\n
Some runscript examples are available under run_scripts
. Just adapt them to your needs!
EXTPAR contains Fortran Code as well as hybrid Python-CDO scripts. Both code bases need external libraries and installations.
"},{"location":"dependencies/#libraries","title":"Libraries","text":""},{"location":"dependencies/#fortran","title":"Fortran","text":"EXTPAR needs the following libraries for the Fortran-Code:
EXTPAR needs the following Python packages and installations:
The module netCDF is the Python interface to the netCDF C library. It allows the user create and manipulate netCDF files with Python. For more detailed information please visit netCDF Python .
Additionally, an installation of CDO (Climate Data Operators) is required. All necessary information about this tool can be found at CDO-MPI.
Be sure that these libraries are installed on your system or install them yourself by following the installation instructions provided with the libraries.
"},{"location":"dependencies/#on-the-cscs-machines","title":"On the CSCS machines","text":"All the required libraries are already installed on the CSCS machines.
"},{"location":"dependencies/#on-the-dkrz-machine-levante","title":"On the DKRZ machine Levante","text":"All the required libraries are already installed on the DKRZ machine.
"},{"location":"development/","title":"Information for EXTPAR Developers","text":""},{"location":"development/#git-and-github","title":"Git and Github","text":"The EXTPAR code is developed using the Git version control system and the Github web interface . Outstanding bugs and requested features are tracked using the Issues section of the Github repository. Additionally, automated testing of newly developed features is integrated into the Github interface using the Jenkins CI tool.
"},{"location":"development/#main-branches","title":"Main branches","text":"The master branch only contains code which are released versions. All commits on the master branch are tagged (git tag -a vX.Y.Z
). Only the core development team is allowed to modify the master branch.
Any new code development should be done in a topic branch. Topic branches are merged back into master by opening a pull request. Code must be peer reviewed by the source code administrator.
Supporting branches are removed once successfully merged in one of the master branch.
"},{"location":"development/#developments-with-new-input-data-sets","title":"Developments with new input data sets","text":"Any new EXTPAR code that is accompanied by a new input data file or files should be added with a simultaneous pull request in both this code repository (for the code changes) and in the extpar-input-data repository (for the addition of the input data files). The topic branch for both pull requests should have the same name, in order to enable the synchronization of the code and input-data repositories.
"},{"location":"development/#testing-new-developments","title":"Testing new developments","text":"Once a developer has finished developing a new feature or bug fix, they should make a pull request on the Github repository from their topic branch into the rc-branch. Then, they should write the following comment into the pull request conversation:
launch jenkins\n
This will start the automated testing, and the code will be compiled and tested on co2 (ETH) and Levante (DKRZ).
If the tests fail, then the developer should fix the issues and resubmit the testing on Jenkins. Once all of the tests are passing, then they should notify the source code administrator that the pull request is ready for review and merging into the rc-branch.
"},{"location":"development/#fortran-code","title":"Fortran Code","text":""},{"location":"development/#logging","title":"Logging","text":"In case you want to add some additional prints in EXTPAR, please use the logger described below.
CALL the built-in logger-functions in order to print messages or variables in the specific logfile of each EXTPAR executable. The logger has three different levels of messages to print:
logging%info(your_message)
: info-prints for better orientation during code execution, variables or other stuff.
logging%warning(your_message)
: warnings, like wrong namelist-inputs, unsupported NetCDF versions or problems with some data points.
logging%error(your_message, __FILE__,__LINE__)
: errors that occur during I/O, allocation, that requires an abort of EXTPAR.
As your_message needs to be a sequence of characters, use
WRITE(message_text,*)var_x, 'is now', var_y\n
and then
CALL logging%inf0(message_text) \n
to print the values of var_x
and var_y
to the logfile.
For quick debugging-prints ONLY use
WRITE(logging%fileunit,*)var_x, 'is now', var_y \n
"},{"location":"development/#coding-rules-and-best-practices","title":"Coding Rules and Best Practices","text":"All features available in Fortran 2008 as far as supported by Intel, GCC, and NAG are allowed.
Use up to the allowed 132 character per line, but not more. Note that this includes comments.
Indentation rules:
Code feature Num. of indentation characters program indentation 2 type definition 2 do loops 2 if constructs 2 continuation 5 (with leading &) all directives 0Always use IMPLICIT NONE
and PRIVATE
/PUBLIC
once only in modules header.
Do not add USE
statements after CONTAINS
.
Fortran keywords should be in capital letters with the exception of len
, in
, out
, and inout
.
Do not use tabs, deprecated, or obsolete features.
Do not overspecify declarations - especially if standard types are expected.
In case you want to add some additional prints in EXTPAR, please use the logger described below.
CALL the built-in logger-functions in order to print messages or variables in the specific logfile of each EXTPAR executable. The logger can print variables as well as strings. Use formatted strings (f'
) in case you want to combine variables and strings. The logger has 4 different levels of messages to print:
logging.debug(your_message)
: Mean/Max/Min of variables needed for development, more detailed information about code execution.
logging.info(your_message)
: info-prints for better orientation during code execution, variables or other stuff.
logging.warning(your_message)
: warnings, like wrong namelist-inputs, unsupported NetCDF versions or problems with some data points.
logging.error(your_message)
: errors that occur during I/O, allocation or wrong namelist parameters, that requires an abort of EXTPAR. The programm does not stop automatically after the call of logging.error, so a raise
follows the logging.error()
Default logging level is info, so only messages from logging.info()
, logging.warning()
and logging.error()
are written to the logfile. Adjust the level of the logger right at the beginning of each Python executable to level=logging.DEBUG
to also print logging.debug()
.
The Python code needs to fulfill the Pep8 coding standard . A GitHub action automatically formats Python code for you.
"},{"location":"release_notes/","title":"Release notes","text":"For the latest release notes, please see our GitHub webpage .
"},{"location":"release_notes/#514","title":"5.14","text":"extpar_cdnc_to_buffer
for ICONextpar_edgar_to_buffer
for ICONi_landuse_data=6
in INPUT_LU
l_terra_urb=.true.
in INPUT_LU
to process additional urban fieldsECOCLIMAP_SG.nc
extpar_hwsdART_to_buffer
INPUT_hwsdART
defines key parametersWrapExtpar.py -h
for more infosraise
instead of sys.exit(1)
to abort scriptsThis is a minor release to fix cdo version on Levante * CDO-version fixed to 2.0.5 because later versions exit with non-zero exit status for cdo -V
This is a minor release with fixes for Levante at DKRZ, a cleanup of MCH runscripts and a bugfix for in consistency_check * CDO version change from 1.9.10 to 2.0.5 on Levante at DKRZ - Fields from Python-CDO scripts changed up to 10e-4! - Many (even large) adjustements of the tolerances in the testsuite - Result on other machines remain unchanged * Fix for array out-of-bounds with special points outside of target domain * Abort Extpar in consistency check if compiler not GCC * Cleanup and update runscripts for models run at MeteoSwiss
"},{"location":"release_notes/#591","title":"5.9.1","text":"This is a minor release to support Levante at DKRZ and drop the support for Intel * Support GCC on Levante * Remove configure-wrappers for Mistral * Remove Intel references in testsuite
"},{"location":"release_notes/#59","title":"5.9","text":"This is an intermediate release with OpenMP optimizations, a bugfix for topography and and some cleanup * OpenMP optimizations for domains crossing date-line in the following parts - extpar_landuse_to_buffer - extpar_topo_to_buffer * Update runscripts - ETH domain with Merit topography - EU-Cordex domain with Globe topography * Cleanup - Remove all leftovers from old build-system - Remove output for vertices - Around 10% speedup
This is an intermediate release with changes for the upgrade of Piz Daint, support for Merit topography for COSMO and a revised algorithm for SGSL processing * Daint upgrade - export PMI_NO_PREINITIALIZE=1 to avoid unwanted prints from CDO - New paths for Python virtual environment: - Daint: /project/g110/extpar/venv_daint - Tsa: /project/g110/extpar/venv_tsa * Merit for COSMO - Enable itopo_type=3 for COSMO grid - Testing performed by Christian Steger from Hymet-group at ETH-IAC * Revised algorithm for SGSL preprocessing - Infer values of boundary points for SGSL - Deactivate SGSL for ASTER due to inconsistencies. For detailed information see the PR .
"},{"location":"release_notes/#574","title":"5.7.4","text":"This is a minor release with an adaption in the SSO-computation and replacement of ksh with bash * Revised SSO for ICON - Experiments at DWD showed an improvement of model results with different SSO-thresholds, see this wiki entry for more information. - Lowering of threshold from 10.0 to 1.0 changes the following fields - SSO_GAMMA - SSO_OROMAX - SSO_OROMIN - SSO_SIGMA - SSO_STDH - SSO_THETA - topography_c (only in testcase mpim/icon_r2b4)
This is a minor release with two technical improvements. * Python-CDO - Automatic detection if CDO contains thread-safe HDF5 library * extpar_topo_to_buffer - Reduce memory usage for option lsubstract_mean_slope=.TRUE.
"},{"location":"release_notes/#572","title":"5.7.2","text":"This is a minor release with an update for the Python environment on Mistral and refactored docs. * Python on Mistral - Replace anaconda3/bleeding_edge with python3/unstable * Docs - Remove outdated documentation - Make docs about testsuite and compilation more comprehensive - Quickstart for all supported machines
"},{"location":"release_notes/#571","title":"5.7.1","text":"This is a minor release with two bugfixes, one for the build-system and one for extpar_topo_to_buffer. * Build-system: - Install Python-CDO script in bin-folder directly in Makefile - Out-of-source build include Python-CDO scripts as well * extpar_topo_to_buffer: - Abort Extpar for itopo_type = 3
"},{"location":"release_notes/#57","title":"5.7","text":"This is an intermediate release that introduces two Python-CDO scripts, modifications for reduced memory usage for non-global grids and a bugfix for the CAMS-aersosol dataset. * extpar_isa_to_buffer - Replace Fortran code with Python-CDO - Change in results for fields - Impervous Surface Area (ISA) - Read the users guide for detailed information about details of the implementation of extpar_isa_to_buffer * exptar_ahf_to_buffer - Replace Fortran code with Python-CDO - Change in results for fields - Antropogenic Heat Flux (AHF) - Read the users guide for detailed information about details of the implementation of extpar_ahf_to_buffer * Reduce memory usage for Python-CDO - Automatic determination of the extent of the target grid - Use CDO operator -sellonlat to read subset of input data * Bugfix for CAMS dataset - Remove assertion for GCC-compiler - Fix wrong dimensions in meta-data for the ICON-grid
"},{"location":"release_notes/#56","title":"5.6","text":"This is an intermediate release that introduces a new topography dataset and the CAMS-aerosol climatologies, OpenMP support for CSCS-machines, enhanced testing on CSCS-machines, a script to extract the input-data from namelist, progress bars for logfiles of extpar_topo_to_buffer and consistent names for all logfiles.
This is a minor release that fixes the inconsistent usage of netCDF versions across Extpar and small documentation changes.
This is an intermediate release that brings enhanced namelist parsing for the Python-CDO scripts, a new Python-CDO script extpar_era_to_buffer.py to replace the former way of remapping ERA-climatologies using Icontools, a more sophisticated tolerance checker to allow specific roundoff for each test and variables, support NetCDF5 and new default NetCDF 4, fixes for high-resolution grid exceeding integer value range and some minor bugfixes for Piz Daint related to HDF5. * exptar_era_to_buffer - 4 fields processed - Sea surface temperature (T_SEA) - 2m land temperature (T_2M_CLIM) - Geometric height (TOPO_CLIM) - Snow water equivalent (W_SNOW) - New namelist-parameter iera_type defines type of ERA input data used, either ERA-I or ERA-5 - extpar_consistency_check checks for namelist INPUT_ERA to determine if ERA-climatologies come from Python-CDO or Icontools - Using extpar_era_to_buffer.py changes fields, a detailed review of changes was performed by J\u00fcrgen Helmert from DWD - W_SNOW - TOPO_CLIM - T_SEA - T_2M_CLIM - Read the users guide for detailed information about how extpar_era_to_buffer is integrated into the existing workflow * Enhanced namelist parsing for Python-CDO - Line starting with ! ignored as expected from Fortran code * Bugfixes for Piz Daint - -L option for all CDO commands - Disbable HDF5 file locking due to problems reading some input data * Improved tolerance testing in testsuite - Tolerances can now be defined separate for each test and variable for example in tolerance file * Support for NetCDF 5 - NetCDF 4 replaces netCDF 3 as default - Value of environment variable NETCDF_OUTPUT_FILETYPE sets version: NETCDF3, NETCDF4 or NETCDF5 * Modified netCDF-interface functions to allow write of fields with dimesions exceeding default integer value range
"},{"location":"release_notes/#541","title":"5.4.1","text":"This is an intermediate release that brings two lradtopo-parameters for Icon, better user feedback for the shell-commands launched in the Python-scripts, a bugfix in exptar_albedo_to_buffer.py, a configure script for O3 (ETHZ) and small technical improvements to the Code. * HORIZON and SKYVIEW fields for the Icon grid - 4 new namelist-parameter - radius -> defines the considered horizontal distance for the HORIZON field - min_circ_cov -> defines the level of detail of the search-algorithm for performance reasons - max_missing -> defines upper treshold for the allowed missingness at the boundary of the domain - itype_scaling -> choose the type of scaling for SKYVIEW to account for anisotropic behaviour of IR-radiation - Read the users guide for detailed information about the difference between the COSMO and the ICON implementation
This is a major release that introduces a rewrite of 4 Extpar programmes in Python, a common git-LFS input data repository, a new build-system, 2 additional landuse data sets, CDI-library for icon grids in consistency check, mmap-caching for consistency check for less memory usage, some small improvements in the Fortran code and some minor changes in the testsuite.
Support of the old and coarse data (it_cl_type = 2) in extpar_cru_to_buffer expires and is replaced the following:
Read the users guide for detailed information about the rewritten programmes.
git-LFS input data repository
4 basic steps to compile Extpar into binaries:
Corine landuse data
The corine landuse data set is only tested on Mistral at DKRZ
ECCI landuse data
The ECCI landuse data is only tested on Mistral at DKRZ
Enhanced testsuite
Copy all required files from namelistdir (icon grids, clim-fields and Python-files) through testsuite itself
CDI library for icon grids
See compile_run for instructions to clone Extpar from GitHub correctly
Mmap-caching
Only supported and tested for GCC compiler
Fortran Code changes
This is an intermediate release that reduces code complexity for topo_to_buffer.exe, enhances the testing for INTEL compiler and further cleans the code
The functionality is kept by default for all newly introduced namelist parameters, so for the same workflows as before only change lcompute_sgsl
Testsuite
Add references for INTEL in a seperate directory in data
Cleanup
This is a minor release containing a bug fix and a small feature addition. * Bug fix for ICON/COSMO file- and variable name mismatch in topography calculation * Add Extpar version number (pulled from git release number) to output NetCDF file
"},{"location":"release_notes/#52","title":"5.2","text":"This is an intermediate release introducing extpar_emiss_to_buffer, an improved logging, enhanced error checking during I/O and a lot of clean-up and formatting
Two raw datasets available (full range and only long-wave radiation)
Consistent logger for all Extpar executables
Each Extpar executable write to its own logfile
Clean-up and formatting of all src-files
Implement formatting according the coding-guidelines for Extpar
Make all precisions consistent
Change all REAL to REAL(KIND=wp), wp is defined in mo_kind
Small changes in some fields due to fix of implicit type conversion during runtime
DEPTH_LK, max difference ~10^(-6)
Enhanced error checking during I/O
This is a minor release containing a few bug fixes. * Fix build environment on Kesch * Add missing definition of skinc_lu meta data when ECOCLIMAP dataset is chosen.
"},{"location":"release_notes/#511_1","title":"5.1.1","text":"This is a minor release containing a few bug fixes. * Fix read of l_use_glcc landuse calculation for COSMO runs. * Fix unitialized logical flag to trigger scale separation in topography calculation. * Reactivate all cosmo tests from testsuite on Kesch.
"},{"location":"release_notes/#51","title":"5.1","text":"This is an intermediate release containing some bug fixes and some minor developments.
Fix NAG compiler setup so that only compilation, not testing is done, because testing is too time consuming.
Bug fix for iaot_type = 4 (MACv2 aerosols). The code had not been correctly imported from version 4.0.
Contributions from DWD including:
DWD bug fix for incorrect glacier points
New output variable skin conductivity (SKC) developed by Jan-Peter Schulz. Skin conductivity is calculated from the landuse data.
This is a minor release containing a few bug fixes.
Bug fix for problems when soil_type=3 is used. The code had not been correctly imported from version 4.0
Bug fix adding missing NetCDF get_varid call when more than one GLOBCOVER tile is used.
This is a minor release containing a bug fix.
This is a minor release containing a bug fix.
This is a minor release fixing a few bugs and some documentation.
This release represents a merge of the Extpar official version 4.0 code with the DWD-Extpar version 2.10.
"},{"location":"release_notes/#build-mechanism","title":"Build Mechanism","text":"Due to the large amount of changes in the code in this release, there are many differences in the resulting external parameter fields generated by the release 5.0 code compared to the fields generated by older Extpar codes. The only code change in this release that deliberately changed the results was the addition of a lower limit for roughness length, which is 1e-6. Otherwise, any changes in results that can be seen came directly from bug fixes to the code, and as such most of them are small and are not expected to change results in the COSMO or ICON model runs. Some of these changes in results are examined in the next two sections.
"},{"location":"release_notes/#extpar-version-40-to-extpar-version-50","title":"Extpar version 4.0 to Extpar version 5.0","text":"The technical testsuite in Extpar was used to compare the external parameter fields from Version 4.0 and Version 5.0 for three different MeteoSwiss operational setups for COSMO and a climate setup for COSMO-CLM.
"},{"location":"release_notes/#cosmo-7-globe-topography-input","title":"COSMO 7, globe topography input","text":"For the COSMO7 MCH setup using the globe topography data set, changes in the results smaller than 1e-6 can be seen for several variables, including the aerosol variables, albedo variables, HORIZON, and SSO_SIGMA. Larger changes on the order of 3 degrees can be seen in the SSO_THETA variable; these are due to a bug fix in this release, and are expected. Finally, roughness length is different as well due to the introduction of the lower limit value of 1e-6.
"},{"location":"release_notes/#cosmo-7-aster-topography-input","title":"COSMO 7, aster topography input","text":"For the COSMO7 MCH setup using the aster topography data set, the changes in the results are less than 5e-7, and occur in the aerosol, HORIZON, and SSO_SIGMA variables.
"},{"location":"release_notes/#cosmo-1-aster-topography-input","title":"COSMO 1, aster topography input","text":"For the COSMO1 MCH setup using the aster topography data set, the changes in the results are less than 4e-5, and occur in the aerosol, HORIZON, SKYVIEW, and T_CL variables.
"},{"location":"release_notes/#cosmo-cm-climate-setup","title":"COSMO-CM climate setup","text":"For the COSMO-CLM climate setup using the globe topography data set, changes in results smaller than 3e-8 can be seen in the SSO_SIGMA and SSO_STDH variables. Larger changes on the order of 3 degrees can be seen in the SSO_THETA variable; these are due to a bug fix in this release, and are expected. Due to another bug fix, the ALB_SAT and ALB_DRY variables have changed results on the order of .2. Finally, roughness length is different as well due to the introduction of the lower limit value of 1e-6.
"},{"location":"release_notes/#dwd-extpar-version-210-to-extpar-version-50","title":"DWD Extpar version 2.10 to Extpar version 5.0","text":"Comparisons of the COSMO D2 setup used operationally by DWD were carried out to compare the current operational Extpar code (DWD version 2.10) with the new release 5.0. This comparison showed no significant differences in the generated external parameter fields. Get more details of this comparison here
"},{"location":"testing/","title":"Testing","text":"EXTPAR is tested with an adapted version of the COSMO technical testsuite .
"},{"location":"testing/#run-tests","title":"Run Tests","text":"First step is to compile the code following the instructions in Compile and Run.
"},{"location":"testing/#docker","title":"Docker","text":"docker run extpar bash -c \"/workspace/test/jenkins/test_docker.sh\"\n
"},{"location":"testing/#levante","title":"Levante","text":"cp bin/* test/testsuite/bin/.\ncd test/testsuite\n./data/get_data.sh\nsbatch submit.levante.sh\n
The results of the testsuite can be found in file testsuite.out
An example output could look as follows:
"},{"location":"testing/#testlists","title":"Testlists","text":"There are many different testlist, each containing a set of tests for different setups, compiler or models:
"},{"location":"testing/#gcc","title":"GCC","text":"It is possible to define an optional tolerance threshold for each test and each field. To allow deviations for the test icon_d2 for example, just dit the the tolerances file .
The syntax is as follows:
PARAMETER, abs_diff\nNDVI, 9.0e-08\nW_SNOW, 5.0e-05\n
"},{"location":"testing/#add-a-new-test","title":"Add a New Test","text":"Modify the testlist.xml
file to add the new test. Alternatively, you could also add a new testlist XML file (with a new name). The testlist which is run can be chosen from the testsuite command line.
Make a folder in the data folder for the new test containing the INPUT_*
files and the namelist.py for the Python-CDO modules.
Send any binary reference files to upload to the ftp site to the source code administrator.
Hermann Asensio / Martina Messmer / Daniel L\u00fcthi / Katie Osterried / Jonas Jucker / Jacopo Canton / Philipp Sommer / J\u00fcrgen Helmert / Michael J\u00e4hn
This documentation provides an overall description of the EXTPAR software, provides detailed information on specific modules, current limitations and the namelist input.
For the sake of completeness, the latest EXTPAR documentation (v5.14) that was created from the original LaTeX file, can be downloaded here.
"},{"location":"user_manual/SUMMARY/","title":"SUMMARY","text":"Numerical Weather Prediction (NWP) models and Climate models require geographical localized datasets like the topographic height of the earth surface, the plant cover, the distribution of land and sea and, dependent on the schemes used, a variety of other external parameters.
The EXTPAR software system (EXTPAR - External Parameter for Numerical Weather Prediction and Climate Application) is able to generate external parameters for the different models COSMO and ICON. The software can run on a UNIX or Linux system where the raw data is stored. It allows operators (experienced users) running the scripts to create new external parameters controlled by user specifications like the model domain.
The following steps are performed for the generation of external parameters:
The target grid has to be specified. The supported target grids are
The different raw data sets are aggregated to the target grid considering all raw data elements which are within the target grid element. If the target grid has a higher resolution than the input grid on which the raw data is available either an interpolation is performed or the target grid is filled with the nearest neighbor, but sub-grid scale statistical calculations (e.g. subgrid scale variance of orograhic height) are dismissed.
All the different external parameter sets have to be checked for consistency against each other. In case of conflicts default values are set automatically. In the NetCDF output, information on the input data and the processing software is given.
The information for the external parameters is aggregated from various raw datasets for land use data, orography or soil data, see table below for a detailed list of the raw datasets.
The input data for EXTPAR is stored in a git-LFS repository at https://gitlab.dkrz.de/extpar-data/extpar-input-data . Instructions for downloading the whole repository or updating with new datasets can be found in the git-LFS repository. For access to the input data repository, contact the current EXTPAR source code administrator.
Dataset Source Resolution GLOBE orography NOAA/NGDC 30'' ASTER orography (limited domain: 60\u00b0N - 60\u00b0S) METI/NASA 1'' MERIT/REMA orography Composite DEM 3'' (90m) Globcover 2009 ESA 10'' GLC2000 land use JRC Ispra 30'' GLCC land use USGS 30'' Ecoclimap-SG land use CNRS and Meteo France 300m ESA CCI-LC ESA 10'' DSMW Digital Soil Map of the World FAO 5' HWSD Harmonized World Soil Database FAO/IIASA/ISRIC/ISSCAS/JRC 30'' HWSD Harmonized World Soil Database USDA KIT 30'' NDVI Climatology, SEAWiFS NASA/GSFC 2.5' CRU near surface climatology CRU University of East Anglia 0.5 degree Aerosol Optical thickness NASA/GISS 4x5 degree (Global Aerosol Climatology Project) AeroCom Global AOD data AeroCom Project 1 degree MACC-II climatological AOD (2003-2012) ECMWF 1.125 degree MACv2 monthly AOD, SSA and ASY data MPI, RHM 1 degree CAMS monthly 3D-climatology 11 types of aerosols ECMWF, RHM 3 degree Global lake database (GLDB) DWD/RSHU/MeteoFrance 30'' MODIS albedo NASA 5' MODIS derived soil albedo values Community Land Model 3.5 30' CAMEL Emissivity NASA 5km EDGAR Emissions European Commission /JRC/PBL 0.1 degree MODIS cloud droplet number climatology Q06 NASA 1 degreeTable 1: Input raw datasets
"},{"location":"user_manual/user_manual_01_overall_description/#main_output","title":"Output External Parameters","text":"The output fields with the external parameters are shown here:
External parameter Short name Unit Raw dataset geometrical height HSURF \\(m\\) GLOBE/ASTER/MERIT/REMA geopotential of earth surface FIS \\(m^{2} s^{-1}\\) GLOBE/ASTER/MERIT/REMA standard deviation of subgrid scale orographic height SSO_STDH \\(m\\) GLOBE/ASTER/MERIT/REMA anisotropy of topography SSO_GAMMA 1 GLOBE/ASTER/MERIT/REMA angle between principal axis of orography and global E SSO_THETA 1 GLOBE/ASTER/MERIT/REMA mean slope of subgrid scale orography SSO_SIGMA 1 GLOBE/ASTER/MERIT/REMA surface roughness Z0 \\(m\\) GLC2000, GLOBE/ASTER/MERIT/REMA Slope aspect SLOPE_ASP deg GLOBE/ASTER/MERIT/REMA Slope angle SLOPE_ANG deg GLOBE/ASTER/MERIT/REMA Horizon angles (resolution from 15deg) HORIZON deg GLOBE/ASTER/MERIT/REMA Skyview factor SKYVIEW - GLOBE/ASTER/MERIT/REMA soil texture SOILTYP - DSMW/HWSD fraction of sand FR_SAND % HWSD fraction of silt FR_SILT % HWSD fraction of clay FR_CLAY % HWSD fraction of organic carbon FR_OC % HWSD bulk density BULK_DENS \\(g cm^{-3}\\) HWSD deep soil texture SUBSOILTYP - HWSD deep soil fraction of sand SUB_FR_SAND % HWSD deep soil fraction of silt SUB_FR_SILT % HWSD deep soil fraction of clay SUB_FR_CLAY % HWSD deep soil fraction of organic carbon SUB_FR_OC % HWSD deep soil bulk density SUB_BULK_DENS \\(g cm^{-3}\\) HWSD Fraction of Heavy Clay fr_hcla 1 HWSD_USDA Fraction of Silty Clay fr_silc 1 HWSD_USDA Fraction of Light Clay fr_lcla 1 HWSD_USDA Fraction of Silty Clay Loam fr_sicl 1 HWSD_USDA Fraction of Clay Loam fr_cloa 1 HWSD_USDA Fraction of Silt fr_silt 1 HWSD_USDA Fraction of Silty Loam fr_silo 1 HWSD_USDA Fraction of Sandy Clay fr_scla 1 HWSD_USDA Fraction of Loam fr_loam 1 HWSD_USDA Fraction of Sandy Clay Loam fr_sclo 1 HWSD_USDA Fraction of Sandy Loam fr_sloa 1 HWSD_USDA Fraction of Loamy Sand fr_lsan 1 HWSD_USDA Fraction of Sand fr_sand 1 HWSD_USDA Fraction of Undefined or Water fr_udef 1 HWSD_USDA ground fraction covered by plants max (vegetation period) PLCOV_MX 1 GLC2000/Globcover/ ESA CCI-LC ground fraction covered by plants min (vegetation period) PLCOV_MN 1 GLC2000/Globcover/ ESA CCI-LC ground fraction covered by artificial (urban) areas URBAN 1 GLC2000/Globcover/ ESA CCI-LC ground fraction covered by artificial (urban) areas URBAN 1 GLC2000/Globcover/ESA CCI-LC/ LCZs with TERRA_URB ground fraction covered by deciduous forest FOR_D 1 GLC2000/Globcover/ ESA CCI-LC skin conductivity SKC \\(W m^{-1} K^{-1}\\) Globcover/ESA CCI-LC root depth ROOTDP \\(m\\) GLC2000/Globcover/ ESA CCI-LC leaf area index max(vegetation period) LAI_MX 1 GLC2000/Globcover/ESA CCI-LC leaf area index min (vegetation period) LAI_MN 1 GLC2000/Globcover/ ESA CCI-LC plant resistance PRS_MIN \\(s m^{-1}\\) GLC2000/Globcover/ ESA CCI-LC long wave surface emissivity EMISS_RAD 1 GLC2000/Globcover/ ESA CCI-LC (monthly) normalized differential vegetation index NDVI 1 SEAWIFS Annual maximum of normalized differential vegetation index NDVI_MAX 1 SEAWIFS (monthly) proportion of actual value/ maximum normalized differential vegetation index NDVI_RATIO 1 SEAWIFS (monthly) optical thickness from black carbon aerosol AER_BC 1 GACP (monthly) optical thickness from dust aerosol AER_DUST 1 GACP (monthly) optical thickness from organic aerosol AER_ORG 1 GACP (monthly) optical thickness from SO4 aerosol AER_SO4 1 GACP (monthly) optical thickness from sea salt aerosol AER_SS 1 GACP (monthly) aerosol optical thickness for RG92 spectral bands AOT12 1 MACv2 (monthly) single scattering albedo for RG92 spectral bands SSA12 1 MACv2 (monthly) asymmetry factor for RG92 spectral bands ASY12 1 MACv2 (monthly) layer-integrated mass of Sea Salt with dry radius in the range 0.03-0.5 microns Sea_Salt_bin1 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Sea Salt with dry radius in the range 0.5-5.0 microns Sea_Salt_bin2 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Sea Salt with dry radius in the range 5.0-20.0 microns Sea_Salt_bin3 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Mineral Dust with dry radius in the range 0.03-0.55 microns Mineral_Dust_bin1 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Mineral Dust with dry radius in the range 0.55-0.9 microns Mineral_Dust_bin2 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Mineral Dust with dry radius in the range 0.9-20.0 microns Mineral_Dust_bin3 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of hydrophilic Organic Matter Organic_Matter_hydrophilic \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of hydrophobic Organic Matter Organic_Matter_hydrophobic \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of hydrophilic Black Carbon Black_Carbon_hydrophilic \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of hydrophobic Black Carbon Black_Carbon_hydrophobic \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Sulfates Sulfates \\(kg m^{-2}\\) CAMS (monthly) Pressure at base of layer half_level_pressure Pa CAMS Near surface temperature (climatological mean) T_2M_CL \\(K\\) CRU Lake Depth DEPTH_LK \\(m\\) GLDB Lake Fraction FR_LAKE 1 GLDB (monthly) albedo ALB_DIF12 % MODIS (monthly) Near Infrared Albedo ALNID % MODIS (monthly) Ultra Violet Albedo ALUVD % MODIS soil albedo for dry soils ALB_DRY % Community Land Model 3.5 soil albedo for saturated soils ALB_SAT % Community Land Model 3.5 fraction of impervious surface area ISA 1 NOAA, EEA or LCZs with TERRA_URB anthropogenic heat flux AHF \\(W m^{-2}\\) NOAA or LCZs with TERRA_URB subgrid-scale slope parameter S_ORO 1 GLOBE, ASTER, MERIT/REMA EMISS yearly maximum for climatology 1998-2003 EMISS_MAX 1 CAMEL monthly mean EMISS climatology 1998-2003 EMISS 1 CAMEL (monthly) proportion of actual value/maximum normalized differential vegetation index EMISS_MRAT 1 CAMEL Urban paved fraction FR_PAVED 1 LCZs with TERRA_URB Urban building fraction URB_BLDFR 1 LCZs with TERRA_URB Urban building height URB_BLDH \\(m\\) LCZs with TERRA_URB Urban canyon height-to-width ratio URB_H2W 1 LCZs with TERRA_URB Urban shortwave albedo URB_SALB 1 LCZs with TERRA_URB Urban thermal albedo URB_TALB 1 LCZs with TERRA_URB Urban emissivity URB_EMIS 1 LCZs with TERRA_URB Urban heat conductivity URB_HCON 1 LCZs with TERRA_URB Urban heat capacity URB_HCAP \\(J/K\\) LCZs with TERRA_URB Annual black carbon emissions emi_bc \\(kg\\,m^{-2}\\,s^{-1}\\) EDGAR Annual organic carbon emissions emi_oc \\(kg\\,m^{-2}\\,s^{-1}\\) EDGAR Annual sulfur dioxide carbon emissions emi_so2 \\(kg\\,m^{-2}\\,s^{-1}\\) EDGAR Annual ammonia emissions emi_nh3 \\(kg\\,m^{-2}\\,s^{-1}\\) EDGAR Annual nitrogen oxides emissions emi_nox \\(kg\\,m^{-2}\\,s^{-1}\\) EDGAR Monthly cloud droplet number climatology cdnc \\(cm^{-3}\\) MODISTable 2: Output external parameters
"},{"location":"user_manual/user_manual_02_software_modules/","title":"Software Modules","text":""},{"location":"user_manual/user_manual_02_software_modules/#Overview","title":"Overview","text":"The software EXTPAR is composed of thirteen autonomous programmes. Twelve programmes are responsible for aggregating a raw data to the target grid, which is specified by the user. The thirteenth program, the consistency check, is performed in the end. The executables are called extpar_*_to_buffer
, whereas the star *
stands for ahf (anthropogenic heat flux), aot (aerosol optical thickness), cru (temperature climatology of the Climate Research Unit (CRU)), landuse, topo, ndvi (normalized difference vegetation index), soil, flake (fraction lake), isa (impervious surface area), albedo, emiss (emissivity) and era (ERA climatologies) respectively. In Fig. 1 a schematic representation of EXTPAR is drawn. For the sake of clarity only the topography and land-use path is shown. The same can be applied for the other ten raw data sets. For all these programs there exist namelists. Most of the namelists only contain the name and path of the raw data file and the name of the buffer file, which is later used for the consistency check, and the name of the output of the final external variables.
The software modules read from the following namelist files:
The namelists INPUT_grid_org
and either INPUT_COSMO_GRID
or INPUT_ICON_GRID
are used in all the programs, as they contain the general information of the target grid to which the raw data should be aggregated. The namelist file namelist.py
is read by all Python programmes.
Figure 1: Schematic illustration of the software EXTPAR.
"},{"location":"user_manual/user_manual_02_software_modules/#Python-CDO","title":"Hybrid Python-CDO Structure","text":"For three of the external parameters calculated by EXTPAR, namely albedo, NDVI, and the Hadley CRU climatologies, problems appeared with target resolutions much higher than the provided input data set resolutions. The problem is that not all target grid points get assigned a proper value when using the legacy Fortan code and interpolation method.
The algorithm used in the legacy Fortran modules aggregates source grid point values onto the target grid where the input data is finer than the target grid and uses bi-linear interpolation to fill the remaining grid points where the input data is sparser than the target grid. However, starting from a 5 km global resolution for the target grid, points can potentially get assigned unreasonable values because of the insufficiency of the bi-linear interpolation algorithm.
To resolve this issue, for EXTPAR Version 5.4 a rewrite of those Fortran modules in Python, using the more sophisticated interpolation methods from CDO with support for all grids was conducted. Because the interpolation methods implemented in CDO are faster than those in Fortran for large model grids, emiss_to_buffer is written in Python as well. A rewrite in Python only makes sense for Fortran modules that do simple calculations with the data. These calculations can easily be substituted with CDO-commands in the Python modules. For modules doing complex calculations and providing many namelist parameters the user can define, like extpar_topo_to_buffer or extpar_landuse_to_buffer, a rewrite in Python is not planned.
The interpolation algorithms selected are:
The description of the used algorithms can be found via the CDO documentation.
"},{"location":"user_manual/user_manual_02_software_modules/#Summary","title":"Summary","text":"The external parameters can be generated by using thirteen programs to aggregate the various raw datasets to the target grid and after this by calling the final program for the important consistency check.
In a first step, the target grid and other parameters have to be specified by the user in the runscript (see section Grid Definition for the details).
Then the aggregation of the raw datasets listed in Table 1 to the given target grid can be performed by calling following executables
extpar_aot_to_buffer
extpar_cru_to_buffer
extpar_landuse_to_buffer
extpar_topo_to_buffer
extpar_ndvi_to_buffer
extpar_soil_to_buffer
extpar_flake_to_buffer
extpar_alb_to_buffer
extpar_isa_to_buffer
extpar_ahf_to_buffer
extpar_emiss_to_buffer
extpar_hwsdART_to_buffer
extpar_era_to_buffer
extpar_edgar_to_buffer
These programs generate intermediate NetCDF files (\"buffer\") with the aggregated data.
The executable extpar_consistency_check
reads in the buffer-files, performs an automated consistency check, and finally generates the output fields listed in Table 2.
The task of the consistency check that is performed at the end is to find inconsistencies in the soil data, the lake data and the NDVI data. In the soil data problems may appear between the soil type and the land-use, in particular for water and ice grid elements. For the fraction lake, minimal and maximal lake depth must be introduced and some seas such as the Caspian and the Dead Sea as well as Lake Constance must be defined manually. For more information see chapter 3.7.
"},{"location":"user_manual/user_manual_03_fortran_modules/","title":"Fortran Modules","text":""},{"location":"user_manual/user_manual_03_fortran_modules/#extpar_topo_to_buffer","title":"extpar_topo_to_buffer","text":""},{"location":"user_manual/user_manual_03_fortran_modules/#short-description","title":"Short description","text":"The program extpar_topo_to_buffer aggregates the orography of the GLOBE, ASTER, or MERIT/REMA dataset to the target grid.
"},{"location":"user_manual/user_manual_03_fortran_modules/#target-grid-definition","title":"Target grid definition","text":"The first part of this program contains several routines that read the namelists defined in the run script (see chapter 6 for more information on the run scripts). The first routine (init_target_grid) collects all the information needed to define the target grid with an integrated routine that gathers the variables given in the namelist INPUT_grid_org
. The variable igrid_type, which can either be 1 ('ICON') or 2 ('COSMO'), is an integer switch to define the target grid.
Then a routine reads the namelist of the corresponding grid, which is either INPUT_ICON_GRID
or INPUT_COSMO_GRID
, depending on the chosen grid type. The run script contains only one of the two namelists. This must be manually changed by the user. These namelists contain among other variables the resolution of the grid, the user specified domain and the location of the center of the grid (for closer information about the namelists compare chapters 6.2.2 - 6.2.3). This allows an exact definition of the target grid.
The namelist INPUT_ORO contains the parameter lcompute_sgsl, to determine whether SGSL should be calculated from the respective raw topography data. Formerly this was done in a separate executable extpar_sgsl_to_buffer.exe. From Release 5.3 onwards, the SGSL calculation was incorporated into the execututable 'extpar_topo_to_buffer`. As an intermediate step, the SGSL is written out to NetCDF, one separate file for each raw topography tile is required. In case the preprocessed SGSL NetCDF are already available, setting the parameter lpreproc oro= .false., deactivates the preprocessing, but not the aggregation of SGSL to the target grid. We recommend to only do the preprocessing for the GLOBE dataset, because the computational cost for the ASTER or MERIT/REMA dataset is very high and no validation has taken place for this dataset.
"},{"location":"user_manual/user_manual_03_fortran_modules/#topographic-correction-for-radiation","title":"Topographic correction for radiation","text":"In a second step, the namelist INPUT_RADTOPO
is read. It contains the information if the user desires the calculation of the topographical corrected radiation parameters or not. If the switch is set to .TRUE. a border is added to the COSMO domain, as the computations need grid points beyond the edges of the normal domain. For ICON an on the fly extension of the grid is not possible, leading to missing data at the boundaries. Therefore the namelist-switch max_missing defines the treshold for the allowed fraction of missingness. Altough the topographical corrected radiation can be calculated for both ICON and COSMO grids, the two sets of fields cannot be considered as identical, because for ICON grids one assumes plain (non-tilted) grid-cells, whereas for COSMO one also takes into account self-shading and effects related to tilted-plains for the skyview-factor.
The number of horizons is specified in the namelist. For the COSMO-7 and COSMO-2 setup 24 horizons are recommended. The icon-only parameter radius defines the radial distance taken into account for the topographical corrected radiation parameters. To account for the anisotropic behaviour of longwave-radiation, the namelist parameter itype_scaling defines the power of the term SIN(horizon-angle) in the equation of the skyview-factor. Due to performance reasons, for ICON the parameter min_circ_cov determines how many grid-cells can be skipped on the circumference considered for the computations.
"},{"location":"user_manual/user_manual_03_fortran_modules/#raw-topography-data","title":"Raw topography data","text":"The namelist INPUT_ORO
gives the possibility to switch between two raw orographical data sets (GLOBE, ASTER, or MERIT/REMA). In contrast to the 90m-data of MERIT/REMA, it must be considered, that the 30m-data of ASTER are not completely downloaded and are therefore not globally available. The downloaded region extends from 60N to 60S and from 180W to 180E. It is not recommended to derive the topographical parameters from ASTER if the region is beyond 60 degrees north or south. The ASTER files are arranged as displayed in Figure 2. As the computational time of the program extpar_topo_to_buffer depends mainly on the number of ASTER files that are read in, two new parameters are introduced in the namelist. These two parameters give the number of columns and rows of the used ASTER files. The filenames of the desired ASTER files must be given manually. Figure 2 gives an example on how to use these parameters in the case of COSMO-2. A similar approach is used for MERIT/REMA DEM as shown in Figure 3. The latitude range between 60-90 deg S is covered by REMA DEM, which was mapped to the MERIT data format by BKG, Germany. If GLOBE is used the columns and rows are set to 4 and all GLOBE files must be listed in the topo_files parameter. A check in the program extpar_topo_to_buffer is introduced, which gives a warning if the borders of the domain are exceeded. This is followed by an abortion of this program. As there is no need to calculate the subgrid scale parameters (SSO) for high resolution setups, there is the logical switch lsso_parm to turn off the calculation of the SSOs.
Figure 2: Illustration of the single domains of the 240 ASTER tiles. An example of how the three parameters ntiles_columns, ntiles_row and topo_files in the namelist could look like is given in red.
Figure 3: Illustration of the single domains of the 60 MERIT and the 12 REMA tiles below 60 deg S latitude.
Furthermore the variables of the namelist INPUT_ORO
, which cover all the raw topographical data information, are fed into the program. In this namelist the path of the raw data is given as well as the names of the topography data files. An integer switch allows the choice between the highly resolved, non-global topography ASTER, the global but coarser MERIT/REMA and the coarser and global data set GLOBE (1: GLOBE, 2: ASTER, 3: MERIT/REMA). Furthermore the logical switch to decide whether the SSO parameters are desired or not is read. In order to define the right number of raw data tiles the variables ntiles_column and ntiles_row must be available in the namelist. Additionally, the names for the buffer and output files are defined.
The topography data files must be manually changed in the run script, when switching from GLOBE to ASTER, or MERIT/REMA and vice versa.
Then, the number of tiles of the raw topography data is defined (this varies between the raw data sets: 16 tiles for GLOBE, 1 - 240 tiles for ASTER, 72 tiles for MERIT/REMA). This value is the product of the number of tiles in each column and each row. The variables concerning the raw topography are allocated and in a further step filled with the according values. These values are the edges of each raw topography tile, the number of gridpoints in x- and y-direction, as well as the resolution in both directions. These are directly deduced from the raw data NetCDF files. Finally the borders of the ASTER domain are defined, when ASTER is used.
After the definition of the target grid and the topography set, a check examines the compatibility of the user specified input with the target grid; as ASTER is not globally available at the moment it is checked that the user specified domain is contained in the current ASTER domain. And, if this is not the case, the extpar_topo_to_buffer is aborted with an error message.
"},{"location":"user_manual/user_manual_03_fortran_modules/#scale-separation-input","title":"Scale separation input","text":"The namelist INPUT_SCALE_SEP
gives all the information needed to calculate the SSO parameters and roughness length based on a 3 km filtered topography. Thus the logical switch lscale_separation
must be read to decide if a scale separation is desired or not. Furthermore the raw data files and path must be provided. Note that the lscale_separation
can only be set to .TRUE. if GLOBE is used as topography, as there is no ASTER or MERIT/REMA based 3 km filtered topography available yet. Additionally the user must decide if the computation of the SSO parameters make sense or not. Table 3 can give some assistance to come to the right decision.
lscale_separation
Model resolution is smaller than raw data resolution SSOs: \\(\\sigma = 0\\),z0: \\(\\hspace{12pt}\\sigma = 0\\) .FALSE. Model resolution is greater than the raw data resolution but smaller than 3 km SSOs: \\(\\sigma = 0\\),z0: \\(\\hspace{12pt}\\sigma = \\sum {(model - raw\\hspace{2pt} data)}^{2}\\) .FALSE. and lsso_param = .FALSE. Model resolution is greater than 3 km SSOs: \\(\\sigma = \\sum {(model - 3km\\hspace{2pt} filt )}^{2}\\),z0: \\(\\hspace{12pt}\\sigma = \\sum {(3km\\hspace{2pt} filt - raw\\hspace{2pt} data)}^{2}\\) .TRUE. Table 3: Recommendations on the usage of the scale separation. Be aware that the actual model topography resolution is approximately twice as large as the model resolution. E.g. COSMO-2: The resolution of the topography is approximately 4 km.
"},{"location":"user_manual/user_manual_03_fortran_modules/#orographical-smoothing-input","title":"Orographical smoothing input","text":"The last namelist that must be read before allocating the orography is the namelist INPUT_OROSMOOTH
, which defines all the variables needed to perform an orographical smoothing. The lfilter_oro logical switch, controls the computation of the smoothing in EXTPAR.
The subroutine det_topo_tiles_grid defines the grid of each raw topography data tile. For this, the start and end latitude and longitude of each tile, the distance between two grid points in the latitudinal and longitudinal direction (dlat, dlon) as well as the number of grid points in both directions (nlat, nlon) are derived for each tile. Additionally, the grid for the whole GLOBE, ASTER, or MERIT/REMA domain is derived; This is done in the subroutine det_topo_grid.
Before the raw topography can be aggregated on the target grid, the target variables must be allocated. These variables include the land fraction (FR_LAND), the elevation of the surface (hh_target), the standard deviation of the elevation (stdh_topo), the roughness length of the topography (z0_topo), the sub-grid scale orography parameters (theta_topo, aniso_topo and slope_topo) and the topographical corrected radiation parameters (slope_asp, slope_ang, horizon and skyview). For the ICON grid some additional parameters must also be allocated.
The following paragraphs describe computations on the raw data grid.
The subroutine agg_topo_data_to_target_grid does the actual work of aggregating the raw topography to the target grid. The whole topographical data set is divided in bands of 500 grid points in the latitudinal direction and the whole range of the raw data domain in the longitudinal direction (compare for this the black band in Fig. 4). This band is introduced to optimize memory usage, as it is not possible to read the whole raw data in one pass. In order to read the correct raw data the start and end index of each tile (green crosses in Fig. 4) is defined. These indices are additionally associated with a start and end index (red circles in Fig. 4) inside the band. The definition of the two kinds of indices is performed by the routine get_topo_tile_block_indices. With this band the whole raw data is read step by step as suggested in Fig. 4. If the scale separation is desired the same procedure is applied to the 3 km filtered topography.
Figure 4: Schematic illustration of the filling of the raw data with a 500 grid points long band. The green crosses indicate the start end end latitudes and longitudes of each raw topography tile (light blue tiles), whereas the red circles show the indices inside the band, where the green indices of the tiles must be placed.
After this step, a temporary variable of elevation values is filled. This variable consists of three rows, which comprises the whole longitude range of the raw topography data. This is used to deduce the gradients of the topography, which are calculated as averaged differences between one eastern and one western grid point (x-gradient) or with one northern and one southern grid point (y-gradient). From these gradients in x- and y- direction also the squared gradients and the dx\\(\\ast\\)dy are computed.
This is followed by a call of the subroutine find_rotated_lonlat_grid_element_index. This routine defines to which grid element of the target grid a certain grid element of the raw topography belongs. The allocation of the raw data points to the target grid element is performed as shown in Fig. 5 a). All raw data elements that are closer than half a grid point (green box) to the target point (red circle) are used to define the value at the corresponding target grid point. Only the green grid elements in Fig. 5 b) belong to a target grid element. The rest of the raw topography is unused.
Figure 5: a) Illustration of the aggregation of the raw data to the target grid. The red circle indicates a target grid point, while the green rectangle represents the part of the raw data that is aggregated on the target grid point. b) Showing the target grid on top of the raw data set, where only the green grid points of the raw data are used for the target grid.
The elevations of raw data pixels that belong to one target grid element are summed up, and the number of raw data pixels contributing to one target grid element is tracked. A summation of the raw data values for each target grid element is also performed for the squared elevation, which is later used for the standard deviation, and for the gradients calculated before, which are required for the computation of the subgrid scale orography parameters. The latter is only calculated if the SSO parameters are desired. When making use of the scale separation the squared differences between the original and the 3 km filtered topography must be computed at every grid point. This is needed in order to calculate the roughness length specific standard deviation. After these calculations, the temporary rows are shifted to the north and the computation is repeated for the next center line. As soon as a band of 500 rows is finished a new one will be read in.
Now that all auxiliary variables are available, all loops over the raw topography data are closed and a new one over all the grid points of the target grid is opened.
The following paragraphs describe computations on the target grid.
First of all the elevation is calculated as the mean of all the raw topography data points that are enclosed in one target grid point.
As soon as the topography is available on the target grid, the orographical smoothing is applied using the subroutine do_orosmooth.
In a next step the variance and the standard deviation of the elevation at each target grid point is estimated. Subsequently, the SSO parameters angle of principle axis, anisotropy factor and slope parameter are calculated according to Lott and Miller (1996). These SSOs are only calculated if the SSO switch is set to .TRUE. and if the standard deviation of the height is more than 10 meters, as the trivial case of the ocean is tried to be avoided. If the scale separation is switched on the SSOs are based on the 3 km filtered topography. Finally the orographical roughness length is calculated using the standard deviation, but only if at least one raw data pixel is present in the target grid element.
In the case where no raw topography data pixel is available in a target grid, a weighted bilinear interpolation between neighboring raw data grid element is performed to obtain an elevation in all target grid points. This mainly happens if the raw topography has a similar resolution as the target grid. If the bilinear interpolation needs to be applied, all the SSO as well as z0 are set to zero for this grid element. With this step the end of the subroutine agg_topo_data_to_target_grid is reached.
In the program extpar_topo_to_buffer an additional check on SSOs and z0 is performed. If none of the elements of the target grid is associated with at least ten raw data pixels, or as soon as one single element is not associated with any raw data pixel, all the SSOs and z0 are set to zero.
As soon as there is a value for all the target grid elements, the calculation for the topographical corrected radiation parameters can start, if desired at all.
Finally NetCDF files for the orography based external parameters are created, where different NetCDF routines are used for each grid type, as different parameters are needed for each of them. If the lradtopo is set to .TRUE. the enlarged domain is cut back to the user specified domain, before writing it to the NetCDF file.
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output","title":"Used namelist files and data in-/output","text":"namelist files: INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID, INPUT_ORO, INPUT_OROSMOOTH, INPUT_RADTOPO
data input (GLOBE): GLOBE_A10.nc - GLOBE_P10.nc
data input (ASTER): ASTER_T001.nc - ASTER_T240.nc
data input (MERIT/REMA): MERIT_N90-N60_E150-E180.nc4 - REMA_BKG_S60-S90_W180-W150.nc4
data input (filtered): GLOBE_A_filt_lanczos_window.nc - GLOBE_P_filt_lanczos_window.nc, GLOBE_A_filt_tukey_0.75_3.0_it4.nc - GLOBE_P_filt_tukey_0.75_3.0_it4.nc
Output: buffer file with orography data (/orography_io_extpar/ orography_buffer_file) output file with orography data (used in extpar_cru_to_buffer) (/orography_io_extpar/ orography_output_file)
The executable extpar_landuse_to_buffer aggregates the land use data to the target grid. Five different raw datasets can be processed: Globcover, GLC2000, GLCC, ESA CCI-LC and Ecoclimap Second Generation (Ecoclimap-SG from here onwards). As GLC2000 and Globcover do not include Antarctica, GLCC or ESA CCI-LC data can be used for the missing areas. The landuse executable also includes the TERRA-URB module, controlled by the logical switch l_terra_urb; see section 3.2.2 for details.
"},{"location":"user_manual/user_manual_03_fortran_modules/#target-grid-definition_1","title":"Target grid definition","text":"The definition of the target grid is done by reading the namelist INPUT_grid_org
. This namelist contains the information about the grid type, which can either be ICON or COSMO. With the information about the grid type, the namelist containing the grid definition can be read. The name of the namelist must be changed manually by the user, according to the chosen grid type. The namelist must either be INPUT_ICON
or INPUT_COSMO
. For a more exact description of the target grid definition, read the subsection 'Target grid definition' in section 3.1. After specifying the grid definition the southern band of the target grid is defined. This information is important, as the two raw data sets GLC2000 and Globcover do not cover the region below 60 degrees south. If this region is desired by the user, the third data set must be considered for the domain below the southern band. Additionally the target fields for the land use data are allocated.
In a next step the namelist INPUT_LU
is read. It contains an integer switch (i_landuse_data) that gives the possibility to choose between the five different raw data sets e.g., 1 (Globcover), 2 (GLC2000), 3 (GLCC), 5 (ESA CCI-LC), and 6 (Ecoclimap-SG). For Globcover one can additionally choose to use the corine landuse dataset by setting the logical switch (l_use_corine) to TRUE. Furthermore the path and the filename of the desired raw data and of GLCC are specified there. The user must adjust the filename and path manually according to the chosen raw data in i_landuse_data. In addition the name of the desired lookup table is read, which again can be chosen by the user using an integer switch ilookup_table_lu. The lookup tables are described in more detail in Table 5. The names of the buffer files for the target landuse fields and for the target GLCC fields are also specified in this namelist. Finally, the aforementioned l_terra_urb logical switch can be specified (the default value is .FALSE.).
After having read the namelists, the number of tiles of the raw data set is defined. The number of tiles is set to 1 as default and must only be changed for the raw data set Globcover or ESA CCI-LC, which are composed of 6 tiles. The basic information of the Globcover tiles, such as the latitude and longitude edges and the resolution is allocated according to the number of tiles. Later these variables are filled with the respective information, read from the NetCDF files directly.
For the remaining procedures the three different raw land use data have their separate routines, which are constructed identically.
The allocation of the data is done using the number of grid points in the latitudinal and longitudinal direction. Furthermore the land-use target fields are allocated using the target grid for the dimension size and the number of land-use classes. The land-use classes differ for the three raw data sets and are described in more detail in Table 4.
Data Set Number of Class Name of Class (Total number of Classes) GLOBCOVER (23) 01 irrigated croplands 02 rainfed croplands 03 mosaic cropland (50-70%) - vegetation (20-50%) 04 mosaic vegetation (50-70%) - cropland (20-50%) 05 closed broadleaved evergreen forest 06 closed broadleaved deciduous forest 07 open broadleaved deciduous forest 08 closed needleleaved evergreen forest 09 open needleleaved decid. or evergr. forest 10 mixed broadleaved and needleleaved forest 11 mosaic shrubland (50-70%) - grassland (20-50%) 12 mosaic grassland (50-70%) - shrubland (20-50%) 13 closed to open shrubland 14 closed to open herbaceous vegetation 15 sparse vegetation 16 closed to open forest regulary flooded 17 closed forest or shrubland permanently flooded 18 closed to open grassland regularly flooded 19 artificial surfaces 20 bare areas 21 water bodies 22 permanent snow and ice 23 undefined Corine (23) Corine (23) (CLC: 2.1.2, 2.1.3) 11 irrigated croplands (CLC: 2.1.1) 14 rainfed croplands (CLC: 2.4.2, 2.4.3) 20 mosaic cropland (50-70%) - vegetation (20-50%) (CLC: 2.4.4) 30 mosaic vegetation (50-70%) - cropland (20-50%) 40 closed broadleaved evergreen forest (CLC: 3.1.1) 50 closed broadleaved deciduous forest 60 open broadleaved deciduous forest (CLC: 3.1.2) 70 closed needleleaved evergreen forest (CLC: 1.4.1) 90 open needleleaved decid. or evergr. forest (CLC: 3.1.3) 100 mixed broadleaved and needleleaved forest (CLC: 2.2.3, 3.2.4) 110 mosaic shrubland (50-70%) - grassland (20-50%) (CLC: 2.2.2, 3.2.2) 120 mosaic grassland (50-70%) - shrubland (20-50%) (CLC: 2.2.1) 130 closed to open shrubland (CLC: 2.3.1, 3.2.3) 140 closed to open herbaceous vegetation (CLC: 3.2.1) 150 sparse vegetation 160 closed to open forest regulary flooded (CLC: 4.1.2) 170 closed forest or shrubland permanently flooded (CLC: 4.1.1) 180 closed to open grassland regularly flooded (CLC: 1.1.1, 1.1.2, 1.2.1, 1.2.2, 1.2.3, 1.2.4, 1.3.3, 1.4.2) 190 artificial surfaces (CLC: 3.3.1, 3.3.2, 3.3.3, 3.3.4, 1.3.1, 1.3.2) 200 bare areas (CLC: 4.2.1, 4.2.2, 4.2.3, 5.1.1, 5.1.2, 5.2.1, 5.2.2, 5.2.3) 210 water bodies (CLC: 3.3.5) 220 permanent snow and ice (CLC: 9.9.9) 230 undefined GLC2000 (23) 01 evergreen broadleaf tree 02 deciduous broadleaf tree closed 03 deciduous broadleaf tree open 04 evergreen needleleaf tree 05 deciduous needleleaf tree 06 mixed leaf tree 07 fresh water flooded tree 08 saline water flooded tree 09 mosaic tree / other natural vegetation 10 burnt tree cover 11 evergreen shrubs closed-open 12 deciduous shrubs closed-open 13 herbaceous cover closed-open 14 sparse herbaceous or grass 15 flooded shrub or herbaceous 16 cultivated and managed areas 17 mosaic crop/tree/natural vegetation 18 mosaic crop/shrub or grass 19 bare areas 20 water bodies 21 snow and ice 22 artificial surfaces 23 undefined GLCC (24) 01 urban and built-up land 02 dryland cropland and pasture 03 irrigated cropland and pasture 04 mixed dryland/irrigated 05 cropland/grassland mosaic 06 cropland/woodland mosaic 07 grassland 08 shrubland 09 mixed shrubland/grassland 10 savanna 11 decidous broadleaf forest 12 decidous needleleaf forest 13 evergreen broadleaf forest 14 evergreen needleleaf forest 15 mixed forest 16 water bodies 17 herbaceous wetland 18 wooded wetland 19 barren or sparsely vegetated 20 herbaceous tundra 21 wooded tundra 22 mixed tundra 23 bare ground tundra 24 snow or ice Ecoclimap-SG (33) 01 sea and oceans 02 lakes 03 rivers 04 bare land 05 bare rock 06 permanent snow 07 boreal broadleaf deciduous 08 temperate broadleaf deciduous 09 tropical broadleaf deciduous 10 temperate broadleaf evergreen 11 tropical broadleaf evergreen 12 boreal needleleaf evergreen 13 temperate needleleaf evergreen 14 boreal needleleaf deciduous 15 shrubs 16 boreal grassland 17 temperate grassland 18 tropical grassland 19 winter C3 crops (lower T) 20 summer C3 crops 21 C4 crops (warmer environments) 22 flooded trees 23 flooded grassland 24 LCZ1: compact high-rise 25 LCZ2: compact midrise 26 LCZ3: compact low-rise 27 LCZ4: open high-rise 28 LCZ5: open midrise 29 LCZ6: open low-rise 30 LCZ7: lightweight low-rise 31 LCZ8: large low-rise 32 LCZ9: sparsely built 33 LCZ10: heavy industryTable 4: Land-use classes for the different raw data sets. The Corine LandCover (CLC) classes in the left column indicate how the CLC is mapped to the corresponding GlobCover class.
After the allocation of the data a check is performed to query, if the user desires a domain that goes beyond the southern bound of the raw data. If it is the case, the GLCC target fields are allocated as well.
In case that Globcover is used, the grid for the single tiles must be defined as well.
"},{"location":"user_manual/user_manual_03_fortran_modules/#aggregation-of-the-raw-land-use-data-to-the-target-field","title":"Aggregation of the raw land-use data to the target field","text":"The definition and allocation part is done and the most important part, the aggregation of the raw data to the target grid can be performed. In order to be able to aggregate the data, the lookup table must first be initialized. The initial values differ for the various settings listed in Table 5. Also the name of the lookup table must be defined using the integer numbers specified in the namelist INPUT_LU
. The integer number are listed together with their associated lookup table names in Table 5.
Raw Data Integer Setting Name of the lookup table GLOBCOVER 1 operational settings Asensio, 2011 2 experimental settings, analog to lookup tables of ECOCLIMAP Asensio, 2010 GLC2000 1 operational settings of GME Ritter, 2007 2 operational settings of COSMO Heise, 2005 3 experimental settings, analog to lookup tables of ECOCLIMAP Asensio, 2010 GLCC 1 operational settings of GME Ritter, 2007 2 operational settings of COSMO Heise, 2005 3 experimental settings, analog to lookup tables of ECOCLIMAP Asensio, 2010 ESA CCI-LC 1 experimental settings Helmert, 2019 Ecoclimap-SG 1 Globcover analogue with added LCZs from Oke
Table 5: Names of the lookup tables and the different possible settings for each raw land-use data set.
The following paragraphs describe computations on the raw data grid.
For GLC2000 and GLCC, the raw data is read in lines of a complete longitude going from 180 degrees east to 180 degrees west, through a loop over the latitude. Before any calculation is performed, it is tested if the value of the latitude is contained inside the targed domain. In case it is not, the loop is cycled. Reading of the data line-wise can be done from the NetCDF file directly.
Using the routine find_nearest_target_grid_element each raw data pixel is assigned to a target grid point. A more precise description and a figure that describes the procedure can be found in paragraph 'Aggregation of the raw topography to the target grid' and in Fig. 5 in section 3.1.
As Globcover and ESA CCI-LC are composed of six tiles, the reading of the raw data must be performed in a different way than for the other three data sets. The reading of the data for Globcover is done in the same way as for the topography. Compare the paragraph 'Aggregation of the raw topography to the target grid' in section 3.1. As there is no need to calculate gradients for the land use, the corresponding variable, which contains three lines of raw data, is not used.
The lookup table is then fed with the land use class, which gives a value for all the target fields listed in Table 6.
Variable long name Variable short name Fraction Land FR_LAND Ice fraction FR_ICE Plant cover maximum PLCOV_MX Plant cover minimum PLCOV_MN Leaf area index maximum LAI_MX Leaf area index minimum LAI_MN Minimal stomata resistance RS_MIN Urban area fraction URBAN Fraction of deciduous forest FOR_D Fraction of evergreen forest FOR_E Longwave surface emissivity EMISS_RAD Root depth ROOTDP Roughness length Z0
Table 6: The variables that are computed using the raw land-use data.
The number of grid points that fall into the same target grid and land use class are summed up. The values of the target fields are weighted with the whole pixel area and summed up. Except for the emissivity, which is the only land-use parameter that also has valid values over water, only land pixels are considered. Values that depend on the plant cover, such as PLCOV_MX, PLCOV_MN, LAI_MN, LAI_MX, RS_MIN, FOR_E, FOR_D, ROOTDP and z0, are weighted with the plant cover maximum in addition to the pixel area.
The following paragraphs describe computations on the target grid.
The total area and the land area of each target grid point is first defined. Then the weighted sums of the target fields derived in the previous step are normalized to obtain the definite values. The emissivity and the number of land use classes are normalized by the total area to obtain the correct emissivity and area fraction of each land use class. The other parameters are only considered if the area_land is larger than zero: FR_LAND and FR_ICE are normalized with the total area, URBAN, FOR_D, FOR_E, PLCOV_MN and PLCOV_MX are normalized by the land area, the ROOTDP, LAI_MN, LAI_MX and RS_MIN are normalized by the area covered by plants. If only sea pixels are found, all the fields are undefined.
Finally land-use classes are defined for target grid points that do not contain any raw data pixel. In contrary to the topography, where a bilinear interpolation is performed, here the nearest neighbor is searched. The associated land use class is used with the lookup tables, and the target fields are defined.
The target fields are written to a NetCDF buffer file, which can later be used for the consistency check. There is a file for the chosen land use data set, and one, if needed at all, for the GLCC land use data. Finally the allocated memory is deallocated again.
"},{"location":"user_manual/user_manual_03_fortran_modules/#terra_urb","title":"TERRA-URB","text":"NOTE: currently the TERRA-URB module in EXTPAR only works with the Ecoclimap-SG database, as this is the only database available for extpar with an LCZ map.
The executable extpar_landuse_to_buffer also includes the TERRA-URB module, controlled by the logical switch l_terra_urb. This module uses a 2D map of local climate zones (LCZ) to determine a set of urban canopy variables used by TERRA-URB in COSMO/ICON, see Table 7. The module aggregates the variables and outputs them to the lu_buffer_file. The aggregation procedure follows that of the other land use variables described in the previous sections. The TERRA-URB related variables then pass through the subprogram extpar_consistency_check (see section 3.7) and are written out to the final extpar file for both COSMO and ICON. ICON would typically ignore these fiels and just use the information from the LU_CLASS_FRACION field, as is done for other land use variables, except for when ntiles=1 in which case it needs the 2D fields. The ISA and AHF EXTPAR modules must be turned off when running with l_terra_urb=.true, as these fields are computed within the TERRA-URB module. The code for this module is based upon Matthias Demuzere's WUDAPT-to-COSMO [@Varentsov2020] and Handrik Wouters' SURY [@Wouters2016] codes. The LCZ look-up tables are based on the values published in [@Stewart2012; @Stewart2014].
Variable name Description FR_URBAN Urban area fraction ISA Impervious surface area AHF Anthropogenic heat flux FR_PAVED Fraction of impervious surface area URB_FR_BLD Urban building fraction URB_H_BLD Urban building height URB_H2W Urban canyon height to width ratio URB_ALB_SO Urban shortwave (solar) albedo URB_ALB_TH Urban thermal albedo URB_EMIS Urban emissivity URB_HCON Urban mean heat conductivity URB_HCAP Urban mean heat capacity
Table 7: Varialbes provided by the TERRA-URB module
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_1","title":"Used namelist files and data in-/output","text":"namelists files:
data input:
Output:
The executable extpar_aot_to_buffer aggregates aerosol optical thickness data to the target grid.
"},{"location":"user_manual/user_manual_03_fortran_modules/#target-grid-definition_2","title":"Target grid definition","text":"The definition of the target grid is again done using the namelist INPUT_grid_org
. As the subroutines are exactly the same as the ones used in extpar_topo_to_buffer, it is referred to the subsection 'Target grid definition' in section 3.1, where the procedure is explained in more detail.
The namelist INPUT_AOT
is kept very simple. It contains only the path and the name of the raw aerosol optical depth data. The integer switch (iaot_type) informs EXTPAR which of the 4 available datasets has been chosen: 1 (Tegen), 2 (AeroCom), 3 (MACC-II), 4 (MACv2) or 5 (CAMS) . Additionally, also the filenames of the buffer and output files for the aggregated data is specified.
In order to allocate the variables used to read the raw data, the dimensions of the raw data is defined. These dimensions include the number of rows and columns of the NetCDF raw data file, the number of months, which is equal to 12, as a full yearly cycle is described, and the number of types of aerosols contained in the raw data file. This number is 5 for iaot_type=1,2 or 3 , as the raw data file contains the aerosol optical thickness information of black carbon, dust, organic matter, sulfate and sea salt. iaot_type=4 is used for a new formulation of the radiation-aerosol interaction available only in version of COSMO later than 5.04. This provides data of the aerosol optical thickness, the single scattering albedo and the asymmetry factor for the 8 spectral bands defined in the RG92 radiation scheme. iaot_type=5 is used only for ICON model. The raw data file contains the layer-integrated mass information of 11 types of aerosols: Sea Salt (3 bin), Mineral Dust (3 bin), hydrophilic and hydrophobic organic matter, hydrophilic and hydrophobic black carbon and sulfate. Also the raw data file contains the pressure for 60 vertical levels. The 3 first data-sets which provide raw data for different aerosol types refer to Tegen1, AeroCom2 and MACC-II3 whereas the fourth data-set is derived from MACv24 and the fifth data-set is derived from CAMS5.
In a next step, the complete raw data is read into memory; this is possible since the aerosol optical depth raw data is of rather coarse resolution (see Table 8). Also, the grid of the raw data is determined from NetCDF meta data. Before the aggregation to the target grid can start, the target grid fields must be allocated, using the target grid, the number of months and aerosol types or spectral bands.
Raw data set resolution Tegen 4 x 5 degree AeroCom 1 x 1 degree MACC-II 1.125 x 1.125 degree MACv2 1 x 1 degree CAMS 3 x 3 degree x 60 levels
Table 8: Resolution of raw data-sets for aerosol optical depths.
"},{"location":"user_manual/user_manual_03_fortran_modules/#aggregation-of-the-aerosol-optical-depth-to-the-target-field","title":"Aggregation of the aerosol optical depth to the target field","text":"As the resolution of all raw data sets is so coarse, there is no need to go through the whole raw data set and find the corresponding target grid element. Here there is only one loop over the target grid. For every target grid element four surrounding raw data points are searched for. With these four points, a weight for the bilinear interpolation is computed. As the raw data grids of the 5 different aerosols are equal, the four surrounding points are the same for all months and aerosol types. Four new arrays (SW, SE, NE, NW) are then defined, which contain the four neighbor values, for each month and each type. These can now be used, together with the previously calculated weights, to calculate the bilinear interpolation.
Finally the data is saved in a NetCDF buffer and an output file, and the allocated variables are deallocated.
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_2","title":"Used namelist files and data in-/output","text":"namelists files: INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID, INPUT_AOT
data input: aot_GACP.nc, aod_AeroCom1.nc, aod_MACC_2003-2012.nc, aod_MACC_2003-2012_proc.nc, aot_MACv2.nc, aot_CAMS_2003-2013.nc
Output: buffer file with aerosol data (/aerosol_io_extpar/ aot_buffer_file)
The executable extpar_soil_to_buffer aggregates soil data of the FAO Digital Soil Map of the World or of the Harmonized World Soil Data (HWSD) to the target grid.
"},{"location":"user_manual/user_manual_03_fortran_modules/#target-grid-definition_3","title":"Target grid definition","text":"The definition of the target grid is again done using the namelist INPUT_grid_org
. As the subroutines are exactly the same as the ones used in extpar_topo_to_buffer, it is referred to the subsection 'Target grid definition' in section 3.1, where the procedure is explained in more detail.
The variables for the raw soil data are read from the namelist INPUT_SOIL
. These variables are the path and the names of the raw data files and two switches to decide whether the FAO or the HWSD data should be used and if the deep soil data is desired or not. The integer switch isoil_data determines the raw data and processing used: 1 for FAO, 2 for the HWSD data-set6 and 3 for the use of HWSD data with mapping to TERRA soil types. The switch to choose the production of deep soil information is a logical (only applicable to isoil_data=2). Additionally, the names of the buffer files are specified. Be aware that a change of the integer switch from FAO to HWSD requires also the manual replacement of the raw data file names in the namelist.
After reading the namelist, a check is made on the production of subsoil characteristics. This is only supported for HWSD data, and a warning is issued in case of bad usage.
The dimensions of the raw soil data are defined, which include the number of grid points in the latitudinal and longitudinal direction, as well as the number of soil data code of the raw data. These values are needed to allocate the soil data with the proper size.
The mapping between raw data sets specific codes and some standard soil types is defined; this concerns the soil types undefined
, default
, ice
and water
.
As the soil data is provided in one single file, all data can be read in one shot. The data that are read from the NetCDF file are the texture and the slope of the soil data and the soil code. The aggregation of the data is done in a different way for the FAO and HWSD data, as these result in two completely different variables. Moreover, for HWSD data, to conserve memory, the topsoil data are allocated first and aggregated to the target grid, before the same is done for the subsoil.
"},{"location":"user_manual/user_manual_03_fortran_modules/#aggregation-of-the-fao-and-hwsd-data-with-terra-mapping-to-the-target-grid","title":"Aggregation of the FAO and HWSD data with TERRA mapping to the target grid","text":"The following paragraphs describe computations on the raw data grid.
The soil data is read using a loop over the latitude and the longitude. This results in a point-wise reading of the raw data. As soon as the point is read, its corresponding target grid element is defined. If the regular latitude/longitude grid point is not contained in the target grid, a new point is read. If however the point is inside the target grid, the aggregation can begin.
The number of raw data pixels is increased by one, if a raw data point can be assigned to a target grid point. This number is later used to define the fraction land defined by the soil data. The corresponding soil unit is deduced from the raw data. If the soil unit is zero, this is an ocean pixel and the number of sea points is increased by one. If the soil code differs from zero, the number of land points is increased by one. The soil code is then associated to either a special or a normal soiltype. For all the special soiltypes such as ice, rock, salt, histosols, dunes and no data flags the respective texture (coarse, medium, fine) are defined using a lookup table. All other soil units are described using the texture available in the raw data. These values define the final texture variable texture
.
The following paragraphs describe computations on the target grid.
In the following a loop is opened over the target grid points. First of all the fraction land is defined using the number of land pixels minus the number of inland water pixels, which is then averaged by the number of raw data pixels that were available for the target grid element. In a next step the texture for every target grid element is defined. For the special soiltypes (texture larger than 900) the corresponding number is associated. For the normal soiltypes (texture smaller than 900) the texture is calculated as average of the summed up texture. The resulting texture value is multiplied by 100 and converted into an integer number. This number is used to associate the final soiltype to every target grid element. The soiltypes are described in more detail in table 9. For target grid points that do not contain any raw data points, the nearest neighbor in the raw data is defined. If the target grid point is outside the raw data grid the slope is defined as zero and the texture as undefined.
TERRA Code Soiltype raw data code 1 ice and glacier7 9001 2 rock, lithosols 9002 3 sand 9003 (salt), 9005 (shifting sands and dunes) and coarse texture 4 sandy loam coarse to medium texture 5 loam (default soiltype) 9009 (undefined), 9012 (dominant part undefined), medium texture 6 loamy clay medium to fine texture 7 clay fine texture 8 histosols (peat) 9004 9 water 9000 (undefined: inland water), -9 (undefined: ocean)
Table 9: TERRA soiltypes and their respective FAO raw data codes.
"},{"location":"user_manual/user_manual_03_fortran_modules/#aggregation-of-the-hwsd-data-to-the-target-grid","title":"Aggregation of the HWSD data to the target grid","text":"The aggregation starts again with a loop over the latitudes and longitudes. For each grid point a target grid element is looked for. If there is a target grid element, the aggregation can start. The soiltype is defined using the raw data value, if it is above zero, and zero otherwise. Additionally, all the ocean, land and lake points are counted in order to determine the land fraction which is calculated as the difference between the summed up land and lake points normalized by the number of raw data pixels available. For target grid points with no raw data, the nearest neighbor in the raw data is defined.
The resulting soiltype is not yet usable, as it contains numbers coded in a world code and not in TERRA soiltypes. This transformation is done in the consistency check, where the special soiltypes of the HWSD data, specified in Table 10, are packed in the variable SOILTYP
the normal soiltypes are given in fractions of sand, silt, clay and organic carbon, and the bulk density is also given.
TERRA Code Soiltype TERRA Code Soiltype 1 ice and glacier 8 histosols (peat) 2 rock, lithosols 9 water 3 sand 10 alkali flat 4 sandy loam 11 shifting sand, dunes 5 loam (default soiltype) 12 Urban, human disturbed 6 loamy clay 225 Unknown 7 clay
Table 10: New TERRA soiltypes deduced from the HWSD data.
"},{"location":"user_manual/user_manual_03_fortran_modules/#output-of-the-soil-data","title":"Output of the soil data","text":"The soiltypes and the fraction land, together with the undefined value, the latitudes and longitudes are saved in a NetCDF buffer file. This is later used to perform the consistency check, which is especially important for the HWSD data, as the main transformation of the data takes place there.
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_3","title":"Used namelist files and data in-/output","text":"namelists files: INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID, INPUT_SOIL
data input: FAO_DSMW_double.nc, FAO_DSMW_float.nc, HWSD0_30_topsoil.nc, HWSD30_100_subsoil.nc
Lookup tables for HWSD: LU_TAB_HWSD_UF.data, HWSD_DATA_COSMO.data, HWSD_DATA_COSMO_S.data
Output: buffer file with soil data (/soil_io_extpar/ soil_buffer_file)
The executable extpar_flake_to_buffer aggregates lake depth data and lake fraction to the target grid.
"},{"location":"user_manual/user_manual_03_fortran_modules/#target-grid-definition_4","title":"Target grid definition","text":"The definition of the target grid is again done using the namelist INPUT_grid_org
. As the subroutines are exactly the same as the ones used in extpar_topo_to_buffer, it is referred to the subsection 'Target grid definition' in section 3.1, where the procedure is explained in more detail.
As only the target grid dimensions are needed to allocate the target fields, this is done right after the definition of the target grid. Then the namelist INPUT_FLAKE
is read to define the path and the filename of the raw lake data. Also the names of the buffer and the output file for the consistency check are given. Once more the dimensions of the raw data are needed to allocate the raw data correctly; these dimensions are deduced from the netcdf file directly and the raw data grid is defined.
The following paragraphs describe computations on the raw data grid.
The data is read row-wise, through a loop over the latitudes, shipping all latitudes not inside the user specified domain. If a row is kept, a new loop over the longitudes is started to treat the raw data point-wise. For each point, the corresponding target field element is defined. This is done in the same way described in the subsection 'Aggregation of the topography to the target grid' in section 3.1 and Fig. 5. The number of raw data pixels that contribute to the target grid value are summed up as well as the lake depth, which is multiplied by a scale factor deduced from the area of each pixel that contributes to a lake fraction.
The following paragraphs describe computations on the raw data grid.
The lake fraction is derived and the lake depth is obtained by normalizing the weighted sum previously computed. Where no lake depth is available the value is set to undefined (-1). In case that no raw data pixel is available the nearest neighbor in the raw data is searched for.
The target fields are then written to a netcdf buffer and output file. Finally the allocated memory can be released.
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_4","title":"Used namelist files and data in-/output","text":"namelists files: INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID, INPUT_FLAKE
data input: GLDB_lakedepth.nc
Output: buffer file with flake data (/flake_io_extpar/ flake_buffer_file)
This program processes HWSD (Harmonized World Soil Database) data and aggregates it onto a target grid.
The code is a module named \"mo_agg_hwsdART\" that contains a subroutine called \"agg_hwsdART_data_to_target_grid\". This subroutine is used to aggregate data from the HWSD dataset to a target grid. The HWSD dataset contains soil unit information classified according to the USDA soil classification system.
The module uses several other modules, including \"mo_logging\" for logging purposes, \"mo_kind\" to define kind parameters, \"mo_hwsdART_data\" to define the different soil types according to the USDA classification, \"mo_hwsdART_tg_fields\" to define variables related to the target grid, and \"mo_grid_structures\" to define grid structures.
The subroutine takes input parameters including the target grid structure (\"tg\"), the HWSDART soil unit data (\"hwsdART_soil_unit\"), the grid of HWSDART data (\"hwsdART_grid\"), and the longitude and latitude coordinates of the HWSDART grid (\"lon_hwsdART\" and \"lat_hwsdART\").
The subroutine initializes local variables and arrays to store the counts of different soil types in each grid element of the target grid. It also sets an undefined integer value and initializes the count of raw data pixels to zero.
The subroutine then iterates over the HWSDART grid and finds the nearest target grid element for each raw data pixel using the \"find_nearest_target_grid_element\" function. If the raw data pixel is out of the range of the target domain, it is skipped.
For each valid raw data pixel, the subroutine counts the number of raw data pixels in the target grid element and increments the count for the corresponding soil type in the local arrays.
After the iteration over the HWSDART grid, the subroutine iterates over the target grid to calculate the fraction of each soil type in each grid element. It divides the count of each soil type by the total number of raw data pixels in the grid element and stores the fractions in the corresponding variables.
The code aggregates the HWSD soil data in USDA scheme to a target grid, calculating the fraction of each soil type in each grid element for application in ICON-ART simulations.
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_5","title":"Used namelist files and data in-/output","text":"namelists files: INPUT_grid_org, INPUT_ICON_GRID, INPUT_hwsdART
data input: HWSD0_USDA.nc
Output: buffer file with fraction of soil type classes (hwsdART_extpar_ICON.nc)
The extpar_consistency_check is performed after all raw data have been aggregated to the target grid to remove any inconsistencies that may appear among the different data and to derive additional information using multiple raw data sources.
"},{"location":"user_manual/user_manual_03_fortran_modules/#reading-of-namelists","title":"Reading of namelists","text":"Before the grid is defined, the namelists INPUT_RADTOPO
, INPUT_ORO
and INPUT_SOIL
are read to obtain the settings of the different switches that are used (e.g. lradtopo, itopo_type, lsso_param, isoil_data, ldeep_soil). Then the namelist INPUT_grid_org
is read to obtain the target grid information and the grid type.
In a next step the INPUT_LU
is read by extpar_consistency_check to check if the GLCC data set is required, which is the case if the target grid domain reaches more to the south than the chosen raw land-use data set. (Globcover and GLC_2000 are not global.)
If the namelist INPUT_ERA is present (indicating that one uses the ERA climatologies generated by extpar_era_to_buffer) the buffer file name is retrieved. If this namelist is not present (legacy climatologies from ICON-REMAP-TOOL are used), the buffer file names in INPUT_CHECK are read. After that step, all other namelists of the EXTPAR modules are read in order to retrieve the buffer file name for each data set. These files are read and all the variables needed for the final external parameters file are allocated.
An additional namelist that is used is INPUT_CHECK
, it contains a couple of switches to define the processing in the consistency check.
The first task after reading the namelists is to derive the correct land sea mask from the land use data. If the GLCC data must be used, the land sea mask below the southern band is deduced from GLCC.
Then the total roughness length is computed as the sum of the roughness length deduced from the land-use and the topography.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-for-water-and-ice-pixels","title":"Consistency check for water and ice pixels","text":"The definition of a water grid element is based on the land-use data. The vegetation is set to zero for all water grid elements and FAO derived soil type is set to water. For non water pixels with undefined or invalid soil type, the FAO derived soil type is either set to default, which is loam, or to ice for regions that are below 60 degrees south (where only Antarctica is located).
All the points that are classified as ice in the land-use data but not in the FAO derived soil type, are changed to ice in the latter; the vegetation of these pixels is set to zero.
The HWSD derived soiltype needs a transformation from the world code to the TERRA code, which is performed here. The world code is decoded with the TERRA HWSD lookup table, to define the regions that contain a special soiltype (see the special soiltypes in Table 10). For each grid point the world code is associated to the single fractions of the soil composition, using an other lookup table. If there is a point that does not contain a bulk density it is calculated using the formula of the cultivated topsoil or the compact subsoil from Hollisa et al. (2012)8 and Woesten et al. (1999)9. Furthermore there is a special treatment of peat with histosols. The whole procedure is also done for the subsoil, if it is desired at all.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-of-lake-data","title":"Consistency check of lake data","text":"Water grid points are either declared as lake or ocean, thus over land a fraction lake and over the ocean a fraction ocean is defined. Where the fraction land deduced from the topography is smaller than 0.99 the fraction ocean is defined. All the other points are used to determine the fraction lake. Both fractions are defined such that fr_lake or fr_ocean plus fr_land_lu (fraction land deduced from land-use) sum up to one. Some smaller seas must be defined manually, thus for the region of the Dead Sea and the Caspian Sea not fraction lake but fraction ocean is calculated.
For fr_land 10 and fr_ocean 11 larger than a half, the lake depth is set to undefined. A default value for the lake depth is used for grid elements with a lake fraction 12 larger than a half and a negative lake depth. Additionally a maximum and minimum lake depth is defined. Included is also a manual correction of the depth of Lake Constance.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-of-albedo-data","title":"Consistency check of albedo data","text":"The consistency check of the albedo data concerns land pixels that have a albedo smaller than 0.07. For these pixels a weighted bilinear interpolation is performed. Only land points are used for the interpolation, if there is no surrounding land point a warning message is printed. Values that are still too small receive a soiltype dependent albedo. This is done for all three wavelengths.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-of-ndvi-data","title":"Consistency check of NDVI data","text":"The next consistency check is performed with the normalized difference vegetation index (NDVI). The NDVI values are set to undefined for water grid points. Additionally, values that are smaller than a predefined value are set to exactly this value.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-of-the-temperature-climatology","title":"Consistency check of the temperature climatology","text":"The consistency check of the temperature climatology contains a height correction and is only performed for the finer resolved temperature climatology (e.g. it_cl_type = 1). The temperature is set to undefined for all the sea points. For land points that have a valid temperature, it is adjusted to the height. This is done by considering a constant temperature rate of 0.65 K per 100m:
\\(\\frac{dT}{dh} = -\\frac{0.65 K}{100 m}\\).
Target points that do not contain temperature values larger than zero are filled with surrounding values. First a valid point is looked for in the surrounding \\(3\\times3\\) grid box. If still no valid point can be found, it is searched along the longitude, and if nothing else helps the nearest neighbor is tried.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-of-all-other-fields","title":"Consistency check of all other fields","text":"All other fields are assumed to be independent and are written to the output file exactly as they were read in. A special treatment applies to the ISA, AHF, EMISS and S_ORO fields. Whenever their respective namelist input file is missing in the working directory where extpar_consistency_check is executed these fields are not added to the output file. An exception to this rule applies to the ISA and AHF fields which are added to the output file if the logical switch l_terra_urb is set to .TRUE. in the INPUT_LU namelist; see section 3.2.2 for more details.
"},{"location":"user_manual/user_manual_03_fortran_modules/#definition-of-special-points","title":"Definition of special points","text":"Be aware that the definition of special points has only been tested for the COSMO grid and can only be used if the FAO raw soil type is used. At the moment there are three special points (1: Falkenberg, 2: Waldstation, 3: Lindenberg). At each of these points, values for soiltype_sp, z0_sp, rootdp_sp, plcovmn_sp, plcovmx_sp, laimn_sp, laimx_sp can be explicitly set by the user. The coordinates of the special point are also user specified. If no special treatment at these points is desired the number_special_points must be set to zero (see Table 11). If no special treatment is desired at all, the integer switch i_lsm_treatment can be set to 1 instead of 2.
number_special_points Treatment of special points 0 NO treatment of special points 1 special treatment of Falkenberg 2 special treatment of Falkenberg and Waldstation 3 special treatment of Falkenberg, Waldstation and Lindenberg
Table 11: Usage of the namelist parameter number_special_points.
"},{"location":"user_manual/user_manual_03_fortran_modules/#reduced-main-memory-usage","title":"Reduced main memory usage","text":"Since Exptar Version 5.4 a new feature was introduced which allows the running of extpar_consistency_check for very high resolution global grids without any restrictions on the hardware memory specifications. A POSIX mmap based implemetation of disk caching arrays is used to use main memory as much as possible and, if more memory is required, the duty to handle this request is delegated to the kernel. A requirement to run this properly is the provision of swap space in the expected total memory use. With this technique we could process a global R2B11 ICON grid (around 1.25 km grid resolution) on a server with 256 GB main memory. Of course processing gets quite slow, but is still in the order of a couple of cups of coffee.
The feature can be enabled with the namelist variable l_use_array_cache = .TRUE. in namelist extpar_consistency_check_io. The namelist variable default is l_use_array_cache =.FALSE., which is selecting the standard heap allocation by Fortran's ALLOCATE statement.
"},{"location":"user_manual/user_manual_03_fortran_modules/#writing-output","title":"Writing output","text":"The final results are written into a netcdf file. The output file name can be specified in the namelist INPUT_CHECK
.
Since EXTPAR Version 5.4 the output possibilities have been extended for ICON only. The EXTPAR output procedure for COSMO did not change with Version 5.4. As ICON and a lot of its associated tools (eg. CDO, DWD icontools) are already using a single abstract interfacing library CDI, a re-implementation for the final EXTPAR output procedure with CDI to prepare for future developments is provided. Note, that this re-implementation replaces the former writing-routine completely. For a detailed description of CDI look at https://code.mpimet.mpg.de/projects/cdi .
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_6","title":"Used namelist files and data in-/output","text":"namelists files: INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID, INPUT_CHECK, INPUT_
data input: all buffer files from the EXTPAR modules defined in the INPUT_
namelist files
data output: netCDF containing all external parameters (/extpar_consistency_check_io/ netcdf_output_filename)
Tegen, I., P. Hollrigl, M. Chin, I. Fung, D. Jacob, and J. Penner 1997. Contribution of different aerosol species to the global aerosol extinction optical thickness: Estimates from model results. J. Geophys. Res., 102, 23895-23915.\u00a0\u21a9
Kinne, S., M. Schulz, C. Textor, S. Guibert, Y. Balkanski, S.E. Bauer, T. Berntsen, T.F. Berglen, O. Boucher, M. Chin, W. Collins, F. Dentener, T. Diehl, R. Easter, J. Feichter, D. Fillmore, S. Ghan, P. Ginoux, S. Gong, A. Grini, J. Hendricks, M. Herzog, L. Horowitz, I. Isaksen, T. Iversen, A. Kirkev\u00e5g, S. Kloster, D. Koch, J.E. Kristjansson, M. Krol, A. Lauer, J.F. Lamarque, G. Lesins, X. Liu, U. Lohmann, V. Montanaro, G. Myhre, J. Penner, G. Pitari, S. Reddy, \u00d8. Seland, P. Stier, T. Takemura, and X. Tie: An AeroCom initial assessment optical properties in aerosol component modules of global models, Atmos. Chem. Phys., 6, 1815-1834, 2006.\u00a0\u21a9
Morcrette, J.-J., O. Boucher, L. Jones, D. Salmond, P. Bechtold, A. Beljaars, A. Benedetti, A. Bonet, J. W. Kaiser, M. Razinger, M. Schulz, S. Serrar, A. J. Simmons, M. Sofiev, M. Suttie, A. M. Tompkins, and A. Untch, 2009: Aerosol analysis and forecast in the ECMWF Integrated Forecast System. Part I: Forward modelling, J. Geophys. Res., 114D, D06206,doi:10.1029/2008JD011235\u00a0\u21a9
Kinne, S., D. O'Donnel, P. Stier, S. Kloster, K. Zhang, H. Schmidt, S. Rast, M. Giorgetta, T. F. Eck, and B. Stevens (2013), MAC-v1: A new global aerosol climatology for climate studies, J. Adv. Model. Earth Syst., 5, 704--740, doi:10.1002/jame.20035.\u00a0\u21a9
Bozzo, A., Benedetti, A., Flemming, J., Kipling, Z., R\u00e9my, S. (2020). An aerosol climatology for global models based on the tropospheric aerosol scheme in the Integrated Forecasting System of ECMWF. Geoscientific Model Development, 13(3), 1007-1034.\u00a0\u21a9
Release 5.0 of COSMO and 2.0 of INT2LM do not support HWSD data, as the representation of the soil associated with this new data set has changed and is based on the use of pedotransfer functions and on fraction of soil components (e.g. clay, silt, ...)\u00a0\u21a9
Soiltypes written in bold indicate a special soiltype.\u00a0\u21a9
J.M. Hollisa, J. Hannamb and P.H. Bellamyb, February 2012, Empirically-derived pedotransfer functions for predicting bulk density in European soils, European Journal of Soil Science, 63, 96109 doi: 10.1111/j.1365-2389.2011.01412.x\u00a0\u21a9
J.H.M. Woesten, A. Lilly, A. Nemes and C. Le Bas, Development and use of a database of hydraulic properties of European soils, Geoderma, Volume 90, Issues 34, July 1999, Pages 169-185, doi: 10.1016/S0016-7061(98)00132-3.\u00a0\u21a9
derived from the land use data\u00a0\u21a9
derived from the land use data\u00a0\u21a9
derived from the lake data set\u00a0\u21a9
The general workflow of all Python modules is the same. An exemplary workflow of the Python modules is described below:
At the beginning of the program information about the environment on which EXTPAR is running is written to the logfile and all left-overs from prior executions of the same EXTPAR module are deleted. In a next step each parameter from the namelist namelist.py
is checked for correctness as well as assigned to an internal variable for later use in the program. The specifaction about the target grid is directly read from the Fortan namelist-files INPUT_grid_org
. The next step in the modules involves the generation of all necessary meta-data for the buffer files and the write of a namelist files in the style of a Fortran namelist, containing all information needed for the consistency_check at the end. In case of a COSMO target grid, a grid specification file is written, that is later used by CDO for the interpolation.
After this is all setup, the most compute-intensive parts like the remapping to the target grid or data modifications are done using CDO. The Python program launches a subshell executing the CDO in it. The output from CDO is reshaped in order to fit the dimensions of the buffer files. After the reshape, the fields and its corresponding metadata is written to a netCDF buffer file. The last step of the programme again deletes all intermediate netCDF or other files written during runtime, that do not serve any purpose.
Module-specific modifications or additional computations are described in the paragraph Data processing of each Python module.
"},{"location":"user_manual/user_manual_04_python_modules/#namelist","title":"Namelist","text":"The namelist namelist.py
contains the Python dictionaries input_alb
, input_tclim
, input_emiss
, input_ndvi
, input_ahf
, input_isa
and input_edgar
. These dictionaries replace their corresponding Fortran namelist files INPUT_
.
input_alb
provides information about the albedo data type and the paths and filenames of the input/output data.
input_tclim
contains a switch to determine the type of data (coarse or fine) as well as the paths and filenames of the input/output data.
input_emiss
contains a switch to determine the type of emissivity data (full range or long-wave) and the filename and paths of the input/output data.
input_ndvi
only provides information about the the path and the filenames of the input/output data.
input_era
only provides information about the the path and the filenames of the input/output data.
input_isa
contains a switch determine the type of ISA data and provides information about the the path and the filenames of the input/output data.
input_ahf
contains a switch determine the type of AHF data and provides information about the the path and the filenames of the input/output data.
input_edgar
only provides information about the the path and the filenames of the input/output data.
The executable extpar_alb_to_buffer allows the aggregation of two different kinds of albedo data to the target grid. The first kind is a climatology of monthly values of total albedo derived from MODIS satellite data for the 3 spectral bands visible, near infrared and ultraviolet. The second kind contains information for soil albedo only in dry and saturated conditions. It originates from the Community Land Model1.
"},{"location":"user_manual/user_manual_04_python_modules/#data-processing","title":"Data processing","text":"The data is remapped to the target grid using the distance-weighted average interpolation. CDO first generates the weights for the interpolation from one of the input files and then applies these weights to all input files. After the interpolation took place, all values in the range of -100000 - 0.02 are set to 0.02 to prevent unrealistic data-points. All other steps in extpar_alb_to_buffer are following the general workflow of the Python scrips.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output","title":"Used namelist files and data in-/output","text":"namelist files: namelist.py (dict: input_alb), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_ALB
data input: month_alb.nc, month_alnid.nc, month_aluvd.nc, global_soil_albedo.nc
data output: buffer file with albedo data (input_alb: alb_buffer_file)
The executable extpar_cru_to_buffer aggregates the temperature climatology of the Climate Research Unit (CRU) to the target grid. The namelist namelist.py
gives the information of the path and the name of the raw temperature climatology data file. Additionally, the filename for the buffer is provided. There is an integer switch (it_cl_type), which allows the choice between a newer higher resolved data set for land surfaces only (1) and an older coarser raw data set for sea surfaces in combination with the higher resolved data set over land (2). Aggregation of the coarse data set over land surfaces is no longer supported since EXTPAR Version 5.4.
The data processing with CDO for it_cl_type = 1 involves 4 steps:
Set seapoints in the data to missing value.
Extract the fields HSURF
from the fine data set.
Merge the fields from step 1 and step 2.
Remap data from step 3 to the target grid using distance-weighted average interpolation.
The data processing with CDO for it_cl_type = 2 involves 5 steps:
Convert coarse data from Celsius to Kelvin, calculate yearly mean values and remap coarse data to the grid of the higher resolved data set.
Take landpoints from the fine data set and the seapoints from the data processed in step 1.
Extract surface height from the buffer file of extpar_topo_to_buffer
Smooth data processed in step 2 and remap to target grid using distance-weighted average interpolation.
Correct data processed in step 4 with the surface height extracted in step 3.
All subsequent processing on the data follows the general workflow of the Python scripts.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_1","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_tclim), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_TCLIM
data input: absolute_hadcrut3.nc, CRU_T2M_SURF_clim.nc, CRU_T_SOIL_clim.nc, orography_buffer_file (it_cl_type = 2 only)
Output: buffer file with CRU data (input_tclim: t_clim_buffer_file)
The executable extpar_emiss_to_buffer aggregates CAMEL (Combined ASTER and MODIS Emissivity for Land) data to the target grid. For the aggregation of the emissivity the namelist namelist.py
provides the path and the file name of the input data. The buffer file name is defined as well. There exists the integer switch (iemiss_type) to determine whether one wants to use the broad band emissivity for the 3.6 and 14.3 micron spectral range (1) or the broad band emissivity between 8.0 and 13.5 micron spectral range (2).
After the generation of the interpolation weights artificial low values below 0.5 are set to -999. In a subsequent processing step -999 is set to the value for missing data. In order to not have missing data in the field to interpolate, all missing values are set to the values of its nearest neighbour. The last step involves the first order conservative interpolation to the target grid. After the remapping with CDO two additional fields are computed:
EMISS_MAX, the maximum EMISS value over 12 months
EMISS_MRAT, the monthly ratio with respect to the maximum EMISS
namelists files: namelist.py (dict: input_emiss) INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_EMISS
data input: CAM_bbe_full_2010-2015\u1e45c or CAM_bbe_lw_2010-2015\u1e45c
Output: buffer file with CAMEL data (input_emiss: emiss_buffer_file)
The executable extpar_ndvi_to_buffer aggregates NDVI data (Normalized Differential Vegetation Index) to the target grid. The namelist namelist.py
only contains the path and the file name of the raw NDVI data. No other parameters can be set.
For the aggregation of the normalized differential vegetation index the namelist namelist.py
is simple. It contains the path and the filename of the raw data set, as well as the names of the buffer. No other parameters can be set.
The remapping to the target grid uses the first order conservative interpolation. After the remapping with CDO two additional fields are computed:
NDVI_MAX, the maximum NDVI value over 12 months
NDVI_MRAT, the monthly ratio with respect to the maximum NDVI
namelists files: namelist.py (dict: input_ndvi), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_NDVI
data input: NDVI_1998_2003.nc
Output: buffer file with NDVI data (input_ndvi: ndvi_buffer_file)
The executable extpar_era_to_buffer aggregates ERA data (T2M, SST, W_SNOW and ORO) to the target grid. It replaces the two NetCDF-Files generated by ICON-REMAP at DWD. Note that this executable is for Icon-grids only.
For the aggregation of the ERA climatologies the namelist namelist.py
is simple again. It contains the type of ERA climatology (ERA5 (1) or ERA-I (2)) the path and the filenames of the raw data sets, as well as the names of the buffer. No other parameters can be set.
The remapping to the target grid uses the first order conservative interpolation. After the remapping with CDO the field W_SNOW is scaled by a factor 1000. No other processing steps take place.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_4","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_era), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_ERA
data input: ERA5_ORO_1990.nc, ERA5_SD_1990_2019.nc, ERA5_SST_1990_2019.nc and ERA5_T2M_1990_2019.nc ERA-I_ORO_1986.nc, ERA-I_SD_1986_2015.nc, ERA-I_SST_1986_2015.nc and ERA-I_T2M_1986_2015
Output: buffer file with ERA data (input_era: era_buffer_file)
The executable extpar_isa_to_buffer allows the aggregation or interpolation of data on the fraction of impervious surface area needed by TERRA_URB to the target grid.
For the aggregation of the ISA the namelist namelist.py
is simple again. It contains the type of ISA (NOAA (1) or EEA (2)) the path and the filenames of the raw data sets, as well as the names of the buffer. No other parameters can be set. Note that the underlying processing does not differ between different types of ISA
The remapping to the target grid uses the bilinear interpolation. No other processing steps take place.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_5","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_isa), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_ISA
data input: EEA_ISA_16bit_lonlat.nc( isa_type=2), NOAA_ISA_16bit_lonlat.nc (isa_type=1)
Output: buffer file with ISA data (input_isa: isa_buffer_file)
The executable extpar_ahf_to_buffer allows the aggregation or interpolation of data on the anthropogenic heat flux needed by TERRA_URB to the target grid.
For the aggregation of the AHF the namelist namelist.py
is simple again. It contains the type of AHF (2.5min (1) or 30sec (2)) the path and the filenames of the raw data sets, as well as the names of the buffer. No other parameters can be set. Note that the underlying processing does not differ between different types of AHF
The remapping to the target grid uses the bilinear interpolation. No other processing steps take place.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_6","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_ahf), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_AHF
data input: AHF_2006_2.5min_lonlat.nc (ahf_type=1),AHF_2006_NOAA_30sec_lonlat.nc (ahf_type=2)
Output: buffer file with AHF data (input_ahf: ahf_buffer_file)
The executable extpar_edgar_to_buffer allows the interpolation of global emission data for black carbon, organic carbon and sulfur dioxide needed for the 2D-Aerosol in ICON to the target grid.
The namelist contains only the path to the raw data, the raw data file names and the name of the buffer file.
The remapping to the target grid uses the first order conservative interpolation. No other processing steps take place.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_7","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_edgar), INPUT_grid_org, INPUT_ICON_GRID
generate namelist: INPUT_edgar
data input: v8.1_FT2022_AP_NH3_2022_TOTALS_flx.nc, v8.1_FT2022_AP_OC_2022_TOTALS_flx.nc, v8.1_FT2022_AP_BC_2022_TOTALS_flx.nc, v8.1_FT2022_AP_NOx_2022_TOTALS_flx.nc, v8.1_FT2022_AP_SO2_2022_TOTALS_flx.nc
Output: buffer file with EDGAR data (input_edgar: edgar_buffer_file)
The executable extpar_cdnc_to_buffer allows the interpolation of climatology data for cloud droplet number needed for the Cloud-Aerosol in ICON to the target grid.
The namelist contains only the path to the raw data, the raw data file names and the name of the buffer file.
The remapping to the target grid uses the first order conservative interpolation. No other processing steps take place.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_8","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_cdnc), INPUT_grid_org, INPUT_ICON_GRID
generate namelist: INPUT_cdnc
data input: cdnc_climatology_Q06.nc
Output: buffer file with cloud droplet number data (input_cdnc: cdnc_buffer_file)
https://svn-ccsm-inputdata.cgd.ucar.edu/trunk/inputdata/lnd/clm2/rawdata/mksrf_soilcol.081008.nc
Lawrence, P. J. and T. N. Chase (2007). \"Representing a new MODIS consistent land surface in the Community Land Model (CLM 3.0).\" Journal of Geophysical Research-Biogeosciences 112(G1).\\ Table 3.3 in: Oleson, K.W., D.M. Lawrence, G.B. Bonan, M.G. Flanner, E. Kluzek, P.J. Lawrence, S. Levis, S.C. Swenson, P.E. Thornton, A. Dai, M. Decker, R. Dickinson, J. Feddema, C.L. Heald, F. Hoffman, J.-F. Lamarque, N. Mahowald, G.-Y. Niu, T. Qian, J. Randerson, S. Running, K. Sakaguchi, A. Slater, R. Stockli, A. Wang, Z.-L. Yang, Xi. Zeng, and Xu. Zeng, 2010: Technical Description of version 4.0 of the Community Land Model (CLM). NCAR Technical Note NCAR/TN-478+STR, National Center for Atmospheric Research, Boulder, CO, 257 pp.\u00a0\u21a9
The EXTPAR software is subject to several limitations:
The ASTER domain can only be used from 60\u00b0N to 60\u00b0S. Be aware that an additional border of several gridpoints is needed if the topographically corrected parameters are desired. If the ASTER domain is exceeded a warning message is printed and the program extpar_topo_to_buffer is aborted.
The ASTER data shows some deficits, which are listed below:
Beyond 60 degrees north and south, the ASTER raw data set features several areas where no value is available e.g., over Finland (private communication with HIRLAM).
Some bogus regions may appear in complex topography. One of these regions is located near Grindelwald in Switzerland.
The ASTER data are subject to artefacts of the satellite fly-over bands. Discontinuities can be spotted at the borders of such bands. In high latitudes these bands are better visible than in the low latitudes.
As the correction of these deficits are time consuming no effort has been expended to remove these.
The ASTER data might be subject to a shift of a half gridpoint (15 meters) in both directions.
There is no 3 km filtered ASTER or MERIT/REMA data set to derive the subgrid scale orography (SSO
) parameters and the roughness length (z0
) for ASTER.
The HWSD raw data is in a test phase. Furthermore a new version of Int2lm and TERRA is needed to make use of these data sets.
The subsoil can only be used if the HWSD data is used for the topsoil. If the FAO and the HWSD data are combined a warning message is printed and the ldeep_soil parameter
is set to .FALSE.
.
The special points are only tested for the COSMO grid. Also it is not possible to use these corrections if the soil raw data set is HWSD.
Array-caching in the consistency_check is only supported for GCC compiler.
CAMS aersosl data iaot_type = 5
is only supported for Intel compiler.
EXTPAR uses 3 types of namelists in order to determine in which way data is processed.
INPUT_
)input_in namelist.py
)Whereas for the Fortran namelists and the Python dictionaries the user can specify parameters and filenames, the Fortran namelists generated during runtime by the Python scripts do not allow any user interaction.
"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_namelist_files","title":"Namelist files","text":"Namelist file Purpose Made by script Used by program INPUT_grid_org define target grid type runscriptextpar_consistency_check
, extpar_aot_to_buffer
, extpar_landuse_to_buffer
, extpar_topo_to_buffer
, extpar_cru_to_buffer
, extpar_ndvi_to_buffer
, extpar_soil_to_buffer
, extpar_flake_to_buffer
, extpar_isa_to_buffer
, extpar_ahf_to_buffer
, extpar_emiss_to_buffer
, extpar_hwsdART_to_buffer
INPUT_COSMO_GRID define target domain for COSMO grid runscript extpar_consistency_check
, extpar_aot_to_buffer
, extpar_landuse_to_buffer
, extpar_topo_to_buffer
, extpar_cru_to_buffer
, extpar_ndvi_to_buffer
, extpar_soil_to_buffer
, extpar_flake_to_buffer
, extpar_isa_to_buffer
, extpar_ahf_to_buffer
, extpar_emiss_to_buffer
, extpar_hwsdART_to_buffer
INPUT_ICON_GRID define target domain for ICON grid runscript extpar_consistency_check
, extpar_aot_to_buffer
, extpar_landuse_to_buffer
, extpar_topo_to_buffer
, extpar_cru_to_buffer
, extpar_ndvi_to_buffer
, extpar_soil_to_buffer
, extpar_flake_to_buffer
, extpar_isa_to_buffer
, extpar_ahf_to_buffer
, extpar_emiss_to_buffer
INPUT_ORO settings for orography data runscript extpar_topo_to_buffer
INPUT_OROSMOOTH settings for orography smoothing runscript extpar_topo_to_buffer
INPUT_RADTOPO settings for generating topographical shading fields runscript extpar_topo_to_buffer
INPUT_SCALE_SEP settings to control scale separation for SSO an Z0 calculation runscript extpar_topo_to_buffer
INPUT_LU settings for landuse data runscript extpar_landuse_to_buffer
INPUT_AOT settings for aerosol data runscript extpar_aot_to_buffer
INPUT_TCLIM settings for temperature data extpar_cru_to_buffer
extpar_consistency_check
INPUT_NDVI settings for NDVI data extpar_ndvi_to_buffer
extpar_consistency_check
INPUT_SOIL settings for soil data runscript extpar_soil_to_buffer
INPUT_FLAKE settings for lake data runscript extpar_flake_to_buffer
INPUT_ALB settings for albedo data extpar_albedo_to_buffer
extpar_consistency_check
INPUT_ISA settings for fraction of impervious surface area data extpar_isa_to_buffer
extpar_consistency_check
INPUT_AHF settings for anthropogenic heat flux data extpar_ahf_to_buffer
extpar_consistency_check
INPUT_EMISS settings for emissivity data extpar_emiss_to_buffer
extpar_consistency_check
INPUT_hwsdART settings for HWSD USDA data extpar_hwsdART_to_buffer
INPUT_edgar settings for EDGAR data extpar_edgar_to_buffer
extpar_consistency_check
INPUT_CDNC settings for cdnc data extpar_cdnc_to_buffer
extpar_consistency_check
INPUT_ERA settings for ERA data extpar_era_to_buffer
extpar_consistency_check
INPUT_CHECK settings for the consistency check runscript extpar_consistency_check
"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_grid_def","title":"Grid Definition","text":"The specification of the model type (COSMO or ICON) is done in the namelist file INPUT_grid_org, the detailed target grid description for the model domain has to be provided in the namelists files INPUT_COSMO_GRID or INPUT_ICON_GRID.
"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_grid_def_general","title":"General","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-grid_def-input_grid_org","title":"NAMELIST /grid_def/ (INPUT_grid_org)","text":"The namelist /grid_def/ defines the target grid type and the filenames with the namelists of the detailed target grid definition.
Parameter Type Default Unit Description igrid_type integer target grid type, 1 for ICON, 2 for COSMO domain_def_namelist character namelist file with domain definition domain_refinement character namelist file with domain refinement definition (e.g. for the ICON grid)"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_grid_def_icon","title":"ICON","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-icon_grid_info-input_icon_grid","title":"NAMELIST /icon_grid_info/ (INPUT_ICON_GRID)","text":"The namelist /icon_grid_info/ specifies the filenames and the directory of the Icon grid files with the coordinates of the Icon grid.
Parameter Type Default Unit Description icon_grid_dir character path to directory which contains the ICON grid file with the coordinates icon_grid_nc_file character (max_dom) filename of the ICON grid file with the coordinates"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_grid_def_cosmo","title":"COSMO","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-lmgrid-input_cosmo_grid","title":"NAMELIST /lmgrid/ (INPUT_COSMO_GRID)","text":"The COSMO grid is defined by a rotated latlon-grid.
Parameter Type Default Unit Description pollon real -170. deg longitude of the rotated north pole (in degrees, \\(E>0\\)) pollat real 32.5 deg latitude of the rotated north pole (in degrees, \\(N>0\\)) polgam real 0. deg longitude (in the rotated system) of the geographical north pole dlon real 0.08 deg grid point distance in zonal direction (in degrees) dlat real 0.08 deg grid point distance in meridional direction (in degrees) startlon_tot real -1.252 deg transformed longitude of the lower left grid point of the total domain (in degrees, \\(E>0\\)) startlat_tot real -7.972 deg transformed latitude of the lower left grid point of the total domain (in degrees, \\(N>0\\)) ie_tot integer 51 number of grid points in zonal direction je_tot integer 51 number of grid points in meridional direction ke_tot integer 0 number of grid points in vertical direction"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_orography","title":"Orography","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-oro_runcontrol-input_oro","title":"NAMELIST /oro_runcontrol/ (INPUT_ORO)","text":"Parameter Type Default Unit Description lcompute_sgsl logical .false. switch to activate subgrid-slope calculation"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-orography_raw_data-input_oro","title":"NAMELIST /orography_raw_data/ (INPUT_ORO)","text":"Parameter Type Default Unit Description itopo_type integer switch to choose an orography raw data set; 1 GLOBE, 2 ASTER, 3 MERIT/REMA lsso_param logical switch to choose if SSO parameters should be generated or not raw_data_orography_path character path to orography raw data ntiles_column integer GLOBE: 4 ASTER, MERIT/REMA: x number of tile columns of desired region ntiles_row integer GLOBE: 4 ASTER, MERIT/REMA: x number of tile rows of desired region topo_files character filenames of GLOBE (16 tiles) / ASTER (240 tiles)/ MERIT/REMA (72 tiles) raw data sets lsubtract_mean_slope logical .FALSE. for operational NWP-ICON treatment of mean slope in computation of SSO parameters for ICON"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-orography_io_extpar-input_oro","title":"NAMELIST /orography_io_extpar/ (INPUT_ORO)","text":"Parameter Type Default Unit Description orography_buffer_file character name for orography buffer file orography_output_file character name for orography output file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-sgsl_io_extpar-input_oro","title":"NAMELIST /sgsl_io_extpar/ (INPUT_ORO)","text":"Parameter Type Default Unit Description lpreproc_oro logical .false. read S_ORO from existing NetCDF (.false.) or preprocess from raw topography datasets (.true.) sgsl_files character filenames of raw data tiles to be used S_ORO_A10 to S_ORO_P10 (GLOBE) or S_ORO_T001 to S_ORO_T240"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-orography_smoothing-input_orosmooth","title":"NAMELIST /orography_smoothing/ (INPUT_OROSMOOTH)","text":"Parameter Type Default Unit Description lfilter_oro logical FALSE Cosmo-only: switch for orogaphy smoothing ilow_pass_oro integer 0 type of orogaphy smoothing and stencil width numfilt_oro integer 1 number of filter applications eps_filter real 10 smoothing parameter (\"strength\" of the filtering) ifill_valley integer 1 fill valleys before or after oro smoothing (1: before, 2: after) rfill_valley real 0 m mask for valley filling (threshold value) ilow_pass_xso integer 1 type of orogaphy eXtra SmOothing and stencil width (for steep orography) numfilt_xso integer 1 number of applications of the eXtra filter lxso_first logical FALSE eXtra SmOothing before or after orography smoothing (TRUE/FALSE) rxso_mask real 0 m mask for eXtra SmOothing (threshold value)"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-radtopo-input_radtopo","title":"NAMELIST /radtopo/ (INPUT_RADTOPO)","text":"Parameter Type Default Unit Description lradtopo logical Switch for radiation corrected topography parameters. Not recommended to use if orographical smoothing is false and smoothing is performed in Int2lm later, because of resulting inconsistencies. nhori integer 24 Number of horizon angles radius integer 40000 m Icon-only: Radial distance considered for computation of horizon min_circ_cov integer 1 - Icon-only: Number of gridcells to be skipped at circumference of circle. A value of 1 considers all points, whereas a value of 5 only consider every fifth point at the circumference. Note that the effect of this switch is dependent on the resolution of the grid as well on the radius choosen. max_missing real 0.9 - Icon-only: Upper limit for fraction of missingness for the horizon parameter. Grid-cells with values above will be set to 0. itype_scaling integer 2 - Icon-only: Power of the caling factor SIN(horizon-angle) applied to the geometric skyview factor to account for the anisotropic nature of longwave radiation."},{"location":"user_manual/user_manual_06_namelist_input/#namelist-scale_separated_raw_data-input_scale_sep","title":"NAMELIST /scale_separated_raw_data/ (INPUT_SCALE_SEP)","text":"Parameter Type Default Unit Description lscale_separation logical Switch for scale separation. It can only be used in combination with GLOBE as raw data set. raw_data_scale_sep_path character path to 3 km filtered topography scale_sep_files character filename of 3 km filtered topography"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_lu","title":"Land Use Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-lu_raw_data-input_lu","title":"NAMELIST/lu_raw_data/
(INPUT_LU)","text":"Parameter Type Default Unit Description raw_data_lu_path
character path to land use data raw_data_lu_filename
character filename of land use raw data i_landuse_data
integer switch to choose a land use raw data set: 1 Globcover2009, 2 GLC2000, 3 GLCC, 5 ESA CCI-LC, 6 Ecoclimap-SG l_use_corine
logical .false. switch to use Corine land use dataset; only possible if i_landuse_data = 1
ilookup_table_lu
integer switch to choose a lookup table: - GLC2000 and GLCC: 1: operational settings of GME (Ritter, 2007) 2: operational settings of COSMO (Heise, 2005) 3: experimental setting, analogous to lookup tables of ECOCLIMAP (Asensio 2010) - GLOBCOVER 2009: 1: operational settings (Asensio, 2011) 2: experimental settings, analogous to lookup tables of ECOCLIMAP (Asensio 2010) - ESA CCI-LC: 1: experimental settings (Helmert, 2019) - Ecoclimap-SG: 1: Globcover analogue with added LCZs from Oke ntiles_globcover
integer 6 number of tiles for GLOBCOVER data ncolumn_tiles
integer number of columns in tile matrix l_terra_urb
logical .false. switch to use TERRA-URB (see TERRA-URB); only possible if i_landuse_data = 6
"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-glcc_raw_data-input_lu","title":"NAMELIST /glcc_raw_data/
(INPUT_LU)","text":"Parameter Type Default Unit Description raw_data_glcc_path
character path to GLCC data raw_data_glcc_filename
character filename of GLCC raw data ilookup_table_glcc
integer switch to choose a lookup table: 1: operational settings of GME (Ritter, 2007) 2: operational settings of COSMO (Heise, 2005) 3: experimental setting, analogous to lookup tables of ECOCLIMAP (Asensio 2010)"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-glcc_io_extpar-input_lu","title":"NAMELIST /glcc_io_extpar/
(INPUT_LU)","text":"Parameter Type Default Unit Description glcc_buffer_file
character name for GLCC buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_aot","title":"Aerosol Optical Depth","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-aerosol_raw_data-input_aot","title":"NAMELIST /aerosol_raw_data/
(INPUT_AOT)","text":"Parameter Type Default Unit Description raw_data_aot_path
character path to aerosol raw data raw_data_aot_filename
character filename of aerosol raw data iaot_type
integer 1 index to specify AOD raw data set: 1:Tegen, 2:AeroCom, 3:MACC-II, 4:MACv2, 5:CAMS"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-aerosol_io_extpar-input_aot","title":"NAMELIST /aerosol_io_extpar/
(INPUT_AOT)","text":"Parameter Type Default Unit Description aot_buffer_file
character name for aerosol buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_cru","title":"Climatological 2m Temperature","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_tclim-namelistpy","title":"DICT input_tclim
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_t_clim_path
character path to T2m climatology data raw_data_t_clim_coarse
character filename of coarse T2m climatology data raw_data_t_clim_fine
character filename of fine T2m climatology data it_cl_type
integer switch to choose between the new and fine (1) and the old and coarse over sea and the fine over land (2) raw data set. Note that the fine data set (1) is topographically corrected. t_clim_buffer_file
character name for T_clim buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#ndvi-data","title":"NDVI Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_ndvi-namelistpy","title":"DICT input_ndvi
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_ndvi_path
character Path to NDVI raw data raw_data_ndvi_filename
character Filename of NDVI raw data ndvi_buffer_file
character Name for NDVI buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#edgar-data","title":"EDGAR Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_edgar-namelistpy","title":"DICT input_edgar
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_edgar_path
character Path to EDGAR raw data raw_data_edgar_filename_bc
character Filename of EDGAR black carbon raw data raw_data_edgar_filename_oc
character Filename of EDGAR organic carbon raw data raw_data_edgar_filename_so2
character Filename of EDGAR sulfur dioxide raw data raw_data_edgar_filename_nh3
character Filename of EDGAR ammonia raw data raw_data_edgar_filename_nox
character Filename of EDGAR nitrogen oxides raw data"},{"location":"user_manual/user_manual_06_namelist_input/#cdnc-data","title":"CDNC Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_cdnc-namelistpy","title":"DICT input_cdnc
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_cdnc_path
character Path to CDNC raw data raw_data_cdnc_filename
character Filename of CDNC raw data"},{"location":"user_manual/user_manual_06_namelist_input/#hwsdart-data","title":"hwsdART Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-hwsdart_nml-input_hwsdart","title":"NAMELIST /hwsdART_nml/
(INPUT_hwsdART
)","text":"Parameter Type Default Unit Description raw_data_hwsdART_path
character Path to hwsdART raw data raw_data_hwsdART_filename
character Filename of hwsdART raw data hwsdART_output_file
character Name for hwsdART output file"},{"location":"user_manual/user_manual_06_namelist_input/#soil-data","title":"Soil Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-soil_raw_data-input_soil","title":"NAMELIST /soil_raw_data/
(INPUT_SOIL
)","text":"Parameter Type Default Unit Description isoil_data
integer Switch to choose between raw soil data, 1: FAO, 2: HWSD, 3: HWSD with terra mapping ldeep_soil
logical Switch for deep soil, set to .TRUE.
if using HWSD data raw_data_soil_path
character Path to soil raw data raw_data_soil_filename
character Filename of soil raw data raw_data_deep_soil_filename
character Filename of deep soil raw data"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-soil_io_extpar-input_soil","title":"NAMELIST /soil_io_extpar/
(INPUT_SOIL
)","text":"Parameter Type Default Unit Description soil_buffer_file
character Name for soil buffer file soil_buffer_file_consistent
character Name for soil buffer file after consistency check soil_output_file_consistent
character Name for soil output file after consistency check"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-hwsd_index_files-input_soil","title":"NAMELIST /HWSD_index_files/
(INPUT_SOIL
)","text":"Parameter Type Default Unit Description path_HWSD_index_files
character Path to HWSD lookup tables lookup_table_HWSD
character Lookup table to convert soil type index from global to TERRA soil type HWSD_data
character Lookup table for sand, silt, clay, organic carbon, and bulk density (topsoil) HWSD_data_deep
character Lookup table for sand, silt, clay, organic carbon, and bulk density (subsoil) HWSD_data_extpar
character Parameter for development purposes"},{"location":"user_manual/user_manual_06_namelist_input/#freshwater-lake-data","title":"Freshwater Lake Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-flake_raw_data-input_flake","title":"NAMELIST /flake_raw_data/
(INPUT_FLAKE
)","text":"Parameter Type Default Unit Description raw_data_flake_path
character Path to flake raw data raw_data_flake_filename
character Filename of flake raw data"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-flake_io_extpar-input_flake","title":"NAMELIST /flake_io_extpar/
(INPUT_FLAKE
)","text":"Parameter Type Default Unit Description flake_buffer_file
character Name for flake buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#albedo-data","title":"Albedo Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_alb-namelistpy","title":"DICT input_alb
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_alb_path
character Path to raw albedo data raw_data_alb_filename
character Filename of raw albedo data raw_data_alnid_filename
character Filename of raw NIR-albedo data raw_data_aluvd_filename
character Filename of raw UV-albedo data ialb_type
integer Switch to indicate albedo type: 1: total albedo, 2: soil albedo, 3: as 1 without NI and UV fields alb_buffer_file
character Name for albedo buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_isa","title":"ISA Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_isa-namelistpy","title":"DICT input_isa
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_isa_path
character path to ISA raw data raw_data_isa_filename
character filename of ISA raw data isa_type
integer type of used ISA data source isa_buffer_file
character name for ISA buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_ahf","title":"AHF Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_ahf-namelistpy","title":"DICT input_ahf
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_ahf_path
character path to AHF raw data raw_data_ahf_filename
character filename of AHF raw data iahf_type
integer type of used AHF data source ahf_buffer_file
character name for AHF buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_emissivity","title":"Emissivity Parameter","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_emiss-namelistpy","title":"DICT input_emiss
(namelist.py)","text":"Parameter Type Default Unit Description iemiss_type
integer switch to choose between full-range (1) and long-wave (2) emissivity data raw_data_emiss_path
character path to emissivity parameter raw data raw_data_emiss_filename
character filenames of emissivity raw data emiss_buffer_file
character name for emissivity parameter buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_era","title":"ERA Parameter","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_era-namelistpy","title":"DICT input_era
(namelist.py)","text":"Parameter Type Default Unit Description iera_type
integer type of ERA climatology: ERA5 (1) and ERA-I (2) raw_data_era_path
character path to ERA raw data raw_data_era_ORO
character filenames of ERA ORO raw data raw_data_era_SD
character filenames of ERA SD raw data raw_data_era_T2M
character filenames of ERA T2M raw data raw_data_era_SST
character filenames of ERA SST raw data era_buffer_file
character name for ERA parameter buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_consistency_check","title":"Consistency Check","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-extpar_consistency_check_io-input_check","title":"NAMELIST /extpar_consistency_check_io/
(INPUT_CHECK)","text":"Parameter Type Default Unit Description l_use_array_cache
flag F flag indicating whether mmap-caching is used (reduces memory consumption but increases runtime) netcdf_output_filename
character filename for NetCDF output i_lsm_data
integer integer switch to choose if an external land-sea mask is desired (0: no, 1: use external land-sea mask) land_sea_mask_file
character name of the file used as the external land-sea mask number_special_points
integer number of points that should be treated specially (max value: 3, choose 0 if not needed) lwrite_netcdf
logical T flag indicating whether NetCDF output for COSMO grid is desired tile_mode
integer 0 if activated (tile_mode=1
), process output for ICON tile structure lflake_correction
logical T if activated, fr_lake
values of grid points next to the ocean are set to ocean values, and the lake depth value is set to undefined (default in EXTPAR version 4.0, but not in DWD EXTPAR version 2.10)"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-special_points-input_sp_1","title":"NAMELIST /special_points/
(INPUT_SP_1)","text":"Modifications for Falkenberg.
Parameter Type Default Unit Descriptionlon_geo_sp
real 14.115 deg east longitude coordinate of the special point lat_geo_sp
real 52.156 deg north latitude coordinate of the special point soiltype_sp
real 3.0 - soil type of the special point z0_sp
real 0.03 m roughness length of the special point rootdp_sp
real 0.6 m rooting depth of the special point plcovmn_sp
real 0.55 1 plant cover minimum of the special point plcovmx_sp
real 0.8 1 plant cover maximum of the special point laimn_sp
real 0.5 1 leaf area index minimum of the special point laimx_sp
real 2.5 1 leaf area index maximum of the special point for_d_sp
real 1 ground fraction covered by deciduous forest at the special point for_e_sp
real 1 ground fraction covered by evergreen forest at the special point fr_land_sp
real 1 fraction land cover of the special point"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-special_points-input_sp_2","title":"NAMELIST /special_points/
(INPUT_SP_2)","text":"Modifications for Waldstation.
Parameter Type Default Unit Descriptionlon_geo_sp
real 13.954 deg east longitude coordinate of the special point lat_geo_sp
real 52.186 deg north latitude coordinate of the special point soiltype_sp
real 3.0 - soil type of the special point z0_sp
real 0.78 m roughness length of the special point rootdp_sp
real 0.6 m rooting depth of the special point plcovmn_sp
real 0.79 1 plant cover minimum of the special point plcovmx_sp
real 0.81 1 plant cover maximum of the special point laimn_sp
real 3.0 1 leaf area index minimum of the special point laimx_sp
real 4.0 1 leaf area index maximum of the special point for_d_sp
real 1 ground fraction covered by deciduous forest at the special point for_e_sp
real 1 ground fraction covered by evergreen forest at the special point fr_land_sp
real 1 fraction land cover of the special point"}]}
\ No newline at end of file
+{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Home","text":""},{"location":"#general-information","title":"General Information","text":"EXTPAR (External Parameters for Numerical Weather Prediction and Climate Application) is an official software of the COSMO Consortium . It is used to prepare the external parameter data files that are used as input for the COSMO and the ICON model.
The code is written in Fortran 90 and in Python. The Python scripts use CDO (Climate Data Operators) for the most compute-intensive parts. The code is also accelerated in some places with OpenMP parallelization.
Once compiled, the code generates 6 Fortran executables and 9 Python scripts, which can be run simultaneously except for the final extpar_consistency_check.exe, which is used to tie together all the external parameter results into one output file.
Information about the latest changes can be found in the Release Notes on GitHub .
The technical and scientific documentation can be found in the User and Implementation Guide.
"},{"location":"#quick-start","title":"Quick Start","text":""},{"location":"#container","title":"Container","text":"The easiest way to use EXTPAR is through the container provided with Dockerfile . A ready-to-use image can be downloaded from C2SM docker hub or even simpler via CLI:
docker pull c2sm/extpar:tagname\n
Alternatively, an image is provided as an asset of each release
"},{"location":"#wrapextpar","title":"WrapExtpar","text":"The image provides a wrapper that only requires to set basic options, all other details are handled by the wrapper.
The wrapper needs two different kinds of input:
1. EXTPAR settings as JSON, see official docs
{\n \"extpar\": {\n \"igrid_type\": 1,\n \"iaot_type\": 1,\n \"ilu_type\": 1,\n \"ialb_type\": 1,\n \"isoil_type\": 1,\n \"itopo_type\": 1,\n \"lsgls\": false,\n \"lfilter_oro\": false,\n \"lurban\": false\n }\n}\n
2. Execution options
--input-grid INPUT_GRID\n COSMO: Fortran Namelist \"INPUT_COSMO_GRID\", ICON: Icon\n grid file\n --raw-data-path RAW_DATA_PATH\n Path to folder \"linked_data\" of exptar-input-data\n repository\n --run-dir RUN_DIR Folder for running EXTPAR\n --account ACCOUNT Account for slurm job\n --host HOST Host\n --no-batch-job Run jobscript not as batch job\n
An example call could look like
docker run -v /c2sm-data/extpar-input-data:/data \\\n -v /icon-grids:/grid \\\n -v /my_local_dir:/work \\\n extpar \\ \n python3 -m extpar.WrapExtpar \\\n --run-dir /work \\\n --raw-data-path /data/linked_data \\\n --account none \\\n --no-batch-job \\\n --host docker \\\n --input-grid /grid/icon_grid.nc \\\n --extpar-config /work/config.json\n
Below is a more detailed explanation about the mounted volumes:
-v /c2sm-data/extpar-input-data:/data
: Mounts the input data at /data
inside the container. This should be aligned with the --raw-data-path
argument.-v /icon-grids:/grid
: Mounts a local folder with icon grids under /grid
inside the container. This should be aligned with the --input-grid
argument.-v /my_local_dir:/work
: Mounts a local folder for EXTPAR output at /work
inside the container. This should be aligned with the --run-dir
argument.For those who require a more custom setup of EXTPAR or need settings that are not possible to specify through the wrapper, you can run each executable within the image too. For example:
docker run extpar bash -c \"extpar_topo_to_buffer\"\n
"},{"location":"#bare-metal-build-on-levante","title":"Bare Metal Build on Levante","text":"The installation steps are
git clone --recursive git@github.com:C2SM/extpar.git\ncd extpar\ngit submodule update\n./configure.levante.gcc\nsource modules.env\nmake -j 4\n
Furthermore copy all the .exe
and .py
files from bin
to the directory in which the namelist and all required input-data is present.
You do then have two choices to run EXTPAR:
PYTHONPATH
variable such that it includes to the python/lib
folder of the source repositoryAfter you prepared EXTPAR (see above), you have two options to install and run the software.
"},{"location":"#option-1-pythonpath","title":"Option 1: PYTHONPATH","text":"If you like to run the EXTPAR scripts without installing a package, make sure to have the python/lib
folder in your PYTHONPATH
variable. You can do this via
export PYTHONPATH=$PYTHONPATH:$(pwd)/python/lib\n
Afterwards you can cd
into the bin/
directory and run the corresponding executables, e.g.
cd bin\n./extpar_aot_to_buffer.exe\n
For more detailed compilation instructions see: compile_run
"},{"location":"#option-2-build-and-install-a-python-package","title":"Option 2: Build and install a python package","text":"Alternatively you can build a python package and install it to your libraries. This has the advantages that the executables can be ran from anywhere in the system without the need to copy the executables themselves.
To build the package, now run
python setup.py sdist\n
You can then install it via
pip install dist/extpar-*.tar.gz\n
Note
If you do not have the permissions to install it into the system-wide python library, it will be installed for your user account only (you can also add the --user
flag to pip
to force this behaviour).
If you did not install extpar
into the system libraries, make sure that the bin
folder of your local user is on your PATH
variable to be able to run the EXTPAR scripts. This is usually done via
export PATH=\"$HOME/.local/bin:$PATH\"\n
You can then call the functionalities of WrapExtpar.py
via
python -m extpar.WrapExtpar\n
or import the script in Python via
from extpar.WrapExtpar import generate_external_parameters\n
Or you call the executable scripts in your run directory, e.g.
extpar_aot_to_buffer.exe\n
"},{"location":"#input-data","title":"Input Data","text":""},{"location":"#data-location","title":"Data Location","text":"In order to run EXTPAR, input data files for the external parameter variables are needed. The data is provided on all supported machines:
Levante (DKRZ)co2 (ETHZ)/work/pd1167/extpar-input-data/linked_data\n
/c2sm-data/extpar-input-data\n
The input data files are also stored in a git-LFS data repository found at: https://gitlab.dkrz.de/extpar-data/extpar-input-data . Instructions to download or update the input data files can be found in this repository. To gain access to the git-LFS input data repository, contact the EXTPAR source code administrator.
"},{"location":"#testing","title":"Testing","text":"The EXTPAR code comes with a technical testsuite to ensure the accuracy of the results. Weekly tests run for compilers:
For more information about how the testsuite can be run or new test added see testsuite-documentation
"},{"location":"#information-for-developers","title":"Information for Developers","text":"In case you want to contribute to EXTPAR please have a look at our coding rules and development workflow.
"},{"location":"#support","title":"Support","text":"In the case of issues or questions, please create an issue on GitHub .
"},{"location":"SUMMARY/","title":"SUMMARY","text":"Since Version 5.4, EXTPAR is built with an autotools based build-system. This has been necessary to accomodate for the additional C source code files and newly required libraries.
There are three options to compile Extpar:
"},{"location":"compile_run/#in-source-build","title":"In-source build","text":"./configure.<hostname>.<compiler>\nsource modules.env \nmake \n
"},{"location":"compile_run/#out-of-source-build","title":"Out-of-source build","text":"mkdir build-<my_self_defined_note>\ncd build-<my_self_defined_note>\npath/to/extpar/installation/configure.<hostname>.<compiler>\nsource modules.env \nmake \n
"},{"location":"compile_run/#install-binaries-only-in-external-directory","title":"Install binaries only in external directory","text":"./configure.<hostname>.<compiler> --prefix=<my_external_directory>\nsource modules.env \nmake install \n
The binaries will be installed in my_external_directory/bin
.
make distclean \n
"},{"location":"compile_run/#configure-for-new-machines","title":"Configure for new machines","text":"The first step in creating a new machine setup is to take one of the existing configure wrapper scripts and adapt it to your local environment. The scripts are called configure.<hostname>.<compiler>
.
The Fortran executables
can simply be copied to the run/
directory.
The main python scripts
can be treated like the Fortran binaries and copied to the run/
directory. Make sure the namelist.py is also present in the run/
directory.
All self-written Python modules are stored in python/lib
and do not need to be copied to the respective run directory, but the environment variable PYTHONPATH
needs to be set to the following:
export PYTHONPATH=$PYTHONPATH:<absolute_path_to_python>/lib\n
Some runscript examples are available under run_scripts
. Just adapt them to your needs!
EXTPAR contains Fortran Code as well as hybrid Python-CDO scripts. Both code bases need external libraries and installations.
"},{"location":"dependencies/#libraries","title":"Libraries","text":""},{"location":"dependencies/#fortran","title":"Fortran","text":"EXTPAR needs the following libraries for the Fortran-Code:
EXTPAR needs the following Python packages and installations:
The module netCDF is the Python interface to the netCDF C library. It allows the user create and manipulate netCDF files with Python. For more detailed information please visit netCDF Python .
Additionally, an installation of CDO (Climate Data Operators) is required. All necessary information about this tool can be found at CDO-MPI.
Be sure that these libraries are installed on your system or install them yourself by following the installation instructions provided with the libraries.
"},{"location":"dependencies/#on-the-dkrz-machine-levante","title":"On the DKRZ machine Levante","text":"All the required libraries are already installed on the DKRZ machine.
"},{"location":"development/","title":"Information for EXTPAR Developers","text":""},{"location":"development/#git-and-github","title":"Git and Github","text":"The EXTPAR code is developed using the Git version control system and the Github web interface . Outstanding bugs and requested features are tracked using the Issues section of the Github repository. Additionally, automated testing of newly developed features is integrated into the Github interface using the Jenkins CI tool.
"},{"location":"development/#main-branches","title":"Main branches","text":"The master branch is protected and only the core development team is allowed to modify the master branch. All tags and releases are based on this branch.
"},{"location":"development/#supporting-branches","title":"Supporting branches","text":"Any new code development should be done in a topic branch. Topic branches are merged back into master by opening a pull request. Code must be peer reviewed by the source code administrator.
Supporting branches are removed once successfully merged in the master branch.
"},{"location":"development/#developments-with-new-input-data-sets","title":"Developments with new input data sets","text":"Any new EXTPAR code that is accompanied by a new input data file or files should be added with a simultaneous pull request in both this code repository (for the code changes) and in the extpar-input-data repository (for the addition of the input data files). The topic branch for both pull requests should have the same name, in order to enable the synchronization of the code and input-data repositories.
"},{"location":"development/#testing-new-developments","title":"Testing new developments","text":"Once a developer has finished developing a new feature or bug fix, they should make a pull request on the Github repository from their topic branch into the master-branch. Then, they should write the following comment into the pull request conversation:
launch jenkins\n
This will start the automated testing, and the code will be compiled and tested on co2 (ETH) and Levante (DKRZ).
If the tests fail, then the developer should fix the issues and resubmit the testing on Jenkins. Once all of the tests are passing, then they should notify the source code administrator that the pull request is ready for review and merging into the master-branch.
"},{"location":"development/#fortran-code","title":"Fortran Code","text":""},{"location":"development/#logging","title":"Logging","text":"In case you want to add some additional prints in EXTPAR, please use the logger described below.
CALL the built-in logger-functions in order to print messages or variables in the specific logfile of each EXTPAR executable. The logger has three different levels of messages to print:
logging%info(your_message)
: info-prints for better orientation during code execution, variables or other stuff.
logging%warning(your_message)
: warnings, like wrong namelist-inputs, unsupported NetCDF versions or problems with some data points.
logging%error(your_message, __FILE__,__LINE__)
: errors that occur during I/O, allocation, that requires an abort of EXTPAR.
As your_message needs to be a sequence of characters, use
WRITE(message_text,*)var_x, 'is now', var_y\n
and then
CALL logging%inf0(message_text) \n
to print the values of var_x
and var_y
to the logfile.
For quick debugging-prints ONLY use
WRITE(logging%fileunit,*)var_x, 'is now', var_y \n
"},{"location":"development/#coding-rules-and-best-practices","title":"Coding Rules and Best Practices","text":"All features available in Fortran 2008 as far as supported by Intel, GCC, and NAG are allowed.
Use up to the allowed 132 character per line, but not more. Note that this includes comments.
Indentation rules:
Code feature Num. of indentation characters program indentation 2 type definition 2 do loops 2 if constructs 2 continuation 5 (with leading &) all directives 0Always use IMPLICIT NONE
and PRIVATE
/PUBLIC
once only in modules header.
Do not add USE
statements after CONTAINS
.
Fortran keywords should be in capital letters with the exception of len
, in
, out
, and inout
.
Do not use tabs, deprecated, or obsolete features.
Do not overspecify declarations - especially if standard types are expected.
In case you want to add some additional prints in EXTPAR, please use the logger described below.
CALL the built-in logger-functions in order to print messages or variables in the specific logfile of each EXTPAR executable. The logger can print variables as well as strings. Use formatted strings (f'
) in case you want to combine variables and strings. The logger has 4 different levels of messages to print:
logging.debug(your_message)
: Mean/Max/Min of variables needed for development, more detailed information about code execution.
logging.info(your_message)
: info-prints for better orientation during code execution, variables or other stuff.
logging.warning(your_message)
: warnings, like wrong namelist-inputs, unsupported NetCDF versions or problems with some data points.
logging.error(your_message)
: errors that occur during I/O, allocation or wrong namelist parameters, that requires an abort of EXTPAR. The programm does not stop automatically after the call of logging.error, so a raise
follows the logging.error()
Default logging level is info, so only messages from logging.info()
, logging.warning()
and logging.error()
are written to the logfile. Adjust the level of the logger right at the beginning of each Python executable to level=logging.DEBUG
to also print logging.debug()
.
The Python code needs to fulfill the Pep8 coding standard . A GitHub action automatically formats Python code for you.
"},{"location":"release_notes/","title":"Release notes","text":"For the latest release notes, please see our GitHub webpage .
"},{"location":"release_notes/#514","title":"5.14","text":"extpar_cdnc_to_buffer
for ICONextpar_edgar_to_buffer
for ICONi_landuse_data=6
in INPUT_LU
l_terra_urb=.true.
in INPUT_LU
to process additional urban fieldsECOCLIMAP_SG.nc
extpar_hwsdART_to_buffer
INPUT_hwsdART
defines key parametersWrapExtpar.py -h
for more infosraise
instead of sys.exit(1)
to abort scriptsThis is a minor release to fix cdo version on Levante * CDO-version fixed to 2.0.5 because later versions exit with non-zero exit status for cdo -V
This is a minor release with fixes for Levante at DKRZ, a cleanup of MCH runscripts and a bugfix for in consistency_check * CDO version change from 1.9.10 to 2.0.5 on Levante at DKRZ - Fields from Python-CDO scripts changed up to 10e-4! - Many (even large) adjustements of the tolerances in the testsuite - Result on other machines remain unchanged * Fix for array out-of-bounds with special points outside of target domain * Abort Extpar in consistency check if compiler not GCC * Cleanup and update runscripts for models run at MeteoSwiss
"},{"location":"release_notes/#591","title":"5.9.1","text":"This is a minor release to support Levante at DKRZ and drop the support for Intel * Support GCC on Levante * Remove configure-wrappers for Mistral * Remove Intel references in testsuite
"},{"location":"release_notes/#59","title":"5.9","text":"This is an intermediate release with OpenMP optimizations, a bugfix for topography and and some cleanup * OpenMP optimizations for domains crossing date-line in the following parts - extpar_landuse_to_buffer - extpar_topo_to_buffer * Update runscripts - ETH domain with Merit topography - EU-Cordex domain with Globe topography * Cleanup - Remove all leftovers from old build-system - Remove output for vertices - Around 10% speedup
This is an intermediate release with changes for the upgrade of Piz Daint, support for Merit topography for COSMO and a revised algorithm for SGSL processing * Daint upgrade - export PMI_NO_PREINITIALIZE=1 to avoid unwanted prints from CDO - New paths for Python virtual environment: - Daint: /project/g110/extpar/venv_daint - Tsa: /project/g110/extpar/venv_tsa * Merit for COSMO - Enable itopo_type=3 for COSMO grid - Testing performed by Christian Steger from Hymet-group at ETH-IAC * Revised algorithm for SGSL preprocessing - Infer values of boundary points for SGSL - Deactivate SGSL for ASTER due to inconsistencies. For detailed information see the PR .
"},{"location":"release_notes/#574","title":"5.7.4","text":"This is a minor release with an adaption in the SSO-computation and replacement of ksh with bash * Revised SSO for ICON - Experiments at DWD showed an improvement of model results with different SSO-thresholds, see this wiki entry for more information. - Lowering of threshold from 10.0 to 1.0 changes the following fields - SSO_GAMMA - SSO_OROMAX - SSO_OROMIN - SSO_SIGMA - SSO_STDH - SSO_THETA - topography_c (only in testcase mpim/icon_r2b4)
This is a minor release with two technical improvements. * Python-CDO - Automatic detection if CDO contains thread-safe HDF5 library * extpar_topo_to_buffer - Reduce memory usage for option lsubstract_mean_slope=.TRUE.
"},{"location":"release_notes/#572","title":"5.7.2","text":"This is a minor release with an update for the Python environment on Mistral and refactored docs. * Python on Mistral - Replace anaconda3/bleeding_edge with python3/unstable * Docs - Remove outdated documentation - Make docs about testsuite and compilation more comprehensive - Quickstart for all supported machines
"},{"location":"release_notes/#571","title":"5.7.1","text":"This is a minor release with two bugfixes, one for the build-system and one for extpar_topo_to_buffer. * Build-system: - Install Python-CDO script in bin-folder directly in Makefile - Out-of-source build include Python-CDO scripts as well * extpar_topo_to_buffer: - Abort Extpar for itopo_type = 3
"},{"location":"release_notes/#57","title":"5.7","text":"This is an intermediate release that introduces two Python-CDO scripts, modifications for reduced memory usage for non-global grids and a bugfix for the CAMS-aersosol dataset. * extpar_isa_to_buffer - Replace Fortran code with Python-CDO - Change in results for fields - Impervous Surface Area (ISA) - Read the users guide for detailed information about details of the implementation of extpar_isa_to_buffer * exptar_ahf_to_buffer - Replace Fortran code with Python-CDO - Change in results for fields - Antropogenic Heat Flux (AHF) - Read the users guide for detailed information about details of the implementation of extpar_ahf_to_buffer * Reduce memory usage for Python-CDO - Automatic determination of the extent of the target grid - Use CDO operator -sellonlat to read subset of input data * Bugfix for CAMS dataset - Remove assertion for GCC-compiler - Fix wrong dimensions in meta-data for the ICON-grid
"},{"location":"release_notes/#56","title":"5.6","text":"This is an intermediate release that introduces a new topography dataset and the CAMS-aerosol climatologies, OpenMP support for CSCS-machines, enhanced testing on CSCS-machines, a script to extract the input-data from namelist, progress bars for logfiles of extpar_topo_to_buffer and consistent names for all logfiles.
This is a minor release that fixes the inconsistent usage of netCDF versions across Extpar and small documentation changes.
This is an intermediate release that brings enhanced namelist parsing for the Python-CDO scripts, a new Python-CDO script extpar_era_to_buffer.py to replace the former way of remapping ERA-climatologies using Icontools, a more sophisticated tolerance checker to allow specific roundoff for each test and variables, support NetCDF5 and new default NetCDF 4, fixes for high-resolution grid exceeding integer value range and some minor bugfixes for Piz Daint related to HDF5. * exptar_era_to_buffer - 4 fields processed - Sea surface temperature (T_SEA) - 2m land temperature (T_2M_CLIM) - Geometric height (TOPO_CLIM) - Snow water equivalent (W_SNOW) - New namelist-parameter iera_type defines type of ERA input data used, either ERA-I or ERA-5 - extpar_consistency_check checks for namelist INPUT_ERA to determine if ERA-climatologies come from Python-CDO or Icontools - Using extpar_era_to_buffer.py changes fields, a detailed review of changes was performed by J\u00fcrgen Helmert from DWD - W_SNOW - TOPO_CLIM - T_SEA - T_2M_CLIM - Read the users guide for detailed information about how extpar_era_to_buffer is integrated into the existing workflow * Enhanced namelist parsing for Python-CDO - Line starting with ! ignored as expected from Fortran code * Bugfixes for Piz Daint - -L option for all CDO commands - Disbable HDF5 file locking due to problems reading some input data * Improved tolerance testing in testsuite - Tolerances can now be defined separate for each test and variable for example in tolerance file * Support for NetCDF 5 - NetCDF 4 replaces netCDF 3 as default - Value of environment variable NETCDF_OUTPUT_FILETYPE sets version: NETCDF3, NETCDF4 or NETCDF5 * Modified netCDF-interface functions to allow write of fields with dimesions exceeding default integer value range
"},{"location":"release_notes/#541","title":"5.4.1","text":"This is an intermediate release that brings two lradtopo-parameters for Icon, better user feedback for the shell-commands launched in the Python-scripts, a bugfix in exptar_albedo_to_buffer.py, a configure script for O3 (ETHZ) and small technical improvements to the Code. * HORIZON and SKYVIEW fields for the Icon grid - 4 new namelist-parameter - radius -> defines the considered horizontal distance for the HORIZON field - min_circ_cov -> defines the level of detail of the search-algorithm for performance reasons - max_missing -> defines upper treshold for the allowed missingness at the boundary of the domain - itype_scaling -> choose the type of scaling for SKYVIEW to account for anisotropic behaviour of IR-radiation - Read the users guide for detailed information about the difference between the COSMO and the ICON implementation
This is a major release that introduces a rewrite of 4 Extpar programmes in Python, a common git-LFS input data repository, a new build-system, 2 additional landuse data sets, CDI-library for icon grids in consistency check, mmap-caching for consistency check for less memory usage, some small improvements in the Fortran code and some minor changes in the testsuite.
Support of the old and coarse data (it_cl_type = 2) in extpar_cru_to_buffer expires and is replaced the following:
Read the users guide for detailed information about the rewritten programmes.
git-LFS input data repository
4 basic steps to compile Extpar into binaries:
Corine landuse data
The corine landuse data set is only tested on Mistral at DKRZ
ECCI landuse data
The ECCI landuse data is only tested on Mistral at DKRZ
Enhanced testsuite
Copy all required files from namelistdir (icon grids, clim-fields and Python-files) through testsuite itself
CDI library for icon grids
See compile_run for instructions to clone Extpar from GitHub correctly
Mmap-caching
Only supported and tested for GCC compiler
Fortran Code changes
This is an intermediate release that reduces code complexity for topo_to_buffer.exe, enhances the testing for INTEL compiler and further cleans the code
The functionality is kept by default for all newly introduced namelist parameters, so for the same workflows as before only change lcompute_sgsl
Testsuite
Add references for INTEL in a seperate directory in data
Cleanup
This is a minor release containing a bug fix and a small feature addition. * Bug fix for ICON/COSMO file- and variable name mismatch in topography calculation * Add Extpar version number (pulled from git release number) to output NetCDF file
"},{"location":"release_notes/#52","title":"5.2","text":"This is an intermediate release introducing extpar_emiss_to_buffer, an improved logging, enhanced error checking during I/O and a lot of clean-up and formatting
Two raw datasets available (full range and only long-wave radiation)
Consistent logger for all Extpar executables
Each Extpar executable write to its own logfile
Clean-up and formatting of all src-files
Implement formatting according the coding-guidelines for Extpar
Make all precisions consistent
Change all REAL to REAL(KIND=wp), wp is defined in mo_kind
Small changes in some fields due to fix of implicit type conversion during runtime
DEPTH_LK, max difference ~10^(-6)
Enhanced error checking during I/O
This is a minor release containing a few bug fixes. * Fix build environment on Kesch * Add missing definition of skinc_lu meta data when ECOCLIMAP dataset is chosen.
"},{"location":"release_notes/#511_1","title":"5.1.1","text":"This is a minor release containing a few bug fixes. * Fix read of l_use_glcc landuse calculation for COSMO runs. * Fix unitialized logical flag to trigger scale separation in topography calculation. * Reactivate all cosmo tests from testsuite on Kesch.
"},{"location":"release_notes/#51","title":"5.1","text":"This is an intermediate release containing some bug fixes and some minor developments.
Fix NAG compiler setup so that only compilation, not testing is done, because testing is too time consuming.
Bug fix for iaot_type = 4 (MACv2 aerosols). The code had not been correctly imported from version 4.0.
Contributions from DWD including:
DWD bug fix for incorrect glacier points
New output variable skin conductivity (SKC) developed by Jan-Peter Schulz. Skin conductivity is calculated from the landuse data.
This is a minor release containing a few bug fixes.
Bug fix for problems when soil_type=3 is used. The code had not been correctly imported from version 4.0
Bug fix adding missing NetCDF get_varid call when more than one GLOBCOVER tile is used.
This is a minor release containing a bug fix.
This is a minor release containing a bug fix.
This is a minor release fixing a few bugs and some documentation.
This release represents a merge of the Extpar official version 4.0 code with the DWD-Extpar version 2.10.
"},{"location":"release_notes/#build-mechanism","title":"Build Mechanism","text":"Due to the large amount of changes in the code in this release, there are many differences in the resulting external parameter fields generated by the release 5.0 code compared to the fields generated by older Extpar codes. The only code change in this release that deliberately changed the results was the addition of a lower limit for roughness length, which is 1e-6. Otherwise, any changes in results that can be seen came directly from bug fixes to the code, and as such most of them are small and are not expected to change results in the COSMO or ICON model runs. Some of these changes in results are examined in the next two sections.
"},{"location":"release_notes/#extpar-version-40-to-extpar-version-50","title":"Extpar version 4.0 to Extpar version 5.0","text":"The technical testsuite in Extpar was used to compare the external parameter fields from Version 4.0 and Version 5.0 for three different MeteoSwiss operational setups for COSMO and a climate setup for COSMO-CLM.
"},{"location":"release_notes/#cosmo-7-globe-topography-input","title":"COSMO 7, globe topography input","text":"For the COSMO7 MCH setup using the globe topography data set, changes in the results smaller than 1e-6 can be seen for several variables, including the aerosol variables, albedo variables, HORIZON, and SSO_SIGMA. Larger changes on the order of 3 degrees can be seen in the SSO_THETA variable; these are due to a bug fix in this release, and are expected. Finally, roughness length is different as well due to the introduction of the lower limit value of 1e-6.
"},{"location":"release_notes/#cosmo-7-aster-topography-input","title":"COSMO 7, aster topography input","text":"For the COSMO7 MCH setup using the aster topography data set, the changes in the results are less than 5e-7, and occur in the aerosol, HORIZON, and SSO_SIGMA variables.
"},{"location":"release_notes/#cosmo-1-aster-topography-input","title":"COSMO 1, aster topography input","text":"For the COSMO1 MCH setup using the aster topography data set, the changes in the results are less than 4e-5, and occur in the aerosol, HORIZON, SKYVIEW, and T_CL variables.
"},{"location":"release_notes/#cosmo-cm-climate-setup","title":"COSMO-CM climate setup","text":"For the COSMO-CLM climate setup using the globe topography data set, changes in results smaller than 3e-8 can be seen in the SSO_SIGMA and SSO_STDH variables. Larger changes on the order of 3 degrees can be seen in the SSO_THETA variable; these are due to a bug fix in this release, and are expected. Due to another bug fix, the ALB_SAT and ALB_DRY variables have changed results on the order of .2. Finally, roughness length is different as well due to the introduction of the lower limit value of 1e-6.
"},{"location":"release_notes/#dwd-extpar-version-210-to-extpar-version-50","title":"DWD Extpar version 2.10 to Extpar version 5.0","text":"Comparisons of the COSMO D2 setup used operationally by DWD were carried out to compare the current operational Extpar code (DWD version 2.10) with the new release 5.0. This comparison showed no significant differences in the generated external parameter fields. Get more details of this comparison here
"},{"location":"testing/","title":"Testing","text":"EXTPAR is tested with an adapted version of the COSMO technical testsuite .
"},{"location":"testing/#run-tests","title":"Run Tests","text":"First step is to compile the code following the instructions in Compile and Run.
"},{"location":"testing/#docker","title":"Docker","text":"docker run extpar bash -c \"/workspace/test/jenkins/test_docker.sh\"\n
"},{"location":"testing/#levante","title":"Levante","text":"cp bin/* test/testsuite/bin/.\ncd test/testsuite\n./data/get_data.sh\nsbatch submit.levante.sh\n
The results of the testsuite can be found in file testsuite.out
An example output could look as follows:
"},{"location":"testing/#testlists","title":"Testlists","text":"There are many different testlist, each containing a set of tests for different setups, compiler or models:
"},{"location":"testing/#gcc","title":"GCC","text":"It is possible to define an optional tolerance threshold for each test and each field. To allow deviations for the test icon_d2 for example, just dit the the tolerances file .
The syntax is as follows:
PARAMETER, abs_diff\nNDVI, 9.0e-08\nW_SNOW, 5.0e-05\n
"},{"location":"testing/#add-a-new-test","title":"Add a New Test","text":"Modify the testlist.xml
file to add the new test. Alternatively, you could also add a new testlist XML file (with a new name). The testlist which is run can be chosen from the testsuite command line.
Make a folder in the data folder for the new test containing the INPUT_*
files and the namelist.py for the Python-CDO modules.
Send any binary reference files to upload to the ftp site to the source code administrator.
Hermann Asensio / Martina Messmer / Daniel L\u00fcthi / Katie Osterried / Jonas Jucker / Jacopo Canton / Philipp Sommer / J\u00fcrgen Helmert / Michael J\u00e4hn
This documentation provides an overall description of the EXTPAR software, provides detailed information on specific modules, current limitations and the namelist input.
For the sake of completeness, the latest EXTPAR documentation (v5.14) that was created from the original LaTeX file, can be downloaded here.
"},{"location":"user_manual/SUMMARY/","title":"SUMMARY","text":"Numerical Weather Prediction (NWP) models and Climate models require geographical localized datasets like the topographic height of the earth surface, the plant cover, the distribution of land and sea and, dependent on the schemes used, a variety of other external parameters.
The EXTPAR software system (EXTPAR - External Parameter for Numerical Weather Prediction and Climate Application) is able to generate external parameters for the different models COSMO and ICON. The software can run on a UNIX or Linux system where the raw data is stored. It allows operators (experienced users) running the scripts to create new external parameters controlled by user specifications like the model domain.
The following steps are performed for the generation of external parameters:
The target grid has to be specified. The supported target grids are
The different raw data sets are aggregated to the target grid considering all raw data elements which are within the target grid element. If the target grid has a higher resolution than the input grid on which the raw data is available either an interpolation is performed or the target grid is filled with the nearest neighbor, but sub-grid scale statistical calculations (e.g. subgrid scale variance of orograhic height) are dismissed.
All the different external parameter sets have to be checked for consistency against each other. In case of conflicts default values are set automatically. In the NetCDF output, information on the input data and the processing software is given.
The information for the external parameters is aggregated from various raw datasets for land use data, orography or soil data, see table below for a detailed list of the raw datasets.
The input data for EXTPAR is stored in a git-LFS repository at https://gitlab.dkrz.de/extpar-data/extpar-input-data . Instructions for downloading the whole repository or updating with new datasets can be found in the git-LFS repository. For access to the input data repository, contact the current EXTPAR source code administrator.
Dataset Source Resolution GLOBE orography NOAA/NGDC 30'' ASTER orography (limited domain: 60\u00b0N - 60\u00b0S) METI/NASA 1'' MERIT/REMA orography Composite DEM 3'' (90m) Globcover 2009 ESA 10'' GLC2000 land use JRC Ispra 30'' GLCC land use USGS 30'' Ecoclimap-SG land use CNRS and Meteo France 300m ESA CCI-LC ESA 10'' DSMW Digital Soil Map of the World FAO 5' HWSD Harmonized World Soil Database FAO/IIASA/ISRIC/ISSCAS/JRC 30'' HWSD Harmonized World Soil Database USDA KIT 30'' NDVI Climatology, SEAWiFS NASA/GSFC 2.5' CRU near surface climatology CRU University of East Anglia 0.5 degree Aerosol Optical thickness NASA/GISS 4x5 degree (Global Aerosol Climatology Project) AeroCom Global AOD data AeroCom Project 1 degree MACC-II climatological AOD (2003-2012) ECMWF 1.125 degree MACv2 monthly AOD, SSA and ASY data MPI, RHM 1 degree CAMS monthly 3D-climatology 11 types of aerosols ECMWF, RHM 3 degree Global lake database (GLDB) DWD/RSHU/MeteoFrance 30'' MODIS albedo NASA 5' MODIS derived soil albedo values Community Land Model 3.5 30' CAMEL Emissivity NASA 5km EDGAR Emissions European Commission /JRC/PBL 0.1 degree MODIS cloud droplet number climatology Q06 NASA 1 degreeTable 1: Input raw datasets
"},{"location":"user_manual/user_manual_01_overall_description/#main_output","title":"Output External Parameters","text":"The output fields with the external parameters are shown here:
External parameter Short name Unit Raw dataset geometrical height HSURF \\(m\\) GLOBE/ASTER/MERIT/REMA geopotential of earth surface FIS \\(m^{2} s^{-1}\\) GLOBE/ASTER/MERIT/REMA standard deviation of subgrid scale orographic height SSO_STDH \\(m\\) GLOBE/ASTER/MERIT/REMA anisotropy of topography SSO_GAMMA 1 GLOBE/ASTER/MERIT/REMA angle between principal axis of orography and global E SSO_THETA 1 GLOBE/ASTER/MERIT/REMA mean slope of subgrid scale orography SSO_SIGMA 1 GLOBE/ASTER/MERIT/REMA surface roughness Z0 \\(m\\) GLC2000, GLOBE/ASTER/MERIT/REMA Slope aspect SLOPE_ASP deg GLOBE/ASTER/MERIT/REMA Slope angle SLOPE_ANG deg GLOBE/ASTER/MERIT/REMA Horizon angles (resolution from 15deg) HORIZON deg GLOBE/ASTER/MERIT/REMA Skyview factor SKYVIEW - GLOBE/ASTER/MERIT/REMA soil texture SOILTYP - DSMW/HWSD fraction of sand FR_SAND % HWSD fraction of silt FR_SILT % HWSD fraction of clay FR_CLAY % HWSD fraction of organic carbon FR_OC % HWSD bulk density BULK_DENS \\(g cm^{-3}\\) HWSD deep soil texture SUBSOILTYP - HWSD deep soil fraction of sand SUB_FR_SAND % HWSD deep soil fraction of silt SUB_FR_SILT % HWSD deep soil fraction of clay SUB_FR_CLAY % HWSD deep soil fraction of organic carbon SUB_FR_OC % HWSD deep soil bulk density SUB_BULK_DENS \\(g cm^{-3}\\) HWSD Fraction of Heavy Clay fr_hcla 1 HWSD_USDA Fraction of Silty Clay fr_silc 1 HWSD_USDA Fraction of Light Clay fr_lcla 1 HWSD_USDA Fraction of Silty Clay Loam fr_sicl 1 HWSD_USDA Fraction of Clay Loam fr_cloa 1 HWSD_USDA Fraction of Silt fr_silt 1 HWSD_USDA Fraction of Silty Loam fr_silo 1 HWSD_USDA Fraction of Sandy Clay fr_scla 1 HWSD_USDA Fraction of Loam fr_loam 1 HWSD_USDA Fraction of Sandy Clay Loam fr_sclo 1 HWSD_USDA Fraction of Sandy Loam fr_sloa 1 HWSD_USDA Fraction of Loamy Sand fr_lsan 1 HWSD_USDA Fraction of Sand fr_sand 1 HWSD_USDA Fraction of Undefined or Water fr_udef 1 HWSD_USDA ground fraction covered by plants max (vegetation period) PLCOV_MX 1 GLC2000/Globcover/ ESA CCI-LC ground fraction covered by plants min (vegetation period) PLCOV_MN 1 GLC2000/Globcover/ ESA CCI-LC ground fraction covered by artificial (urban) areas URBAN 1 GLC2000/Globcover/ ESA CCI-LC ground fraction covered by artificial (urban) areas URBAN 1 GLC2000/Globcover/ESA CCI-LC/ LCZs with TERRA_URB ground fraction covered by deciduous forest FOR_D 1 GLC2000/Globcover/ ESA CCI-LC skin conductivity SKC \\(W m^{-1} K^{-1}\\) Globcover/ESA CCI-LC root depth ROOTDP \\(m\\) GLC2000/Globcover/ ESA CCI-LC leaf area index max(vegetation period) LAI_MX 1 GLC2000/Globcover/ESA CCI-LC leaf area index min (vegetation period) LAI_MN 1 GLC2000/Globcover/ ESA CCI-LC plant resistance PRS_MIN \\(s m^{-1}\\) GLC2000/Globcover/ ESA CCI-LC long wave surface emissivity EMISS_RAD 1 GLC2000/Globcover/ ESA CCI-LC (monthly) normalized differential vegetation index NDVI 1 SEAWIFS Annual maximum of normalized differential vegetation index NDVI_MAX 1 SEAWIFS (monthly) proportion of actual value/ maximum normalized differential vegetation index NDVI_RATIO 1 SEAWIFS (monthly) optical thickness from black carbon aerosol AER_BC 1 GACP (monthly) optical thickness from dust aerosol AER_DUST 1 GACP (monthly) optical thickness from organic aerosol AER_ORG 1 GACP (monthly) optical thickness from SO4 aerosol AER_SO4 1 GACP (monthly) optical thickness from sea salt aerosol AER_SS 1 GACP (monthly) aerosol optical thickness for RG92 spectral bands AOT12 1 MACv2 (monthly) single scattering albedo for RG92 spectral bands SSA12 1 MACv2 (monthly) asymmetry factor for RG92 spectral bands ASY12 1 MACv2 (monthly) layer-integrated mass of Sea Salt with dry radius in the range 0.03-0.5 microns Sea_Salt_bin1 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Sea Salt with dry radius in the range 0.5-5.0 microns Sea_Salt_bin2 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Sea Salt with dry radius in the range 5.0-20.0 microns Sea_Salt_bin3 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Mineral Dust with dry radius in the range 0.03-0.55 microns Mineral_Dust_bin1 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Mineral Dust with dry radius in the range 0.55-0.9 microns Mineral_Dust_bin2 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Mineral Dust with dry radius in the range 0.9-20.0 microns Mineral_Dust_bin3 \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of hydrophilic Organic Matter Organic_Matter_hydrophilic \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of hydrophobic Organic Matter Organic_Matter_hydrophobic \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of hydrophilic Black Carbon Black_Carbon_hydrophilic \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of hydrophobic Black Carbon Black_Carbon_hydrophobic \\(kg m^{-2}\\) CAMS (monthly) layer-integrated mass of Sulfates Sulfates \\(kg m^{-2}\\) CAMS (monthly) Pressure at base of layer half_level_pressure Pa CAMS Near surface temperature (climatological mean) T_2M_CL \\(K\\) CRU Lake Depth DEPTH_LK \\(m\\) GLDB Lake Fraction FR_LAKE 1 GLDB (monthly) albedo ALB_DIF12 % MODIS (monthly) Near Infrared Albedo ALNID % MODIS (monthly) Ultra Violet Albedo ALUVD % MODIS soil albedo for dry soils ALB_DRY % Community Land Model 3.5 soil albedo for saturated soils ALB_SAT % Community Land Model 3.5 fraction of impervious surface area ISA 1 NOAA, EEA or LCZs with TERRA_URB anthropogenic heat flux AHF \\(W m^{-2}\\) NOAA or LCZs with TERRA_URB subgrid-scale slope parameter S_ORO 1 GLOBE, ASTER, MERIT/REMA EMISS yearly maximum for climatology 1998-2003 EMISS_MAX 1 CAMEL monthly mean EMISS climatology 1998-2003 EMISS 1 CAMEL (monthly) proportion of actual value/maximum normalized differential vegetation index EMISS_MRAT 1 CAMEL Urban paved fraction FR_PAVED 1 LCZs with TERRA_URB Urban building fraction URB_BLDFR 1 LCZs with TERRA_URB Urban building height URB_BLDH \\(m\\) LCZs with TERRA_URB Urban canyon height-to-width ratio URB_H2W 1 LCZs with TERRA_URB Urban shortwave albedo URB_SALB 1 LCZs with TERRA_URB Urban thermal albedo URB_TALB 1 LCZs with TERRA_URB Urban emissivity URB_EMIS 1 LCZs with TERRA_URB Urban heat conductivity URB_HCON 1 LCZs with TERRA_URB Urban heat capacity URB_HCAP \\(J/K\\) LCZs with TERRA_URB Annual black carbon emissions emi_bc \\(kg\\,m^{-2}\\,s^{-1}\\) EDGAR Annual organic carbon emissions emi_oc \\(kg\\,m^{-2}\\,s^{-1}\\) EDGAR Annual sulfur dioxide carbon emissions emi_so2 \\(kg\\,m^{-2}\\,s^{-1}\\) EDGAR Annual ammonia emissions emi_nh3 \\(kg\\,m^{-2}\\,s^{-1}\\) EDGAR Annual nitrogen oxides emissions emi_nox \\(kg\\,m^{-2}\\,s^{-1}\\) EDGAR Monthly cloud droplet number climatology cdnc \\(cm^{-3}\\) MODISTable 2: Output external parameters
"},{"location":"user_manual/user_manual_02_software_modules/","title":"Software Modules","text":""},{"location":"user_manual/user_manual_02_software_modules/#Overview","title":"Overview","text":"The software EXTPAR is composed of thirteen autonomous programmes. Twelve programmes are responsible for aggregating a raw data to the target grid, which is specified by the user. The thirteenth program, the consistency check, is performed in the end. The executables are called extpar_*_to_buffer
, whereas the star *
stands for ahf (anthropogenic heat flux), aot (aerosol optical thickness), cru (temperature climatology of the Climate Research Unit (CRU)), landuse, topo, ndvi (normalized difference vegetation index), soil, flake (fraction lake), isa (impervious surface area), albedo, emiss (emissivity) and era (ERA climatologies) respectively. In Fig. 1 a schematic representation of EXTPAR is drawn. For the sake of clarity only the topography and land-use path is shown. The same can be applied for the other ten raw data sets. For all these programs there exist namelists. Most of the namelists only contain the name and path of the raw data file and the name of the buffer file, which is later used for the consistency check, and the name of the output of the final external variables.
The software modules read from the following namelist files:
The namelists INPUT_grid_org
and either INPUT_COSMO_GRID
or INPUT_ICON_GRID
are used in all the programs, as they contain the general information of the target grid to which the raw data should be aggregated. The namelist file namelist.py
is read by all Python programmes.
Figure 1: Schematic illustration of the software EXTPAR.
"},{"location":"user_manual/user_manual_02_software_modules/#Python-CDO","title":"Hybrid Python-CDO Structure","text":"For three of the external parameters calculated by EXTPAR, namely albedo, NDVI, and the Hadley CRU climatologies, problems appeared with target resolutions much higher than the provided input data set resolutions. The problem is that not all target grid points get assigned a proper value when using the legacy Fortan code and interpolation method.
The algorithm used in the legacy Fortran modules aggregates source grid point values onto the target grid where the input data is finer than the target grid and uses bi-linear interpolation to fill the remaining grid points where the input data is sparser than the target grid. However, starting from a 5 km global resolution for the target grid, points can potentially get assigned unreasonable values because of the insufficiency of the bi-linear interpolation algorithm.
To resolve this issue, for EXTPAR Version 5.4 a rewrite of those Fortran modules in Python, using the more sophisticated interpolation methods from CDO with support for all grids was conducted. Because the interpolation methods implemented in CDO are faster than those in Fortran for large model grids, emiss_to_buffer is written in Python as well. A rewrite in Python only makes sense for Fortran modules that do simple calculations with the data. These calculations can easily be substituted with CDO-commands in the Python modules. For modules doing complex calculations and providing many namelist parameters the user can define, like extpar_topo_to_buffer or extpar_landuse_to_buffer, a rewrite in Python is not planned.
The interpolation algorithms selected are:
The description of the used algorithms can be found via the CDO documentation.
"},{"location":"user_manual/user_manual_02_software_modules/#Summary","title":"Summary","text":"The external parameters can be generated by using thirteen programs to aggregate the various raw datasets to the target grid and after this by calling the final program for the important consistency check.
In a first step, the target grid and other parameters have to be specified by the user in the runscript (see section Grid Definition for the details).
Then the aggregation of the raw datasets listed in Table 1 to the given target grid can be performed by calling following executables
extpar_aot_to_buffer
extpar_cru_to_buffer
extpar_landuse_to_buffer
extpar_topo_to_buffer
extpar_ndvi_to_buffer
extpar_soil_to_buffer
extpar_flake_to_buffer
extpar_alb_to_buffer
extpar_isa_to_buffer
extpar_ahf_to_buffer
extpar_emiss_to_buffer
extpar_hwsdART_to_buffer
extpar_era_to_buffer
extpar_edgar_to_buffer
These programs generate intermediate NetCDF files (\"buffer\") with the aggregated data.
The executable extpar_consistency_check
reads in the buffer-files, performs an automated consistency check, and finally generates the output fields listed in Table 2.
The task of the consistency check that is performed at the end is to find inconsistencies in the soil data, the lake data and the NDVI data. In the soil data problems may appear between the soil type and the land-use, in particular for water and ice grid elements. For the fraction lake, minimal and maximal lake depth must be introduced and some seas such as the Caspian and the Dead Sea as well as Lake Constance must be defined manually. For more information see chapter 3.7.
"},{"location":"user_manual/user_manual_03_fortran_modules/","title":"Fortran Modules","text":""},{"location":"user_manual/user_manual_03_fortran_modules/#extpar_topo_to_buffer","title":"extpar_topo_to_buffer","text":""},{"location":"user_manual/user_manual_03_fortran_modules/#short-description","title":"Short description","text":"The program extpar_topo_to_buffer aggregates the orography of the GLOBE, ASTER, or MERIT/REMA dataset to the target grid.
"},{"location":"user_manual/user_manual_03_fortran_modules/#target-grid-definition","title":"Target grid definition","text":"The first part of this program contains several routines that read the namelists defined in the run script (see chapter 6 for more information on the run scripts). The first routine (init_target_grid) collects all the information needed to define the target grid with an integrated routine that gathers the variables given in the namelist INPUT_grid_org
. The variable igrid_type, which can either be 1 ('ICON') or 2 ('COSMO'), is an integer switch to define the target grid.
Then a routine reads the namelist of the corresponding grid, which is either INPUT_ICON_GRID
or INPUT_COSMO_GRID
, depending on the chosen grid type. The run script contains only one of the two namelists. This must be manually changed by the user. These namelists contain among other variables the resolution of the grid, the user specified domain and the location of the center of the grid (for closer information about the namelists compare chapters 6.2.2 - 6.2.3). This allows an exact definition of the target grid.
The namelist INPUT_ORO contains the parameter lcompute_sgsl, to determine whether SGSL should be calculated from the respective raw topography data. Formerly this was done in a separate executable extpar_sgsl_to_buffer.exe. From Release 5.3 onwards, the SGSL calculation was incorporated into the execututable 'extpar_topo_to_buffer`. As an intermediate step, the SGSL is written out to NetCDF, one separate file for each raw topography tile is required. In case the preprocessed SGSL NetCDF are already available, setting the parameter lpreproc oro= .false., deactivates the preprocessing, but not the aggregation of SGSL to the target grid. We recommend to only do the preprocessing for the GLOBE dataset, because the computational cost for the ASTER or MERIT/REMA dataset is very high and no validation has taken place for this dataset.
"},{"location":"user_manual/user_manual_03_fortran_modules/#topographic-correction-for-radiation","title":"Topographic correction for radiation","text":"In a second step, the namelist INPUT_RADTOPO
is read. It contains the information if the user desires the calculation of the topographical corrected radiation parameters or not. If the switch is set to .TRUE. a border is added to the COSMO domain, as the computations need grid points beyond the edges of the normal domain. For ICON an on the fly extension of the grid is not possible, leading to missing data at the boundaries. Therefore the namelist-switch max_missing defines the treshold for the allowed fraction of missingness. Altough the topographical corrected radiation can be calculated for both ICON and COSMO grids, the two sets of fields cannot be considered as identical, because for ICON grids one assumes plain (non-tilted) grid-cells, whereas for COSMO one also takes into account self-shading and effects related to tilted-plains for the skyview-factor.
The number of horizons is specified in the namelist. For the COSMO-7 and COSMO-2 setup 24 horizons are recommended. The icon-only parameter radius defines the radial distance taken into account for the topographical corrected radiation parameters. To account for the anisotropic behaviour of longwave-radiation, the namelist parameter itype_scaling defines the power of the term SIN(horizon-angle) in the equation of the skyview-factor. Due to performance reasons, for ICON the parameter min_circ_cov determines how many grid-cells can be skipped on the circumference considered for the computations.
"},{"location":"user_manual/user_manual_03_fortran_modules/#raw-topography-data","title":"Raw topography data","text":"The namelist INPUT_ORO
gives the possibility to switch between two raw orographical data sets (GLOBE, ASTER, or MERIT/REMA). In contrast to the 90m-data of MERIT/REMA, it must be considered, that the 30m-data of ASTER are not completely downloaded and are therefore not globally available. The downloaded region extends from 60N to 60S and from 180W to 180E. It is not recommended to derive the topographical parameters from ASTER if the region is beyond 60 degrees north or south. The ASTER files are arranged as displayed in Figure 2. As the computational time of the program extpar_topo_to_buffer depends mainly on the number of ASTER files that are read in, two new parameters are introduced in the namelist. These two parameters give the number of columns and rows of the used ASTER files. The filenames of the desired ASTER files must be given manually. Figure 2 gives an example on how to use these parameters in the case of COSMO-2. A similar approach is used for MERIT/REMA DEM as shown in Figure 3. The latitude range between 60-90 deg S is covered by REMA DEM, which was mapped to the MERIT data format by BKG, Germany. If GLOBE is used the columns and rows are set to 4 and all GLOBE files must be listed in the topo_files parameter. A check in the program extpar_topo_to_buffer is introduced, which gives a warning if the borders of the domain are exceeded. This is followed by an abortion of this program. As there is no need to calculate the subgrid scale parameters (SSO) for high resolution setups, there is the logical switch lsso_parm to turn off the calculation of the SSOs.
Figure 2: Illustration of the single domains of the 240 ASTER tiles. An example of how the three parameters ntiles_columns, ntiles_row and topo_files in the namelist could look like is given in red.
Figure 3: Illustration of the single domains of the 60 MERIT and the 12 REMA tiles below 60 deg S latitude.
Furthermore the variables of the namelist INPUT_ORO
, which cover all the raw topographical data information, are fed into the program. In this namelist the path of the raw data is given as well as the names of the topography data files. An integer switch allows the choice between the highly resolved, non-global topography ASTER, the global but coarser MERIT/REMA and the coarser and global data set GLOBE (1: GLOBE, 2: ASTER, 3: MERIT/REMA). Furthermore the logical switch to decide whether the SSO parameters are desired or not is read. In order to define the right number of raw data tiles the variables ntiles_column and ntiles_row must be available in the namelist. Additionally, the names for the buffer and output files are defined.
The topography data files must be manually changed in the run script, when switching from GLOBE to ASTER, or MERIT/REMA and vice versa.
Then, the number of tiles of the raw topography data is defined (this varies between the raw data sets: 16 tiles for GLOBE, 1 - 240 tiles for ASTER, 72 tiles for MERIT/REMA). This value is the product of the number of tiles in each column and each row. The variables concerning the raw topography are allocated and in a further step filled with the according values. These values are the edges of each raw topography tile, the number of gridpoints in x- and y-direction, as well as the resolution in both directions. These are directly deduced from the raw data NetCDF files. Finally the borders of the ASTER domain are defined, when ASTER is used.
After the definition of the target grid and the topography set, a check examines the compatibility of the user specified input with the target grid; as ASTER is not globally available at the moment it is checked that the user specified domain is contained in the current ASTER domain. And, if this is not the case, the extpar_topo_to_buffer is aborted with an error message.
"},{"location":"user_manual/user_manual_03_fortran_modules/#scale-separation-input","title":"Scale separation input","text":"The namelist INPUT_SCALE_SEP
gives all the information needed to calculate the SSO parameters and roughness length based on a 3 km filtered topography. Thus the logical switch lscale_separation
must be read to decide if a scale separation is desired or not. Furthermore the raw data files and path must be provided. Note that the lscale_separation
can only be set to .TRUE. if GLOBE is used as topography, as there is no ASTER or MERIT/REMA based 3 km filtered topography available yet. Additionally the user must decide if the computation of the SSO parameters make sense or not. Table 3 can give some assistance to come to the right decision.
lscale_separation
Model resolution is smaller than raw data resolution SSOs: \\(\\sigma = 0\\),z0: \\(\\hspace{12pt}\\sigma = 0\\) .FALSE. Model resolution is greater than the raw data resolution but smaller than 3 km SSOs: \\(\\sigma = 0\\),z0: \\(\\hspace{12pt}\\sigma = \\sum {(model - raw\\hspace{2pt} data)}^{2}\\) .FALSE. and lsso_param = .FALSE. Model resolution is greater than 3 km SSOs: \\(\\sigma = \\sum {(model - 3km\\hspace{2pt} filt )}^{2}\\),z0: \\(\\hspace{12pt}\\sigma = \\sum {(3km\\hspace{2pt} filt - raw\\hspace{2pt} data)}^{2}\\) .TRUE. Table 3: Recommendations on the usage of the scale separation. Be aware that the actual model topography resolution is approximately twice as large as the model resolution. E.g. COSMO-2: The resolution of the topography is approximately 4 km.
"},{"location":"user_manual/user_manual_03_fortran_modules/#orographical-smoothing-input","title":"Orographical smoothing input","text":"The last namelist that must be read before allocating the orography is the namelist INPUT_OROSMOOTH
, which defines all the variables needed to perform an orographical smoothing. The lfilter_oro logical switch, controls the computation of the smoothing in EXTPAR.
The subroutine det_topo_tiles_grid defines the grid of each raw topography data tile. For this, the start and end latitude and longitude of each tile, the distance between two grid points in the latitudinal and longitudinal direction (dlat, dlon) as well as the number of grid points in both directions (nlat, nlon) are derived for each tile. Additionally, the grid for the whole GLOBE, ASTER, or MERIT/REMA domain is derived; This is done in the subroutine det_topo_grid.
Before the raw topography can be aggregated on the target grid, the target variables must be allocated. These variables include the land fraction (FR_LAND), the elevation of the surface (hh_target), the standard deviation of the elevation (stdh_topo), the roughness length of the topography (z0_topo), the sub-grid scale orography parameters (theta_topo, aniso_topo and slope_topo) and the topographical corrected radiation parameters (slope_asp, slope_ang, horizon and skyview). For the ICON grid some additional parameters must also be allocated.
The following paragraphs describe computations on the raw data grid.
The subroutine agg_topo_data_to_target_grid does the actual work of aggregating the raw topography to the target grid. The whole topographical data set is divided in bands of 500 grid points in the latitudinal direction and the whole range of the raw data domain in the longitudinal direction (compare for this the black band in Fig. 4). This band is introduced to optimize memory usage, as it is not possible to read the whole raw data in one pass. In order to read the correct raw data the start and end index of each tile (green crosses in Fig. 4) is defined. These indices are additionally associated with a start and end index (red circles in Fig. 4) inside the band. The definition of the two kinds of indices is performed by the routine get_topo_tile_block_indices. With this band the whole raw data is read step by step as suggested in Fig. 4. If the scale separation is desired the same procedure is applied to the 3 km filtered topography.
Figure 4: Schematic illustration of the filling of the raw data with a 500 grid points long band. The green crosses indicate the start end end latitudes and longitudes of each raw topography tile (light blue tiles), whereas the red circles show the indices inside the band, where the green indices of the tiles must be placed.
After this step, a temporary variable of elevation values is filled. This variable consists of three rows, which comprises the whole longitude range of the raw topography data. This is used to deduce the gradients of the topography, which are calculated as averaged differences between one eastern and one western grid point (x-gradient) or with one northern and one southern grid point (y-gradient). From these gradients in x- and y- direction also the squared gradients and the dx\\(\\ast\\)dy are computed.
This is followed by a call of the subroutine find_rotated_lonlat_grid_element_index. This routine defines to which grid element of the target grid a certain grid element of the raw topography belongs. The allocation of the raw data points to the target grid element is performed as shown in Fig. 5 a). All raw data elements that are closer than half a grid point (green box) to the target point (red circle) are used to define the value at the corresponding target grid point. Only the green grid elements in Fig. 5 b) belong to a target grid element. The rest of the raw topography is unused.
Figure 5: a) Illustration of the aggregation of the raw data to the target grid. The red circle indicates a target grid point, while the green rectangle represents the part of the raw data that is aggregated on the target grid point. b) Showing the target grid on top of the raw data set, where only the green grid points of the raw data are used for the target grid.
The elevations of raw data pixels that belong to one target grid element are summed up, and the number of raw data pixels contributing to one target grid element is tracked. A summation of the raw data values for each target grid element is also performed for the squared elevation, which is later used for the standard deviation, and for the gradients calculated before, which are required for the computation of the subgrid scale orography parameters. The latter is only calculated if the SSO parameters are desired. When making use of the scale separation the squared differences between the original and the 3 km filtered topography must be computed at every grid point. This is needed in order to calculate the roughness length specific standard deviation. After these calculations, the temporary rows are shifted to the north and the computation is repeated for the next center line. As soon as a band of 500 rows is finished a new one will be read in.
Now that all auxiliary variables are available, all loops over the raw topography data are closed and a new one over all the grid points of the target grid is opened.
The following paragraphs describe computations on the target grid.
First of all the elevation is calculated as the mean of all the raw topography data points that are enclosed in one target grid point.
As soon as the topography is available on the target grid, the orographical smoothing is applied using the subroutine do_orosmooth.
In a next step the variance and the standard deviation of the elevation at each target grid point is estimated. Subsequently, the SSO parameters angle of principle axis, anisotropy factor and slope parameter are calculated according to Lott and Miller (1996). These SSOs are only calculated if the SSO switch is set to .TRUE. and if the standard deviation of the height is more than 10 meters, as the trivial case of the ocean is tried to be avoided. If the scale separation is switched on the SSOs are based on the 3 km filtered topography. Finally the orographical roughness length is calculated using the standard deviation, but only if at least one raw data pixel is present in the target grid element.
In the case where no raw topography data pixel is available in a target grid, a weighted bilinear interpolation between neighboring raw data grid element is performed to obtain an elevation in all target grid points. This mainly happens if the raw topography has a similar resolution as the target grid. If the bilinear interpolation needs to be applied, all the SSO as well as z0 are set to zero for this grid element. With this step the end of the subroutine agg_topo_data_to_target_grid is reached.
In the program extpar_topo_to_buffer an additional check on SSOs and z0 is performed. If none of the elements of the target grid is associated with at least ten raw data pixels, or as soon as one single element is not associated with any raw data pixel, all the SSOs and z0 are set to zero.
As soon as there is a value for all the target grid elements, the calculation for the topographical corrected radiation parameters can start, if desired at all.
Finally NetCDF files for the orography based external parameters are created, where different NetCDF routines are used for each grid type, as different parameters are needed for each of them. If the lradtopo is set to .TRUE. the enlarged domain is cut back to the user specified domain, before writing it to the NetCDF file.
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output","title":"Used namelist files and data in-/output","text":"namelist files: INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID, INPUT_ORO, INPUT_OROSMOOTH, INPUT_RADTOPO
data input (GLOBE): GLOBE_A10.nc - GLOBE_P10.nc
data input (ASTER): ASTER_T001.nc - ASTER_T240.nc
data input (MERIT/REMA): MERIT_N90-N60_E150-E180.nc4 - REMA_BKG_S60-S90_W180-W150.nc4
data input (filtered): GLOBE_A_filt_lanczos_window.nc - GLOBE_P_filt_lanczos_window.nc, GLOBE_A_filt_tukey_0.75_3.0_it4.nc - GLOBE_P_filt_tukey_0.75_3.0_it4.nc
Output: buffer file with orography data (/orography_io_extpar/ orography_buffer_file) output file with orography data (used in extpar_cru_to_buffer) (/orography_io_extpar/ orography_output_file)
The executable extpar_landuse_to_buffer aggregates the land use data to the target grid. Five different raw datasets can be processed: Globcover, GLC2000, GLCC, ESA CCI-LC and Ecoclimap Second Generation (Ecoclimap-SG from here onwards). As GLC2000 and Globcover do not include Antarctica, GLCC or ESA CCI-LC data can be used for the missing areas. The landuse executable also includes the TERRA-URB module, controlled by the logical switch l_terra_urb; see section 3.2.2 for details.
"},{"location":"user_manual/user_manual_03_fortran_modules/#target-grid-definition_1","title":"Target grid definition","text":"The definition of the target grid is done by reading the namelist INPUT_grid_org
. This namelist contains the information about the grid type, which can either be ICON or COSMO. With the information about the grid type, the namelist containing the grid definition can be read. The name of the namelist must be changed manually by the user, according to the chosen grid type. The namelist must either be INPUT_ICON
or INPUT_COSMO
. For a more exact description of the target grid definition, read the subsection 'Target grid definition' in section 3.1. After specifying the grid definition the southern band of the target grid is defined. This information is important, as the two raw data sets GLC2000 and Globcover do not cover the region below 60 degrees south. If this region is desired by the user, the third data set must be considered for the domain below the southern band. Additionally the target fields for the land use data are allocated.
In a next step the namelist INPUT_LU
is read. It contains an integer switch (i_landuse_data) that gives the possibility to choose between the five different raw data sets e.g., 1 (Globcover), 2 (GLC2000), 3 (GLCC), 5 (ESA CCI-LC), and 6 (Ecoclimap-SG). For Globcover one can additionally choose to use the corine landuse dataset by setting the logical switch (l_use_corine) to TRUE. Furthermore the path and the filename of the desired raw data and of GLCC are specified there. The user must adjust the filename and path manually according to the chosen raw data in i_landuse_data. In addition the name of the desired lookup table is read, which again can be chosen by the user using an integer switch ilookup_table_lu. The lookup tables are described in more detail in Table 5. The names of the buffer files for the target landuse fields and for the target GLCC fields are also specified in this namelist. Finally, the aforementioned l_terra_urb logical switch can be specified (the default value is .FALSE.).
After having read the namelists, the number of tiles of the raw data set is defined. The number of tiles is set to 1 as default and must only be changed for the raw data set Globcover or ESA CCI-LC, which are composed of 6 tiles. The basic information of the Globcover tiles, such as the latitude and longitude edges and the resolution is allocated according to the number of tiles. Later these variables are filled with the respective information, read from the NetCDF files directly.
For the remaining procedures the three different raw land use data have their separate routines, which are constructed identically.
The allocation of the data is done using the number of grid points in the latitudinal and longitudinal direction. Furthermore the land-use target fields are allocated using the target grid for the dimension size and the number of land-use classes. The land-use classes differ for the three raw data sets and are described in more detail in Table 4.
Data Set Number of Class Name of Class (Total number of Classes) GLOBCOVER (23) 01 irrigated croplands 02 rainfed croplands 03 mosaic cropland (50-70%) - vegetation (20-50%) 04 mosaic vegetation (50-70%) - cropland (20-50%) 05 closed broadleaved evergreen forest 06 closed broadleaved deciduous forest 07 open broadleaved deciduous forest 08 closed needleleaved evergreen forest 09 open needleleaved decid. or evergr. forest 10 mixed broadleaved and needleleaved forest 11 mosaic shrubland (50-70%) - grassland (20-50%) 12 mosaic grassland (50-70%) - shrubland (20-50%) 13 closed to open shrubland 14 closed to open herbaceous vegetation 15 sparse vegetation 16 closed to open forest regulary flooded 17 closed forest or shrubland permanently flooded 18 closed to open grassland regularly flooded 19 artificial surfaces 20 bare areas 21 water bodies 22 permanent snow and ice 23 undefined Corine (23) Corine (23) (CLC: 2.1.2, 2.1.3) 11 irrigated croplands (CLC: 2.1.1) 14 rainfed croplands (CLC: 2.4.2, 2.4.3) 20 mosaic cropland (50-70%) - vegetation (20-50%) (CLC: 2.4.4) 30 mosaic vegetation (50-70%) - cropland (20-50%) 40 closed broadleaved evergreen forest (CLC: 3.1.1) 50 closed broadleaved deciduous forest 60 open broadleaved deciduous forest (CLC: 3.1.2) 70 closed needleleaved evergreen forest (CLC: 1.4.1) 90 open needleleaved decid. or evergr. forest (CLC: 3.1.3) 100 mixed broadleaved and needleleaved forest (CLC: 2.2.3, 3.2.4) 110 mosaic shrubland (50-70%) - grassland (20-50%) (CLC: 2.2.2, 3.2.2) 120 mosaic grassland (50-70%) - shrubland (20-50%) (CLC: 2.2.1) 130 closed to open shrubland (CLC: 2.3.1, 3.2.3) 140 closed to open herbaceous vegetation (CLC: 3.2.1) 150 sparse vegetation 160 closed to open forest regulary flooded (CLC: 4.1.2) 170 closed forest or shrubland permanently flooded (CLC: 4.1.1) 180 closed to open grassland regularly flooded (CLC: 1.1.1, 1.1.2, 1.2.1, 1.2.2, 1.2.3, 1.2.4, 1.3.3, 1.4.2) 190 artificial surfaces (CLC: 3.3.1, 3.3.2, 3.3.3, 3.3.4, 1.3.1, 1.3.2) 200 bare areas (CLC: 4.2.1, 4.2.2, 4.2.3, 5.1.1, 5.1.2, 5.2.1, 5.2.2, 5.2.3) 210 water bodies (CLC: 3.3.5) 220 permanent snow and ice (CLC: 9.9.9) 230 undefined GLC2000 (23) 01 evergreen broadleaf tree 02 deciduous broadleaf tree closed 03 deciduous broadleaf tree open 04 evergreen needleleaf tree 05 deciduous needleleaf tree 06 mixed leaf tree 07 fresh water flooded tree 08 saline water flooded tree 09 mosaic tree / other natural vegetation 10 burnt tree cover 11 evergreen shrubs closed-open 12 deciduous shrubs closed-open 13 herbaceous cover closed-open 14 sparse herbaceous or grass 15 flooded shrub or herbaceous 16 cultivated and managed areas 17 mosaic crop/tree/natural vegetation 18 mosaic crop/shrub or grass 19 bare areas 20 water bodies 21 snow and ice 22 artificial surfaces 23 undefined GLCC (24) 01 urban and built-up land 02 dryland cropland and pasture 03 irrigated cropland and pasture 04 mixed dryland/irrigated 05 cropland/grassland mosaic 06 cropland/woodland mosaic 07 grassland 08 shrubland 09 mixed shrubland/grassland 10 savanna 11 decidous broadleaf forest 12 decidous needleleaf forest 13 evergreen broadleaf forest 14 evergreen needleleaf forest 15 mixed forest 16 water bodies 17 herbaceous wetland 18 wooded wetland 19 barren or sparsely vegetated 20 herbaceous tundra 21 wooded tundra 22 mixed tundra 23 bare ground tundra 24 snow or ice Ecoclimap-SG (33) 01 sea and oceans 02 lakes 03 rivers 04 bare land 05 bare rock 06 permanent snow 07 boreal broadleaf deciduous 08 temperate broadleaf deciduous 09 tropical broadleaf deciduous 10 temperate broadleaf evergreen 11 tropical broadleaf evergreen 12 boreal needleleaf evergreen 13 temperate needleleaf evergreen 14 boreal needleleaf deciduous 15 shrubs 16 boreal grassland 17 temperate grassland 18 tropical grassland 19 winter C3 crops (lower T) 20 summer C3 crops 21 C4 crops (warmer environments) 22 flooded trees 23 flooded grassland 24 LCZ1: compact high-rise 25 LCZ2: compact midrise 26 LCZ3: compact low-rise 27 LCZ4: open high-rise 28 LCZ5: open midrise 29 LCZ6: open low-rise 30 LCZ7: lightweight low-rise 31 LCZ8: large low-rise 32 LCZ9: sparsely built 33 LCZ10: heavy industryTable 4: Land-use classes for the different raw data sets. The Corine LandCover (CLC) classes in the left column indicate how the CLC is mapped to the corresponding GlobCover class.
After the allocation of the data a check is performed to query, if the user desires a domain that goes beyond the southern bound of the raw data. If it is the case, the GLCC target fields are allocated as well.
In case that Globcover is used, the grid for the single tiles must be defined as well.
"},{"location":"user_manual/user_manual_03_fortran_modules/#aggregation-of-the-raw-land-use-data-to-the-target-field","title":"Aggregation of the raw land-use data to the target field","text":"The definition and allocation part is done and the most important part, the aggregation of the raw data to the target grid can be performed. In order to be able to aggregate the data, the lookup table must first be initialized. The initial values differ for the various settings listed in Table 5. Also the name of the lookup table must be defined using the integer numbers specified in the namelist INPUT_LU
. The integer number are listed together with their associated lookup table names in Table 5.
Raw Data Integer Setting Name of the lookup table GLOBCOVER 1 operational settings Asensio, 2011 2 experimental settings, analog to lookup tables of ECOCLIMAP Asensio, 2010 GLC2000 1 operational settings of GME Ritter, 2007 2 operational settings of COSMO Heise, 2005 3 experimental settings, analog to lookup tables of ECOCLIMAP Asensio, 2010 GLCC 1 operational settings of GME Ritter, 2007 2 operational settings of COSMO Heise, 2005 3 experimental settings, analog to lookup tables of ECOCLIMAP Asensio, 2010 ESA CCI-LC 1 experimental settings Helmert, 2019 Ecoclimap-SG 1 Globcover analogue with added LCZs from Oke
Table 5: Names of the lookup tables and the different possible settings for each raw land-use data set.
The following paragraphs describe computations on the raw data grid.
For GLC2000 and GLCC, the raw data is read in lines of a complete longitude going from 180 degrees east to 180 degrees west, through a loop over the latitude. Before any calculation is performed, it is tested if the value of the latitude is contained inside the targed domain. In case it is not, the loop is cycled. Reading of the data line-wise can be done from the NetCDF file directly.
Using the routine find_nearest_target_grid_element each raw data pixel is assigned to a target grid point. A more precise description and a figure that describes the procedure can be found in paragraph 'Aggregation of the raw topography to the target grid' and in Fig. 5 in section 3.1.
As Globcover and ESA CCI-LC are composed of six tiles, the reading of the raw data must be performed in a different way than for the other three data sets. The reading of the data for Globcover is done in the same way as for the topography. Compare the paragraph 'Aggregation of the raw topography to the target grid' in section 3.1. As there is no need to calculate gradients for the land use, the corresponding variable, which contains three lines of raw data, is not used.
The lookup table is then fed with the land use class, which gives a value for all the target fields listed in Table 6.
Variable long name Variable short name Fraction Land FR_LAND Ice fraction FR_ICE Plant cover maximum PLCOV_MX Plant cover minimum PLCOV_MN Leaf area index maximum LAI_MX Leaf area index minimum LAI_MN Minimal stomata resistance RS_MIN Urban area fraction URBAN Fraction of deciduous forest FOR_D Fraction of evergreen forest FOR_E Longwave surface emissivity EMISS_RAD Root depth ROOTDP Roughness length Z0
Table 6: The variables that are computed using the raw land-use data.
The number of grid points that fall into the same target grid and land use class are summed up. The values of the target fields are weighted with the whole pixel area and summed up. Except for the emissivity, which is the only land-use parameter that also has valid values over water, only land pixels are considered. Values that depend on the plant cover, such as PLCOV_MX, PLCOV_MN, LAI_MN, LAI_MX, RS_MIN, FOR_E, FOR_D, ROOTDP and z0, are weighted with the plant cover maximum in addition to the pixel area.
The following paragraphs describe computations on the target grid.
The total area and the land area of each target grid point is first defined. Then the weighted sums of the target fields derived in the previous step are normalized to obtain the definite values. The emissivity and the number of land use classes are normalized by the total area to obtain the correct emissivity and area fraction of each land use class. The other parameters are only considered if the area_land is larger than zero: FR_LAND and FR_ICE are normalized with the total area, URBAN, FOR_D, FOR_E, PLCOV_MN and PLCOV_MX are normalized by the land area, the ROOTDP, LAI_MN, LAI_MX and RS_MIN are normalized by the area covered by plants. If only sea pixels are found, all the fields are undefined.
Finally land-use classes are defined for target grid points that do not contain any raw data pixel. In contrary to the topography, where a bilinear interpolation is performed, here the nearest neighbor is searched. The associated land use class is used with the lookup tables, and the target fields are defined.
The target fields are written to a NetCDF buffer file, which can later be used for the consistency check. There is a file for the chosen land use data set, and one, if needed at all, for the GLCC land use data. Finally the allocated memory is deallocated again.
"},{"location":"user_manual/user_manual_03_fortran_modules/#terra_urb","title":"TERRA-URB","text":"NOTE: currently the TERRA-URB module in EXTPAR only works with the Ecoclimap-SG database, as this is the only database available for extpar with an LCZ map.
The executable extpar_landuse_to_buffer also includes the TERRA-URB module, controlled by the logical switch l_terra_urb. This module uses a 2D map of local climate zones (LCZ) to determine a set of urban canopy variables used by TERRA-URB in COSMO/ICON, see Table 7. The module aggregates the variables and outputs them to the lu_buffer_file. The aggregation procedure follows that of the other land use variables described in the previous sections. The TERRA-URB related variables then pass through the subprogram extpar_consistency_check (see section 3.7) and are written out to the final extpar file for both COSMO and ICON. ICON would typically ignore these fiels and just use the information from the LU_CLASS_FRACION field, as is done for other land use variables, except for when ntiles=1 in which case it needs the 2D fields. The ISA and AHF EXTPAR modules must be turned off when running with l_terra_urb=.true, as these fields are computed within the TERRA-URB module. The code for this module is based upon Matthias Demuzere's WUDAPT-to-COSMO [@Varentsov2020] and Handrik Wouters' SURY [@Wouters2016] codes. The LCZ look-up tables are based on the values published in [@Stewart2012; @Stewart2014].
Variable name Description FR_URBAN Urban area fraction ISA Impervious surface area AHF Anthropogenic heat flux FR_PAVED Fraction of impervious surface area URB_FR_BLD Urban building fraction URB_H_BLD Urban building height URB_H2W Urban canyon height to width ratio URB_ALB_SO Urban shortwave (solar) albedo URB_ALB_TH Urban thermal albedo URB_EMIS Urban emissivity URB_HCON Urban mean heat conductivity URB_HCAP Urban mean heat capacity
Table 7: Varialbes provided by the TERRA-URB module
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_1","title":"Used namelist files and data in-/output","text":"namelists files:
data input:
Output:
The executable extpar_aot_to_buffer aggregates aerosol optical thickness data to the target grid.
"},{"location":"user_manual/user_manual_03_fortran_modules/#target-grid-definition_2","title":"Target grid definition","text":"The definition of the target grid is again done using the namelist INPUT_grid_org
. As the subroutines are exactly the same as the ones used in extpar_topo_to_buffer, it is referred to the subsection 'Target grid definition' in section 3.1, where the procedure is explained in more detail.
The namelist INPUT_AOT
is kept very simple. It contains only the path and the name of the raw aerosol optical depth data. The integer switch (iaot_type) informs EXTPAR which of the 4 available datasets has been chosen: 1 (Tegen), 2 (AeroCom), 3 (MACC-II), 4 (MACv2) or 5 (CAMS) . Additionally, also the filenames of the buffer and output files for the aggregated data is specified.
In order to allocate the variables used to read the raw data, the dimensions of the raw data is defined. These dimensions include the number of rows and columns of the NetCDF raw data file, the number of months, which is equal to 12, as a full yearly cycle is described, and the number of types of aerosols contained in the raw data file. This number is 5 for iaot_type=1,2 or 3 , as the raw data file contains the aerosol optical thickness information of black carbon, dust, organic matter, sulfate and sea salt. iaot_type=4 is used for a new formulation of the radiation-aerosol interaction available only in version of COSMO later than 5.04. This provides data of the aerosol optical thickness, the single scattering albedo and the asymmetry factor for the 8 spectral bands defined in the RG92 radiation scheme. iaot_type=5 is used only for ICON model. The raw data file contains the layer-integrated mass information of 11 types of aerosols: Sea Salt (3 bin), Mineral Dust (3 bin), hydrophilic and hydrophobic organic matter, hydrophilic and hydrophobic black carbon and sulfate. Also the raw data file contains the pressure for 60 vertical levels. The 3 first data-sets which provide raw data for different aerosol types refer to Tegen1, AeroCom2 and MACC-II3 whereas the fourth data-set is derived from MACv24 and the fifth data-set is derived from CAMS5.
In a next step, the complete raw data is read into memory; this is possible since the aerosol optical depth raw data is of rather coarse resolution (see Table 8). Also, the grid of the raw data is determined from NetCDF meta data. Before the aggregation to the target grid can start, the target grid fields must be allocated, using the target grid, the number of months and aerosol types or spectral bands.
Raw data set resolution Tegen 4 x 5 degree AeroCom 1 x 1 degree MACC-II 1.125 x 1.125 degree MACv2 1 x 1 degree CAMS 3 x 3 degree x 60 levels
Table 8: Resolution of raw data-sets for aerosol optical depths.
"},{"location":"user_manual/user_manual_03_fortran_modules/#aggregation-of-the-aerosol-optical-depth-to-the-target-field","title":"Aggregation of the aerosol optical depth to the target field","text":"As the resolution of all raw data sets is so coarse, there is no need to go through the whole raw data set and find the corresponding target grid element. Here there is only one loop over the target grid. For every target grid element four surrounding raw data points are searched for. With these four points, a weight for the bilinear interpolation is computed. As the raw data grids of the 5 different aerosols are equal, the four surrounding points are the same for all months and aerosol types. Four new arrays (SW, SE, NE, NW) are then defined, which contain the four neighbor values, for each month and each type. These can now be used, together with the previously calculated weights, to calculate the bilinear interpolation.
Finally the data is saved in a NetCDF buffer and an output file, and the allocated variables are deallocated.
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_2","title":"Used namelist files and data in-/output","text":"namelists files: INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID, INPUT_AOT
data input: aot_GACP.nc, aod_AeroCom1.nc, aod_MACC_2003-2012.nc, aod_MACC_2003-2012_proc.nc, aot_MACv2.nc, aot_CAMS_2003-2013.nc
Output: buffer file with aerosol data (/aerosol_io_extpar/ aot_buffer_file)
The executable extpar_soil_to_buffer aggregates soil data of the FAO Digital Soil Map of the World or of the Harmonized World Soil Data (HWSD) to the target grid.
"},{"location":"user_manual/user_manual_03_fortran_modules/#target-grid-definition_3","title":"Target grid definition","text":"The definition of the target grid is again done using the namelist INPUT_grid_org
. As the subroutines are exactly the same as the ones used in extpar_topo_to_buffer, it is referred to the subsection 'Target grid definition' in section 3.1, where the procedure is explained in more detail.
The variables for the raw soil data are read from the namelist INPUT_SOIL
. These variables are the path and the names of the raw data files and two switches to decide whether the FAO or the HWSD data should be used and if the deep soil data is desired or not. The integer switch isoil_data determines the raw data and processing used: 1 for FAO, 2 for the HWSD data-set6 and 3 for the use of HWSD data with mapping to TERRA soil types. The switch to choose the production of deep soil information is a logical (only applicable to isoil_data=2). Additionally, the names of the buffer files are specified. Be aware that a change of the integer switch from FAO to HWSD requires also the manual replacement of the raw data file names in the namelist.
After reading the namelist, a check is made on the production of subsoil characteristics. This is only supported for HWSD data, and a warning is issued in case of bad usage.
The dimensions of the raw soil data are defined, which include the number of grid points in the latitudinal and longitudinal direction, as well as the number of soil data code of the raw data. These values are needed to allocate the soil data with the proper size.
The mapping between raw data sets specific codes and some standard soil types is defined; this concerns the soil types undefined
, default
, ice
and water
.
As the soil data is provided in one single file, all data can be read in one shot. The data that are read from the NetCDF file are the texture and the slope of the soil data and the soil code. The aggregation of the data is done in a different way for the FAO and HWSD data, as these result in two completely different variables. Moreover, for HWSD data, to conserve memory, the topsoil data are allocated first and aggregated to the target grid, before the same is done for the subsoil.
"},{"location":"user_manual/user_manual_03_fortran_modules/#aggregation-of-the-fao-and-hwsd-data-with-terra-mapping-to-the-target-grid","title":"Aggregation of the FAO and HWSD data with TERRA mapping to the target grid","text":"The following paragraphs describe computations on the raw data grid.
The soil data is read using a loop over the latitude and the longitude. This results in a point-wise reading of the raw data. As soon as the point is read, its corresponding target grid element is defined. If the regular latitude/longitude grid point is not contained in the target grid, a new point is read. If however the point is inside the target grid, the aggregation can begin.
The number of raw data pixels is increased by one, if a raw data point can be assigned to a target grid point. This number is later used to define the fraction land defined by the soil data. The corresponding soil unit is deduced from the raw data. If the soil unit is zero, this is an ocean pixel and the number of sea points is increased by one. If the soil code differs from zero, the number of land points is increased by one. The soil code is then associated to either a special or a normal soiltype. For all the special soiltypes such as ice, rock, salt, histosols, dunes and no data flags the respective texture (coarse, medium, fine) are defined using a lookup table. All other soil units are described using the texture available in the raw data. These values define the final texture variable texture
.
The following paragraphs describe computations on the target grid.
In the following a loop is opened over the target grid points. First of all the fraction land is defined using the number of land pixels minus the number of inland water pixels, which is then averaged by the number of raw data pixels that were available for the target grid element. In a next step the texture for every target grid element is defined. For the special soiltypes (texture larger than 900) the corresponding number is associated. For the normal soiltypes (texture smaller than 900) the texture is calculated as average of the summed up texture. The resulting texture value is multiplied by 100 and converted into an integer number. This number is used to associate the final soiltype to every target grid element. The soiltypes are described in more detail in table 9. For target grid points that do not contain any raw data points, the nearest neighbor in the raw data is defined. If the target grid point is outside the raw data grid the slope is defined as zero and the texture as undefined.
TERRA Code Soiltype raw data code 1 ice and glacier7 9001 2 rock, lithosols 9002 3 sand 9003 (salt), 9005 (shifting sands and dunes) and coarse texture 4 sandy loam coarse to medium texture 5 loam (default soiltype) 9009 (undefined), 9012 (dominant part undefined), medium texture 6 loamy clay medium to fine texture 7 clay fine texture 8 histosols (peat) 9004 9 water 9000 (undefined: inland water), -9 (undefined: ocean)
Table 9: TERRA soiltypes and their respective FAO raw data codes.
"},{"location":"user_manual/user_manual_03_fortran_modules/#aggregation-of-the-hwsd-data-to-the-target-grid","title":"Aggregation of the HWSD data to the target grid","text":"The aggregation starts again with a loop over the latitudes and longitudes. For each grid point a target grid element is looked for. If there is a target grid element, the aggregation can start. The soiltype is defined using the raw data value, if it is above zero, and zero otherwise. Additionally, all the ocean, land and lake points are counted in order to determine the land fraction which is calculated as the difference between the summed up land and lake points normalized by the number of raw data pixels available. For target grid points with no raw data, the nearest neighbor in the raw data is defined.
The resulting soiltype is not yet usable, as it contains numbers coded in a world code and not in TERRA soiltypes. This transformation is done in the consistency check, where the special soiltypes of the HWSD data, specified in Table 10, are packed in the variable SOILTYP
the normal soiltypes are given in fractions of sand, silt, clay and organic carbon, and the bulk density is also given.
TERRA Code Soiltype TERRA Code Soiltype 1 ice and glacier 8 histosols (peat) 2 rock, lithosols 9 water 3 sand 10 alkali flat 4 sandy loam 11 shifting sand, dunes 5 loam (default soiltype) 12 Urban, human disturbed 6 loamy clay 225 Unknown 7 clay
Table 10: New TERRA soiltypes deduced from the HWSD data.
"},{"location":"user_manual/user_manual_03_fortran_modules/#output-of-the-soil-data","title":"Output of the soil data","text":"The soiltypes and the fraction land, together with the undefined value, the latitudes and longitudes are saved in a NetCDF buffer file. This is later used to perform the consistency check, which is especially important for the HWSD data, as the main transformation of the data takes place there.
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_3","title":"Used namelist files and data in-/output","text":"namelists files: INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID, INPUT_SOIL
data input: FAO_DSMW_double.nc, FAO_DSMW_float.nc, HWSD0_30_topsoil.nc, HWSD30_100_subsoil.nc
Lookup tables for HWSD: LU_TAB_HWSD_UF.data, HWSD_DATA_COSMO.data, HWSD_DATA_COSMO_S.data
Output: buffer file with soil data (/soil_io_extpar/ soil_buffer_file)
The executable extpar_flake_to_buffer aggregates lake depth data and lake fraction to the target grid.
"},{"location":"user_manual/user_manual_03_fortran_modules/#target-grid-definition_4","title":"Target grid definition","text":"The definition of the target grid is again done using the namelist INPUT_grid_org
. As the subroutines are exactly the same as the ones used in extpar_topo_to_buffer, it is referred to the subsection 'Target grid definition' in section 3.1, where the procedure is explained in more detail.
As only the target grid dimensions are needed to allocate the target fields, this is done right after the definition of the target grid. Then the namelist INPUT_FLAKE
is read to define the path and the filename of the raw lake data. Also the names of the buffer and the output file for the consistency check are given. Once more the dimensions of the raw data are needed to allocate the raw data correctly; these dimensions are deduced from the netcdf file directly and the raw data grid is defined.
The following paragraphs describe computations on the raw data grid.
The data is read row-wise, through a loop over the latitudes, shipping all latitudes not inside the user specified domain. If a row is kept, a new loop over the longitudes is started to treat the raw data point-wise. For each point, the corresponding target field element is defined. This is done in the same way described in the subsection 'Aggregation of the topography to the target grid' in section 3.1 and Fig. 5. The number of raw data pixels that contribute to the target grid value are summed up as well as the lake depth, which is multiplied by a scale factor deduced from the area of each pixel that contributes to a lake fraction.
The following paragraphs describe computations on the raw data grid.
The lake fraction is derived and the lake depth is obtained by normalizing the weighted sum previously computed. Where no lake depth is available the value is set to undefined (-1). In case that no raw data pixel is available the nearest neighbor in the raw data is searched for.
The target fields are then written to a netcdf buffer and output file. Finally the allocated memory can be released.
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_4","title":"Used namelist files and data in-/output","text":"namelists files: INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID, INPUT_FLAKE
data input: GLDB_lakedepth.nc
Output: buffer file with flake data (/flake_io_extpar/ flake_buffer_file)
This program processes HWSD (Harmonized World Soil Database) data and aggregates it onto a target grid.
The code is a module named \"mo_agg_hwsdART\" that contains a subroutine called \"agg_hwsdART_data_to_target_grid\". This subroutine is used to aggregate data from the HWSD dataset to a target grid. The HWSD dataset contains soil unit information classified according to the USDA soil classification system.
The module uses several other modules, including \"mo_logging\" for logging purposes, \"mo_kind\" to define kind parameters, \"mo_hwsdART_data\" to define the different soil types according to the USDA classification, \"mo_hwsdART_tg_fields\" to define variables related to the target grid, and \"mo_grid_structures\" to define grid structures.
The subroutine takes input parameters including the target grid structure (\"tg\"), the HWSDART soil unit data (\"hwsdART_soil_unit\"), the grid of HWSDART data (\"hwsdART_grid\"), and the longitude and latitude coordinates of the HWSDART grid (\"lon_hwsdART\" and \"lat_hwsdART\").
The subroutine initializes local variables and arrays to store the counts of different soil types in each grid element of the target grid. It also sets an undefined integer value and initializes the count of raw data pixels to zero.
The subroutine then iterates over the HWSDART grid and finds the nearest target grid element for each raw data pixel using the \"find_nearest_target_grid_element\" function. If the raw data pixel is out of the range of the target domain, it is skipped.
For each valid raw data pixel, the subroutine counts the number of raw data pixels in the target grid element and increments the count for the corresponding soil type in the local arrays.
After the iteration over the HWSDART grid, the subroutine iterates over the target grid to calculate the fraction of each soil type in each grid element. It divides the count of each soil type by the total number of raw data pixels in the grid element and stores the fractions in the corresponding variables.
The code aggregates the HWSD soil data in USDA scheme to a target grid, calculating the fraction of each soil type in each grid element for application in ICON-ART simulations.
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_5","title":"Used namelist files and data in-/output","text":"namelists files: INPUT_grid_org, INPUT_ICON_GRID, INPUT_hwsdART
data input: HWSD0_USDA.nc
Output: buffer file with fraction of soil type classes (hwsdART_extpar_ICON.nc)
The extpar_consistency_check is performed after all raw data have been aggregated to the target grid to remove any inconsistencies that may appear among the different data and to derive additional information using multiple raw data sources.
"},{"location":"user_manual/user_manual_03_fortran_modules/#reading-of-namelists","title":"Reading of namelists","text":"Before the grid is defined, the namelists INPUT_RADTOPO
, INPUT_ORO
and INPUT_SOIL
are read to obtain the settings of the different switches that are used (e.g. lradtopo, itopo_type, lsso_param, isoil_data, ldeep_soil). Then the namelist INPUT_grid_org
is read to obtain the target grid information and the grid type.
In a next step the INPUT_LU
is read by extpar_consistency_check to check if the GLCC data set is required, which is the case if the target grid domain reaches more to the south than the chosen raw land-use data set. (Globcover and GLC_2000 are not global.)
If the namelist INPUT_ERA is present (indicating that one uses the ERA climatologies generated by extpar_era_to_buffer) the buffer file name is retrieved. If this namelist is not present (legacy climatologies from ICON-REMAP-TOOL are used), the buffer file names in INPUT_CHECK are read. After that step, all other namelists of the EXTPAR modules are read in order to retrieve the buffer file name for each data set. These files are read and all the variables needed for the final external parameters file are allocated.
An additional namelist that is used is INPUT_CHECK
, it contains a couple of switches to define the processing in the consistency check.
The first task after reading the namelists is to derive the correct land sea mask from the land use data. If the GLCC data must be used, the land sea mask below the southern band is deduced from GLCC.
Then the total roughness length is computed as the sum of the roughness length deduced from the land-use and the topography.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-for-water-and-ice-pixels","title":"Consistency check for water and ice pixels","text":"The definition of a water grid element is based on the land-use data. The vegetation is set to zero for all water grid elements and FAO derived soil type is set to water. For non water pixels with undefined or invalid soil type, the FAO derived soil type is either set to default, which is loam, or to ice for regions that are below 60 degrees south (where only Antarctica is located).
All the points that are classified as ice in the land-use data but not in the FAO derived soil type, are changed to ice in the latter; the vegetation of these pixels is set to zero.
The HWSD derived soiltype needs a transformation from the world code to the TERRA code, which is performed here. The world code is decoded with the TERRA HWSD lookup table, to define the regions that contain a special soiltype (see the special soiltypes in Table 10). For each grid point the world code is associated to the single fractions of the soil composition, using an other lookup table. If there is a point that does not contain a bulk density it is calculated using the formula of the cultivated topsoil or the compact subsoil from Hollisa et al. (2012)8 and Woesten et al. (1999)9. Furthermore there is a special treatment of peat with histosols. The whole procedure is also done for the subsoil, if it is desired at all.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-of-lake-data","title":"Consistency check of lake data","text":"Water grid points are either declared as lake or ocean, thus over land a fraction lake and over the ocean a fraction ocean is defined. Where the fraction land deduced from the topography is smaller than 0.99 the fraction ocean is defined. All the other points are used to determine the fraction lake. Both fractions are defined such that fr_lake or fr_ocean plus fr_land_lu (fraction land deduced from land-use) sum up to one. Some smaller seas must be defined manually, thus for the region of the Dead Sea and the Caspian Sea not fraction lake but fraction ocean is calculated.
For fr_land 10 and fr_ocean 11 larger than a half, the lake depth is set to undefined. A default value for the lake depth is used for grid elements with a lake fraction 12 larger than a half and a negative lake depth. Additionally a maximum and minimum lake depth is defined. Included is also a manual correction of the depth of Lake Constance.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-of-albedo-data","title":"Consistency check of albedo data","text":"The consistency check of the albedo data concerns land pixels that have a albedo smaller than 0.07. For these pixels a weighted bilinear interpolation is performed. Only land points are used for the interpolation, if there is no surrounding land point a warning message is printed. Values that are still too small receive a soiltype dependent albedo. This is done for all three wavelengths.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-of-ndvi-data","title":"Consistency check of NDVI data","text":"The next consistency check is performed with the normalized difference vegetation index (NDVI). The NDVI values are set to undefined for water grid points. Additionally, values that are smaller than a predefined value are set to exactly this value.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-of-the-temperature-climatology","title":"Consistency check of the temperature climatology","text":"The consistency check of the temperature climatology contains a height correction and is only performed for the finer resolved temperature climatology (e.g. it_cl_type = 1). The temperature is set to undefined for all the sea points. For land points that have a valid temperature, it is adjusted to the height. This is done by considering a constant temperature rate of 0.65 K per 100m:
\\(\\frac{dT}{dh} = -\\frac{0.65 K}{100 m}\\).
Target points that do not contain temperature values larger than zero are filled with surrounding values. First a valid point is looked for in the surrounding \\(3\\times3\\) grid box. If still no valid point can be found, it is searched along the longitude, and if nothing else helps the nearest neighbor is tried.
"},{"location":"user_manual/user_manual_03_fortran_modules/#consistency-check-of-all-other-fields","title":"Consistency check of all other fields","text":"All other fields are assumed to be independent and are written to the output file exactly as they were read in. A special treatment applies to the ISA, AHF, EMISS and S_ORO fields. Whenever their respective namelist input file is missing in the working directory where extpar_consistency_check is executed these fields are not added to the output file. An exception to this rule applies to the ISA and AHF fields which are added to the output file if the logical switch l_terra_urb is set to .TRUE. in the INPUT_LU namelist; see section 3.2.2 for more details.
"},{"location":"user_manual/user_manual_03_fortran_modules/#definition-of-special-points","title":"Definition of special points","text":"Be aware that the definition of special points has only been tested for the COSMO grid and can only be used if the FAO raw soil type is used. At the moment there are three special points (1: Falkenberg, 2: Waldstation, 3: Lindenberg). At each of these points, values for soiltype_sp, z0_sp, rootdp_sp, plcovmn_sp, plcovmx_sp, laimn_sp, laimx_sp can be explicitly set by the user. The coordinates of the special point are also user specified. If no special treatment at these points is desired the number_special_points must be set to zero (see Table 11). If no special treatment is desired at all, the integer switch i_lsm_treatment can be set to 1 instead of 2.
number_special_points Treatment of special points 0 NO treatment of special points 1 special treatment of Falkenberg 2 special treatment of Falkenberg and Waldstation 3 special treatment of Falkenberg, Waldstation and Lindenberg
Table 11: Usage of the namelist parameter number_special_points.
"},{"location":"user_manual/user_manual_03_fortran_modules/#reduced-main-memory-usage","title":"Reduced main memory usage","text":"Since Exptar Version 5.4 a new feature was introduced which allows the running of extpar_consistency_check for very high resolution global grids without any restrictions on the hardware memory specifications. A POSIX mmap based implemetation of disk caching arrays is used to use main memory as much as possible and, if more memory is required, the duty to handle this request is delegated to the kernel. A requirement to run this properly is the provision of swap space in the expected total memory use. With this technique we could process a global R2B11 ICON grid (around 1.25 km grid resolution) on a server with 256 GB main memory. Of course processing gets quite slow, but is still in the order of a couple of cups of coffee.
The feature can be enabled with the namelist variable l_use_array_cache = .TRUE. in namelist extpar_consistency_check_io. The namelist variable default is l_use_array_cache =.FALSE., which is selecting the standard heap allocation by Fortran's ALLOCATE statement.
"},{"location":"user_manual/user_manual_03_fortran_modules/#writing-output","title":"Writing output","text":"The final results are written into a netcdf file. The output file name can be specified in the namelist INPUT_CHECK
.
Since EXTPAR Version 5.4 the output possibilities have been extended for ICON only. The EXTPAR output procedure for COSMO did not change with Version 5.4. As ICON and a lot of its associated tools (eg. CDO, DWD icontools) are already using a single abstract interfacing library CDI, a re-implementation for the final EXTPAR output procedure with CDI to prepare for future developments is provided. Note, that this re-implementation replaces the former writing-routine completely. For a detailed description of CDI look at https://code.mpimet.mpg.de/projects/cdi .
"},{"location":"user_manual/user_manual_03_fortran_modules/#used-namelist-files-and-data-in-output_6","title":"Used namelist files and data in-/output","text":"namelists files: INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID, INPUT_CHECK, INPUT_
data input: all buffer files from the EXTPAR modules defined in the INPUT_
namelist files
data output: netCDF containing all external parameters (/extpar_consistency_check_io/ netcdf_output_filename)
Tegen, I., P. Hollrigl, M. Chin, I. Fung, D. Jacob, and J. Penner 1997. Contribution of different aerosol species to the global aerosol extinction optical thickness: Estimates from model results. J. Geophys. Res., 102, 23895-23915.\u00a0\u21a9
Kinne, S., M. Schulz, C. Textor, S. Guibert, Y. Balkanski, S.E. Bauer, T. Berntsen, T.F. Berglen, O. Boucher, M. Chin, W. Collins, F. Dentener, T. Diehl, R. Easter, J. Feichter, D. Fillmore, S. Ghan, P. Ginoux, S. Gong, A. Grini, J. Hendricks, M. Herzog, L. Horowitz, I. Isaksen, T. Iversen, A. Kirkev\u00e5g, S. Kloster, D. Koch, J.E. Kristjansson, M. Krol, A. Lauer, J.F. Lamarque, G. Lesins, X. Liu, U. Lohmann, V. Montanaro, G. Myhre, J. Penner, G. Pitari, S. Reddy, \u00d8. Seland, P. Stier, T. Takemura, and X. Tie: An AeroCom initial assessment optical properties in aerosol component modules of global models, Atmos. Chem. Phys., 6, 1815-1834, 2006.\u00a0\u21a9
Morcrette, J.-J., O. Boucher, L. Jones, D. Salmond, P. Bechtold, A. Beljaars, A. Benedetti, A. Bonet, J. W. Kaiser, M. Razinger, M. Schulz, S. Serrar, A. J. Simmons, M. Sofiev, M. Suttie, A. M. Tompkins, and A. Untch, 2009: Aerosol analysis and forecast in the ECMWF Integrated Forecast System. Part I: Forward modelling, J. Geophys. Res., 114D, D06206,doi:10.1029/2008JD011235\u00a0\u21a9
Kinne, S., D. O'Donnel, P. Stier, S. Kloster, K. Zhang, H. Schmidt, S. Rast, M. Giorgetta, T. F. Eck, and B. Stevens (2013), MAC-v1: A new global aerosol climatology for climate studies, J. Adv. Model. Earth Syst., 5, 704--740, doi:10.1002/jame.20035.\u00a0\u21a9
Bozzo, A., Benedetti, A., Flemming, J., Kipling, Z., R\u00e9my, S. (2020). An aerosol climatology for global models based on the tropospheric aerosol scheme in the Integrated Forecasting System of ECMWF. Geoscientific Model Development, 13(3), 1007-1034.\u00a0\u21a9
Release 5.0 of COSMO and 2.0 of INT2LM do not support HWSD data, as the representation of the soil associated with this new data set has changed and is based on the use of pedotransfer functions and on fraction of soil components (e.g. clay, silt, ...)\u00a0\u21a9
Soiltypes written in bold indicate a special soiltype.\u00a0\u21a9
J.M. Hollisa, J. Hannamb and P.H. Bellamyb, February 2012, Empirically-derived pedotransfer functions for predicting bulk density in European soils, European Journal of Soil Science, 63, 96109 doi: 10.1111/j.1365-2389.2011.01412.x\u00a0\u21a9
J.H.M. Woesten, A. Lilly, A. Nemes and C. Le Bas, Development and use of a database of hydraulic properties of European soils, Geoderma, Volume 90, Issues 34, July 1999, Pages 169-185, doi: 10.1016/S0016-7061(98)00132-3.\u00a0\u21a9
derived from the land use data\u00a0\u21a9
derived from the land use data\u00a0\u21a9
derived from the lake data set\u00a0\u21a9
The general workflow of all Python modules is the same. An exemplary workflow of the Python modules is described below:
At the beginning of the program information about the environment on which EXTPAR is running is written to the logfile and all left-overs from prior executions of the same EXTPAR module are deleted. In a next step each parameter from the namelist namelist.py
is checked for correctness as well as assigned to an internal variable for later use in the program. The specifaction about the target grid is directly read from the Fortan namelist-files INPUT_grid_org
. The next step in the modules involves the generation of all necessary meta-data for the buffer files and the write of a namelist files in the style of a Fortran namelist, containing all information needed for the consistency_check at the end. In case of a COSMO target grid, a grid specification file is written, that is later used by CDO for the interpolation.
After this is all setup, the most compute-intensive parts like the remapping to the target grid or data modifications are done using CDO. The Python program launches a subshell executing the CDO in it. The output from CDO is reshaped in order to fit the dimensions of the buffer files. After the reshape, the fields and its corresponding metadata is written to a netCDF buffer file. The last step of the programme again deletes all intermediate netCDF or other files written during runtime, that do not serve any purpose.
Module-specific modifications or additional computations are described in the paragraph Data processing of each Python module.
"},{"location":"user_manual/user_manual_04_python_modules/#namelist","title":"Namelist","text":"The namelist namelist.py
contains the Python dictionaries input_alb
, input_tclim
, input_emiss
, input_ndvi
, input_ahf
, input_isa
and input_edgar
. These dictionaries replace their corresponding Fortran namelist files INPUT_
.
input_alb
provides information about the albedo data type and the paths and filenames of the input/output data.
input_tclim
contains a switch to determine the type of data (coarse or fine) as well as the paths and filenames of the input/output data.
input_emiss
contains a switch to determine the type of emissivity data (full range or long-wave) and the filename and paths of the input/output data.
input_ndvi
only provides information about the the path and the filenames of the input/output data.
input_era
only provides information about the the path and the filenames of the input/output data.
input_isa
contains a switch determine the type of ISA data and provides information about the the path and the filenames of the input/output data.
input_ahf
contains a switch determine the type of AHF data and provides information about the the path and the filenames of the input/output data.
input_edgar
only provides information about the the path and the filenames of the input/output data.
The executable extpar_alb_to_buffer allows the aggregation of two different kinds of albedo data to the target grid. The first kind is a climatology of monthly values of total albedo derived from MODIS satellite data for the 3 spectral bands visible, near infrared and ultraviolet. The second kind contains information for soil albedo only in dry and saturated conditions. It originates from the Community Land Model1.
"},{"location":"user_manual/user_manual_04_python_modules/#data-processing","title":"Data processing","text":"The data is remapped to the target grid using the distance-weighted average interpolation. CDO first generates the weights for the interpolation from one of the input files and then applies these weights to all input files. After the interpolation took place, all values in the range of -100000 - 0.02 are set to 0.02 to prevent unrealistic data-points. All other steps in extpar_alb_to_buffer are following the general workflow of the Python scrips.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output","title":"Used namelist files and data in-/output","text":"namelist files: namelist.py (dict: input_alb), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_ALB
data input: month_alb.nc, month_alnid.nc, month_aluvd.nc, global_soil_albedo.nc
data output: buffer file with albedo data (input_alb: alb_buffer_file)
The executable extpar_cru_to_buffer aggregates the temperature climatology of the Climate Research Unit (CRU) to the target grid. The namelist namelist.py
gives the information of the path and the name of the raw temperature climatology data file. Additionally, the filename for the buffer is provided. There is an integer switch (it_cl_type), which allows the choice between a newer higher resolved data set for land surfaces only (1) and an older coarser raw data set for sea surfaces in combination with the higher resolved data set over land (2). Aggregation of the coarse data set over land surfaces is no longer supported since EXTPAR Version 5.4.
The data processing with CDO for it_cl_type = 1 involves 4 steps:
Set seapoints in the data to missing value.
Extract the fields HSURF
from the fine data set.
Merge the fields from step 1 and step 2.
Remap data from step 3 to the target grid using distance-weighted average interpolation.
The data processing with CDO for it_cl_type = 2 involves 5 steps:
Convert coarse data from Celsius to Kelvin, calculate yearly mean values and remap coarse data to the grid of the higher resolved data set.
Take landpoints from the fine data set and the seapoints from the data processed in step 1.
Extract surface height from the buffer file of extpar_topo_to_buffer
Smooth data processed in step 2 and remap to target grid using distance-weighted average interpolation.
Correct data processed in step 4 with the surface height extracted in step 3.
All subsequent processing on the data follows the general workflow of the Python scripts.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_1","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_tclim), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_TCLIM
data input: absolute_hadcrut3.nc, CRU_T2M_SURF_clim.nc, CRU_T_SOIL_clim.nc, orography_buffer_file (it_cl_type = 2 only)
Output: buffer file with CRU data (input_tclim: t_clim_buffer_file)
The executable extpar_emiss_to_buffer aggregates CAMEL (Combined ASTER and MODIS Emissivity for Land) data to the target grid. For the aggregation of the emissivity the namelist namelist.py
provides the path and the file name of the input data. The buffer file name is defined as well. There exists the integer switch (iemiss_type) to determine whether one wants to use the broad band emissivity for the 3.6 and 14.3 micron spectral range (1) or the broad band emissivity between 8.0 and 13.5 micron spectral range (2).
After the generation of the interpolation weights artificial low values below 0.5 are set to -999. In a subsequent processing step -999 is set to the value for missing data. In order to not have missing data in the field to interpolate, all missing values are set to the values of its nearest neighbour. The last step involves the first order conservative interpolation to the target grid. After the remapping with CDO two additional fields are computed:
EMISS_MAX, the maximum EMISS value over 12 months
EMISS_MRAT, the monthly ratio with respect to the maximum EMISS
namelists files: namelist.py (dict: input_emiss) INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_EMISS
data input: CAM_bbe_full_2010-2015\u1e45c or CAM_bbe_lw_2010-2015\u1e45c
Output: buffer file with CAMEL data (input_emiss: emiss_buffer_file)
The executable extpar_ndvi_to_buffer aggregates NDVI data (Normalized Differential Vegetation Index) to the target grid. The namelist namelist.py
only contains the path and the file name of the raw NDVI data. No other parameters can be set.
For the aggregation of the normalized differential vegetation index the namelist namelist.py
is simple. It contains the path and the filename of the raw data set, as well as the names of the buffer. No other parameters can be set.
The remapping to the target grid uses the first order conservative interpolation. After the remapping with CDO two additional fields are computed:
NDVI_MAX, the maximum NDVI value over 12 months
NDVI_MRAT, the monthly ratio with respect to the maximum NDVI
namelists files: namelist.py (dict: input_ndvi), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_NDVI
data input: NDVI_1998_2003.nc
Output: buffer file with NDVI data (input_ndvi: ndvi_buffer_file)
The executable extpar_era_to_buffer aggregates ERA data (T2M, SST, W_SNOW and ORO) to the target grid. It replaces the two NetCDF-Files generated by ICON-REMAP at DWD. Note that this executable is for Icon-grids only.
For the aggregation of the ERA climatologies the namelist namelist.py
is simple again. It contains the type of ERA climatology (ERA5 (1) or ERA-I (2)) the path and the filenames of the raw data sets, as well as the names of the buffer. No other parameters can be set.
The remapping to the target grid uses the first order conservative interpolation. After the remapping with CDO the field W_SNOW is scaled by a factor 1000. No other processing steps take place.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_4","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_era), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_ERA
data input: ERA5_ORO_1990.nc, ERA5_SD_1990_2019.nc, ERA5_SST_1990_2019.nc and ERA5_T2M_1990_2019.nc ERA-I_ORO_1986.nc, ERA-I_SD_1986_2015.nc, ERA-I_SST_1986_2015.nc and ERA-I_T2M_1986_2015
Output: buffer file with ERA data (input_era: era_buffer_file)
The executable extpar_isa_to_buffer allows the aggregation or interpolation of data on the fraction of impervious surface area needed by TERRA_URB to the target grid.
For the aggregation of the ISA the namelist namelist.py
is simple again. It contains the type of ISA (NOAA (1) or EEA (2)) the path and the filenames of the raw data sets, as well as the names of the buffer. No other parameters can be set. Note that the underlying processing does not differ between different types of ISA
The remapping to the target grid uses the bilinear interpolation. No other processing steps take place.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_5","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_isa), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_ISA
data input: EEA_ISA_16bit_lonlat.nc( isa_type=2), NOAA_ISA_16bit_lonlat.nc (isa_type=1)
Output: buffer file with ISA data (input_isa: isa_buffer_file)
The executable extpar_ahf_to_buffer allows the aggregation or interpolation of data on the anthropogenic heat flux needed by TERRA_URB to the target grid.
For the aggregation of the AHF the namelist namelist.py
is simple again. It contains the type of AHF (2.5min (1) or 30sec (2)) the path and the filenames of the raw data sets, as well as the names of the buffer. No other parameters can be set. Note that the underlying processing does not differ between different types of AHF
The remapping to the target grid uses the bilinear interpolation. No other processing steps take place.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_6","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_ahf), INPUT_grid_org, INPUT_COSMO_GRID, INPUT_ICON_GRID
generate namelist: INPUT_AHF
data input: AHF_2006_2.5min_lonlat.nc (ahf_type=1),AHF_2006_NOAA_30sec_lonlat.nc (ahf_type=2)
Output: buffer file with AHF data (input_ahf: ahf_buffer_file)
The executable extpar_edgar_to_buffer allows the interpolation of global emission data for black carbon, organic carbon and sulfur dioxide needed for the 2D-Aerosol in ICON to the target grid.
The namelist contains only the path to the raw data, the raw data file names and the name of the buffer file.
The remapping to the target grid uses the first order conservative interpolation. No other processing steps take place.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_7","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_edgar), INPUT_grid_org, INPUT_ICON_GRID
generate namelist: INPUT_edgar
data input: v8.1_FT2022_AP_NH3_2022_TOTALS_flx.nc, v8.1_FT2022_AP_OC_2022_TOTALS_flx.nc, v8.1_FT2022_AP_BC_2022_TOTALS_flx.nc, v8.1_FT2022_AP_NOx_2022_TOTALS_flx.nc, v8.1_FT2022_AP_SO2_2022_TOTALS_flx.nc
Output: buffer file with EDGAR data (input_edgar: edgar_buffer_file)
The executable extpar_cdnc_to_buffer allows the interpolation of climatology data for cloud droplet number needed for the Cloud-Aerosol in ICON to the target grid.
The namelist contains only the path to the raw data, the raw data file names and the name of the buffer file.
The remapping to the target grid uses the first order conservative interpolation. No other processing steps take place.
"},{"location":"user_manual/user_manual_04_python_modules/#used-namelist-files-and-data-in-output_8","title":"Used namelist files and data in-/output:","text":"namelists files: namelist.py (dict: input_cdnc), INPUT_grid_org, INPUT_ICON_GRID
generate namelist: INPUT_cdnc
data input: cdnc_climatology_Q06.nc
Output: buffer file with cloud droplet number data (input_cdnc: cdnc_buffer_file)
https://svn-ccsm-inputdata.cgd.ucar.edu/trunk/inputdata/lnd/clm2/rawdata/mksrf_soilcol.081008.nc
Lawrence, P. J. and T. N. Chase (2007). \"Representing a new MODIS consistent land surface in the Community Land Model (CLM 3.0).\" Journal of Geophysical Research-Biogeosciences 112(G1).\\ Table 3.3 in: Oleson, K.W., D.M. Lawrence, G.B. Bonan, M.G. Flanner, E. Kluzek, P.J. Lawrence, S. Levis, S.C. Swenson, P.E. Thornton, A. Dai, M. Decker, R. Dickinson, J. Feddema, C.L. Heald, F. Hoffman, J.-F. Lamarque, N. Mahowald, G.-Y. Niu, T. Qian, J. Randerson, S. Running, K. Sakaguchi, A. Slater, R. Stockli, A. Wang, Z.-L. Yang, Xi. Zeng, and Xu. Zeng, 2010: Technical Description of version 4.0 of the Community Land Model (CLM). NCAR Technical Note NCAR/TN-478+STR, National Center for Atmospheric Research, Boulder, CO, 257 pp.\u00a0\u21a9
The EXTPAR software is subject to several limitations:
The ASTER domain can only be used from 60\u00b0N to 60\u00b0S. Be aware that an additional border of several gridpoints is needed if the topographically corrected parameters are desired. If the ASTER domain is exceeded a warning message is printed and the program extpar_topo_to_buffer is aborted.
The ASTER data shows some deficits, which are listed below:
Beyond 60 degrees north and south, the ASTER raw data set features several areas where no value is available e.g., over Finland (private communication with HIRLAM).
Some bogus regions may appear in complex topography. One of these regions is located near Grindelwald in Switzerland.
The ASTER data are subject to artefacts of the satellite fly-over bands. Discontinuities can be spotted at the borders of such bands. In high latitudes these bands are better visible than in the low latitudes.
As the correction of these deficits are time consuming no effort has been expended to remove these.
The ASTER data might be subject to a shift of a half gridpoint (15 meters) in both directions.
There is no 3 km filtered ASTER or MERIT/REMA data set to derive the subgrid scale orography (SSO
) parameters and the roughness length (z0
) for ASTER.
The HWSD raw data is in a test phase. Furthermore a new version of Int2lm and TERRA is needed to make use of these data sets.
The subsoil can only be used if the HWSD data is used for the topsoil. If the FAO and the HWSD data are combined a warning message is printed and the ldeep_soil parameter
is set to .FALSE.
.
The special points are only tested for the COSMO grid. Also it is not possible to use these corrections if the soil raw data set is HWSD.
Array-caching in the consistency_check is only supported for GCC compiler.
CAMS aersosl data iaot_type = 5
is only supported for Intel compiler.
EXTPAR uses 3 types of namelists in order to determine in which way data is processed.
INPUT_
)input_in namelist.py
)Whereas for the Fortran namelists and the Python dictionaries the user can specify parameters and filenames, the Fortran namelists generated during runtime by the Python scripts do not allow any user interaction.
"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_namelist_files","title":"Namelist files","text":"Namelist file Purpose Made by script Used by program INPUT_grid_org define target grid type runscriptextpar_consistency_check
, extpar_aot_to_buffer
, extpar_landuse_to_buffer
, extpar_topo_to_buffer
, extpar_cru_to_buffer
, extpar_ndvi_to_buffer
, extpar_soil_to_buffer
, extpar_flake_to_buffer
, extpar_isa_to_buffer
, extpar_ahf_to_buffer
, extpar_emiss_to_buffer
, extpar_hwsdART_to_buffer
INPUT_COSMO_GRID define target domain for COSMO grid runscript extpar_consistency_check
, extpar_aot_to_buffer
, extpar_landuse_to_buffer
, extpar_topo_to_buffer
, extpar_cru_to_buffer
, extpar_ndvi_to_buffer
, extpar_soil_to_buffer
, extpar_flake_to_buffer
, extpar_isa_to_buffer
, extpar_ahf_to_buffer
, extpar_emiss_to_buffer
, extpar_hwsdART_to_buffer
INPUT_ICON_GRID define target domain for ICON grid runscript extpar_consistency_check
, extpar_aot_to_buffer
, extpar_landuse_to_buffer
, extpar_topo_to_buffer
, extpar_cru_to_buffer
, extpar_ndvi_to_buffer
, extpar_soil_to_buffer
, extpar_flake_to_buffer
, extpar_isa_to_buffer
, extpar_ahf_to_buffer
, extpar_emiss_to_buffer
INPUT_ORO settings for orography data runscript extpar_topo_to_buffer
INPUT_OROSMOOTH settings for orography smoothing runscript extpar_topo_to_buffer
INPUT_RADTOPO settings for generating topographical shading fields runscript extpar_topo_to_buffer
INPUT_SCALE_SEP settings to control scale separation for SSO an Z0 calculation runscript extpar_topo_to_buffer
INPUT_LU settings for landuse data runscript extpar_landuse_to_buffer
INPUT_AOT settings for aerosol data runscript extpar_aot_to_buffer
INPUT_TCLIM settings for temperature data extpar_cru_to_buffer
extpar_consistency_check
INPUT_NDVI settings for NDVI data extpar_ndvi_to_buffer
extpar_consistency_check
INPUT_SOIL settings for soil data runscript extpar_soil_to_buffer
INPUT_FLAKE settings for lake data runscript extpar_flake_to_buffer
INPUT_ALB settings for albedo data extpar_albedo_to_buffer
extpar_consistency_check
INPUT_ISA settings for fraction of impervious surface area data extpar_isa_to_buffer
extpar_consistency_check
INPUT_AHF settings for anthropogenic heat flux data extpar_ahf_to_buffer
extpar_consistency_check
INPUT_EMISS settings for emissivity data extpar_emiss_to_buffer
extpar_consistency_check
INPUT_hwsdART settings for HWSD USDA data extpar_hwsdART_to_buffer
INPUT_edgar settings for EDGAR data extpar_edgar_to_buffer
extpar_consistency_check
INPUT_CDNC settings for cdnc data extpar_cdnc_to_buffer
extpar_consistency_check
INPUT_ERA settings for ERA data extpar_era_to_buffer
extpar_consistency_check
INPUT_CHECK settings for the consistency check runscript extpar_consistency_check
"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_grid_def","title":"Grid Definition","text":"The specification of the model type (COSMO or ICON) is done in the namelist file INPUT_grid_org, the detailed target grid description for the model domain has to be provided in the namelists files INPUT_COSMO_GRID or INPUT_ICON_GRID.
"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_grid_def_general","title":"General","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-grid_def-input_grid_org","title":"NAMELIST /grid_def/ (INPUT_grid_org)","text":"The namelist /grid_def/ defines the target grid type and the filenames with the namelists of the detailed target grid definition.
Parameter Type Default Unit Description igrid_type integer target grid type, 1 for ICON, 2 for COSMO domain_def_namelist character namelist file with domain definition domain_refinement character namelist file with domain refinement definition (e.g. for the ICON grid)"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_grid_def_icon","title":"ICON","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-icon_grid_info-input_icon_grid","title":"NAMELIST /icon_grid_info/ (INPUT_ICON_GRID)","text":"The namelist /icon_grid_info/ specifies the filenames and the directory of the Icon grid files with the coordinates of the Icon grid.
Parameter Type Default Unit Description icon_grid_dir character path to directory which contains the ICON grid file with the coordinates icon_grid_nc_file character (max_dom) filename of the ICON grid file with the coordinates"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_grid_def_cosmo","title":"COSMO","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-lmgrid-input_cosmo_grid","title":"NAMELIST /lmgrid/ (INPUT_COSMO_GRID)","text":"The COSMO grid is defined by a rotated latlon-grid.
Parameter Type Default Unit Description pollon real -170. deg longitude of the rotated north pole (in degrees, \\(E>0\\)) pollat real 32.5 deg latitude of the rotated north pole (in degrees, \\(N>0\\)) polgam real 0. deg longitude (in the rotated system) of the geographical north pole dlon real 0.08 deg grid point distance in zonal direction (in degrees) dlat real 0.08 deg grid point distance in meridional direction (in degrees) startlon_tot real -1.252 deg transformed longitude of the lower left grid point of the total domain (in degrees, \\(E>0\\)) startlat_tot real -7.972 deg transformed latitude of the lower left grid point of the total domain (in degrees, \\(N>0\\)) ie_tot integer 51 number of grid points in zonal direction je_tot integer 51 number of grid points in meridional direction ke_tot integer 0 number of grid points in vertical direction"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_orography","title":"Orography","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-oro_runcontrol-input_oro","title":"NAMELIST /oro_runcontrol/ (INPUT_ORO)","text":"Parameter Type Default Unit Description lcompute_sgsl logical .false. switch to activate subgrid-slope calculation"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-orography_raw_data-input_oro","title":"NAMELIST /orography_raw_data/ (INPUT_ORO)","text":"Parameter Type Default Unit Description itopo_type integer switch to choose an orography raw data set; 1 GLOBE, 2 ASTER, 3 MERIT/REMA lsso_param logical switch to choose if SSO parameters should be generated or not raw_data_orography_path character path to orography raw data ntiles_column integer GLOBE: 4 ASTER, MERIT/REMA: x number of tile columns of desired region ntiles_row integer GLOBE: 4 ASTER, MERIT/REMA: x number of tile rows of desired region topo_files character filenames of GLOBE (16 tiles) / ASTER (240 tiles)/ MERIT/REMA (72 tiles) raw data sets lsubtract_mean_slope logical .FALSE. for operational NWP-ICON treatment of mean slope in computation of SSO parameters for ICON"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-orography_io_extpar-input_oro","title":"NAMELIST /orography_io_extpar/ (INPUT_ORO)","text":"Parameter Type Default Unit Description orography_buffer_file character name for orography buffer file orography_output_file character name for orography output file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-sgsl_io_extpar-input_oro","title":"NAMELIST /sgsl_io_extpar/ (INPUT_ORO)","text":"Parameter Type Default Unit Description lpreproc_oro logical .false. read S_ORO from existing NetCDF (.false.) or preprocess from raw topography datasets (.true.) sgsl_files character filenames of raw data tiles to be used S_ORO_A10 to S_ORO_P10 (GLOBE) or S_ORO_T001 to S_ORO_T240"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-orography_smoothing-input_orosmooth","title":"NAMELIST /orography_smoothing/ (INPUT_OROSMOOTH)","text":"Parameter Type Default Unit Description lfilter_oro logical FALSE Cosmo-only: switch for orogaphy smoothing ilow_pass_oro integer 0 type of orogaphy smoothing and stencil width numfilt_oro integer 1 number of filter applications eps_filter real 10 smoothing parameter (\"strength\" of the filtering) ifill_valley integer 1 fill valleys before or after oro smoothing (1: before, 2: after) rfill_valley real 0 m mask for valley filling (threshold value) ilow_pass_xso integer 1 type of orogaphy eXtra SmOothing and stencil width (for steep orography) numfilt_xso integer 1 number of applications of the eXtra filter lxso_first logical FALSE eXtra SmOothing before or after orography smoothing (TRUE/FALSE) rxso_mask real 0 m mask for eXtra SmOothing (threshold value)"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-radtopo-input_radtopo","title":"NAMELIST /radtopo/ (INPUT_RADTOPO)","text":"Parameter Type Default Unit Description lradtopo logical Switch for radiation corrected topography parameters. Not recommended to use if orographical smoothing is false and smoothing is performed in Int2lm later, because of resulting inconsistencies. nhori integer 24 Number of horizon angles radius integer 40000 m Icon-only: Radial distance considered for computation of horizon min_circ_cov integer 1 - Icon-only: Number of gridcells to be skipped at circumference of circle. A value of 1 considers all points, whereas a value of 5 only consider every fifth point at the circumference. Note that the effect of this switch is dependent on the resolution of the grid as well on the radius choosen. max_missing real 0.9 - Icon-only: Upper limit for fraction of missingness for the horizon parameter. Grid-cells with values above will be set to 0. itype_scaling integer 2 - Icon-only: Power of the caling factor SIN(horizon-angle) applied to the geometric skyview factor to account for the anisotropic nature of longwave radiation."},{"location":"user_manual/user_manual_06_namelist_input/#namelist-scale_separated_raw_data-input_scale_sep","title":"NAMELIST /scale_separated_raw_data/ (INPUT_SCALE_SEP)","text":"Parameter Type Default Unit Description lscale_separation logical Switch for scale separation. It can only be used in combination with GLOBE as raw data set. raw_data_scale_sep_path character path to 3 km filtered topography scale_sep_files character filename of 3 km filtered topography"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_lu","title":"Land Use Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-lu_raw_data-input_lu","title":"NAMELIST/lu_raw_data/
(INPUT_LU)","text":"Parameter Type Default Unit Description raw_data_lu_path
character path to land use data raw_data_lu_filename
character filename of land use raw data i_landuse_data
integer switch to choose a land use raw data set: 1 Globcover2009, 2 GLC2000, 3 GLCC, 5 ESA CCI-LC, 6 Ecoclimap-SG l_use_corine
logical .false. switch to use Corine land use dataset; only possible if i_landuse_data = 1
ilookup_table_lu
integer switch to choose a lookup table: - GLC2000 and GLCC: 1: operational settings of GME (Ritter, 2007) 2: operational settings of COSMO (Heise, 2005) 3: experimental setting, analogous to lookup tables of ECOCLIMAP (Asensio 2010) - GLOBCOVER 2009: 1: operational settings (Asensio, 2011) 2: experimental settings, analogous to lookup tables of ECOCLIMAP (Asensio 2010) - ESA CCI-LC: 1: experimental settings (Helmert, 2019) - Ecoclimap-SG: 1: Globcover analogue with added LCZs from Oke ntiles_globcover
integer 6 number of tiles for GLOBCOVER data ncolumn_tiles
integer number of columns in tile matrix l_terra_urb
logical .false. switch to use TERRA-URB (see TERRA-URB); only possible if i_landuse_data = 6
"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-glcc_raw_data-input_lu","title":"NAMELIST /glcc_raw_data/
(INPUT_LU)","text":"Parameter Type Default Unit Description raw_data_glcc_path
character path to GLCC data raw_data_glcc_filename
character filename of GLCC raw data ilookup_table_glcc
integer switch to choose a lookup table: 1: operational settings of GME (Ritter, 2007) 2: operational settings of COSMO (Heise, 2005) 3: experimental setting, analogous to lookup tables of ECOCLIMAP (Asensio 2010)"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-glcc_io_extpar-input_lu","title":"NAMELIST /glcc_io_extpar/
(INPUT_LU)","text":"Parameter Type Default Unit Description glcc_buffer_file
character name for GLCC buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_aot","title":"Aerosol Optical Depth","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-aerosol_raw_data-input_aot","title":"NAMELIST /aerosol_raw_data/
(INPUT_AOT)","text":"Parameter Type Default Unit Description raw_data_aot_path
character path to aerosol raw data raw_data_aot_filename
character filename of aerosol raw data iaot_type
integer 1 index to specify AOD raw data set: 1:Tegen, 2:AeroCom, 3:MACC-II, 4:MACv2, 5:CAMS"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-aerosol_io_extpar-input_aot","title":"NAMELIST /aerosol_io_extpar/
(INPUT_AOT)","text":"Parameter Type Default Unit Description aot_buffer_file
character name for aerosol buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_cru","title":"Climatological 2m Temperature","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_tclim-namelistpy","title":"DICT input_tclim
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_t_clim_path
character path to T2m climatology data raw_data_t_clim_coarse
character filename of coarse T2m climatology data raw_data_t_clim_fine
character filename of fine T2m climatology data it_cl_type
integer switch to choose between the new and fine (1) and the old and coarse over sea and the fine over land (2) raw data set. Note that the fine data set (1) is topographically corrected. t_clim_buffer_file
character name for T_clim buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#ndvi-data","title":"NDVI Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_ndvi-namelistpy","title":"DICT input_ndvi
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_ndvi_path
character Path to NDVI raw data raw_data_ndvi_filename
character Filename of NDVI raw data ndvi_buffer_file
character Name for NDVI buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#edgar-data","title":"EDGAR Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_edgar-namelistpy","title":"DICT input_edgar
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_edgar_path
character Path to EDGAR raw data raw_data_edgar_filename_bc
character Filename of EDGAR black carbon raw data raw_data_edgar_filename_oc
character Filename of EDGAR organic carbon raw data raw_data_edgar_filename_so2
character Filename of EDGAR sulfur dioxide raw data raw_data_edgar_filename_nh3
character Filename of EDGAR ammonia raw data raw_data_edgar_filename_nox
character Filename of EDGAR nitrogen oxides raw data"},{"location":"user_manual/user_manual_06_namelist_input/#cdnc-data","title":"CDNC Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_cdnc-namelistpy","title":"DICT input_cdnc
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_cdnc_path
character Path to CDNC raw data raw_data_cdnc_filename
character Filename of CDNC raw data"},{"location":"user_manual/user_manual_06_namelist_input/#hwsdart-data","title":"hwsdART Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-hwsdart_nml-input_hwsdart","title":"NAMELIST /hwsdART_nml/
(INPUT_hwsdART
)","text":"Parameter Type Default Unit Description raw_data_hwsdART_path
character Path to hwsdART raw data raw_data_hwsdART_filename
character Filename of hwsdART raw data hwsdART_output_file
character Name for hwsdART output file"},{"location":"user_manual/user_manual_06_namelist_input/#soil-data","title":"Soil Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-soil_raw_data-input_soil","title":"NAMELIST /soil_raw_data/
(INPUT_SOIL
)","text":"Parameter Type Default Unit Description isoil_data
integer Switch to choose between raw soil data, 1: FAO, 2: HWSD, 3: HWSD with terra mapping ldeep_soil
logical Switch for deep soil, set to .TRUE.
if using HWSD data raw_data_soil_path
character Path to soil raw data raw_data_soil_filename
character Filename of soil raw data raw_data_deep_soil_filename
character Filename of deep soil raw data"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-soil_io_extpar-input_soil","title":"NAMELIST /soil_io_extpar/
(INPUT_SOIL
)","text":"Parameter Type Default Unit Description soil_buffer_file
character Name for soil buffer file soil_buffer_file_consistent
character Name for soil buffer file after consistency check soil_output_file_consistent
character Name for soil output file after consistency check"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-hwsd_index_files-input_soil","title":"NAMELIST /HWSD_index_files/
(INPUT_SOIL
)","text":"Parameter Type Default Unit Description path_HWSD_index_files
character Path to HWSD lookup tables lookup_table_HWSD
character Lookup table to convert soil type index from global to TERRA soil type HWSD_data
character Lookup table for sand, silt, clay, organic carbon, and bulk density (topsoil) HWSD_data_deep
character Lookup table for sand, silt, clay, organic carbon, and bulk density (subsoil) HWSD_data_extpar
character Parameter for development purposes"},{"location":"user_manual/user_manual_06_namelist_input/#freshwater-lake-data","title":"Freshwater Lake Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-flake_raw_data-input_flake","title":"NAMELIST /flake_raw_data/
(INPUT_FLAKE
)","text":"Parameter Type Default Unit Description raw_data_flake_path
character Path to flake raw data raw_data_flake_filename
character Filename of flake raw data"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-flake_io_extpar-input_flake","title":"NAMELIST /flake_io_extpar/
(INPUT_FLAKE
)","text":"Parameter Type Default Unit Description flake_buffer_file
character Name for flake buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#albedo-data","title":"Albedo Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_alb-namelistpy","title":"DICT input_alb
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_alb_path
character Path to raw albedo data raw_data_alb_filename
character Filename of raw albedo data raw_data_alnid_filename
character Filename of raw NIR-albedo data raw_data_aluvd_filename
character Filename of raw UV-albedo data ialb_type
integer Switch to indicate albedo type: 1: total albedo, 2: soil albedo, 3: as 1 without NI and UV fields alb_buffer_file
character Name for albedo buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_isa","title":"ISA Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_isa-namelistpy","title":"DICT input_isa
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_isa_path
character path to ISA raw data raw_data_isa_filename
character filename of ISA raw data isa_type
integer type of used ISA data source isa_buffer_file
character name for ISA buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_ahf","title":"AHF Data","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_ahf-namelistpy","title":"DICT input_ahf
(namelist.py)","text":"Parameter Type Default Unit Description raw_data_ahf_path
character path to AHF raw data raw_data_ahf_filename
character filename of AHF raw data iahf_type
integer type of used AHF data source ahf_buffer_file
character name for AHF buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_emissivity","title":"Emissivity Parameter","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_emiss-namelistpy","title":"DICT input_emiss
(namelist.py)","text":"Parameter Type Default Unit Description iemiss_type
integer switch to choose between full-range (1) and long-wave (2) emissivity data raw_data_emiss_path
character path to emissivity parameter raw data raw_data_emiss_filename
character filenames of emissivity raw data emiss_buffer_file
character name for emissivity parameter buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_era","title":"ERA Parameter","text":""},{"location":"user_manual/user_manual_06_namelist_input/#dict-input_era-namelistpy","title":"DICT input_era
(namelist.py)","text":"Parameter Type Default Unit Description iera_type
integer type of ERA climatology: ERA5 (1) and ERA-I (2) raw_data_era_path
character path to ERA raw data raw_data_era_ORO
character filenames of ERA ORO raw data raw_data_era_SD
character filenames of ERA SD raw data raw_data_era_T2M
character filenames of ERA T2M raw data raw_data_era_SST
character filenames of ERA SST raw data era_buffer_file
character name for ERA parameter buffer file"},{"location":"user_manual/user_manual_06_namelist_input/#namelist_input_for_extpar_consistency_check","title":"Consistency Check","text":""},{"location":"user_manual/user_manual_06_namelist_input/#namelist-extpar_consistency_check_io-input_check","title":"NAMELIST /extpar_consistency_check_io/
(INPUT_CHECK)","text":"Parameter Type Default Unit Description l_use_array_cache
flag F flag indicating whether mmap-caching is used (reduces memory consumption but increases runtime) netcdf_output_filename
character filename for NetCDF output i_lsm_data
integer integer switch to choose if an external land-sea mask is desired (0: no, 1: use external land-sea mask) land_sea_mask_file
character name of the file used as the external land-sea mask number_special_points
integer number of points that should be treated specially (max value: 3, choose 0 if not needed) lwrite_netcdf
logical T flag indicating whether NetCDF output for COSMO grid is desired tile_mode
integer 0 if activated (tile_mode=1
), process output for ICON tile structure lflake_correction
logical T if activated, fr_lake
values of grid points next to the ocean are set to ocean values, and the lake depth value is set to undefined (default in EXTPAR version 4.0, but not in DWD EXTPAR version 2.10)"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-special_points-input_sp_1","title":"NAMELIST /special_points/
(INPUT_SP_1)","text":"Modifications for Falkenberg.
Parameter Type Default Unit Descriptionlon_geo_sp
real 14.115 deg east longitude coordinate of the special point lat_geo_sp
real 52.156 deg north latitude coordinate of the special point soiltype_sp
real 3.0 - soil type of the special point z0_sp
real 0.03 m roughness length of the special point rootdp_sp
real 0.6 m rooting depth of the special point plcovmn_sp
real 0.55 1 plant cover minimum of the special point plcovmx_sp
real 0.8 1 plant cover maximum of the special point laimn_sp
real 0.5 1 leaf area index minimum of the special point laimx_sp
real 2.5 1 leaf area index maximum of the special point for_d_sp
real 1 ground fraction covered by deciduous forest at the special point for_e_sp
real 1 ground fraction covered by evergreen forest at the special point fr_land_sp
real 1 fraction land cover of the special point"},{"location":"user_manual/user_manual_06_namelist_input/#namelist-special_points-input_sp_2","title":"NAMELIST /special_points/
(INPUT_SP_2)","text":"Modifications for Waldstation.
Parameter Type Default Unit Descriptionlon_geo_sp
real 13.954 deg east longitude coordinate of the special point lat_geo_sp
real 52.186 deg north latitude coordinate of the special point soiltype_sp
real 3.0 - soil type of the special point z0_sp
real 0.78 m roughness length of the special point rootdp_sp
real 0.6 m rooting depth of the special point plcovmn_sp
real 0.79 1 plant cover minimum of the special point plcovmx_sp
real 0.81 1 plant cover maximum of the special point laimn_sp
real 3.0 1 leaf area index minimum of the special point laimx_sp
real 4.0 1 leaf area index maximum of the special point for_d_sp
real 1 ground fraction covered by deciduous forest at the special point for_e_sp
real 1 ground fraction covered by evergreen forest at the special point fr_land_sp
real 1 fraction land cover of the special point"}]}
\ No newline at end of file
diff --git a/sitemap.xml b/sitemap.xml
index 4e5e6e4c..a70521f8 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -2,62 +2,62 @@
/special_points/
- February 11, 2025
+ February 12, 2025
@@ -2987,7 +2987,7 @@ NAMELIST /special_points/
- February 11, 2025
+ February 12, 2025